svn commit: r259539 - head/lib/libstand

Marcel Moolenaar marcel at FreeBSD.org
Wed Dec 18 04:44:39 UTC 2013


Author: marcel
Date: Wed Dec 18 04:44:38 2013
New Revision: 259539
URL: http://svnweb.freebsd.org/changeset/base/259539

Log:
  Support long filenames.
  
  Obtained from:	Juniper Networks, Inc.

Modified:
  head/lib/libstand/dosfs.c

Modified: head/lib/libstand/dosfs.c
==============================================================================
--- head/lib/libstand/dosfs.c	Wed Dec 18 04:36:35 2013	(r259538)
+++ head/lib/libstand/dosfs.c	Wed Dec 18 04:44:38 2013	(r259539)
@@ -381,21 +381,32 @@ dos_readdir(struct open_file *fd, struct
 	if (dd.de.name[0] == 0xe5)
 	    continue;
 
-	/* Skip volume labels */
-	if (dd.de.attr & FA_LABEL)
-	    continue;
-
-	if ((dd.de.attr & FA_MASK) == FA_XDE) {
-	    if (dd.xde.seq & 0x40)
-		chk = dd.xde.chk;
-	    else if (dd.xde.seq != xdn - 1 || dd.xde.chk != chk)
-		continue;
-	    x = dd.xde.seq & ~0x40;
-	    if (x < 1 || x > 20) {
-		x = 0;
+	/* Check if directory entry is volume label */
+	if (dd.de.attr & FA_LABEL) {
+	    /* 
+	     * If volume label set, check if the current entry is
+	     * extended entry (FA_XDE) for long file names.
+	     */
+	    if ((dd.de.attr & FA_MASK) == FA_XDE) {
+		/*
+		 * Read through all following extended entries
+		 * to get the long file name. 0x40 marks the
+		 * last entry containing part of long file name.
+		 */
+		if (dd.xde.seq & 0x40)
+		    chk = dd.xde.chk;
+		else if (dd.xde.seq != xdn - 1 || dd.xde.chk != chk)
+		    continue;
+		x = dd.xde.seq & ~0x40;
+		if (x < 1 || x > 20) {
+		    x = 0;
+		    continue;
+		}
+		cp_xdnm(fn, &dd.xde);
+	    } else {
+		/* skip only volume label entries */
 		continue;
 	    }
-	    cp_xdnm(fn, &dd.xde);
 	} else {
 	    if (xdn == 1) {
 		x = 0;


More information about the svn-src-head mailing list