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