diff options
author | Marcel Moolenaar <marcel@FreeBSD.org> | 2013-12-18 04:44:38 +0000 |
---|---|---|
committer | Marcel Moolenaar <marcel@FreeBSD.org> | 2013-12-18 04:44:38 +0000 |
commit | 157a2d49a0145a43cfa4d9116608afddf61e5ced (patch) | |
tree | 523afabd034e909448619c07b8b05be0484df366 | |
parent | 256d9417f824070f10af7b6f07cf84a0a2176ba3 (diff) |
Notes
-rw-r--r-- | lib/libstand/dosfs.c | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/lib/libstand/dosfs.c b/lib/libstand/dosfs.c index e15ecdcf6fb30..f43b7213ee7e1 100644 --- a/lib/libstand/dosfs.c +++ b/lib/libstand/dosfs.c @@ -381,21 +381,32 @@ dos_readdir(struct open_file *fd, struct dirent *d) 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; |