Author: marcel
Date: Thu Dec 19 05:23:10 2013
New Revision: 259590
URL: http://svnweb.freebsd.org/changeset/base/259590

Log:
  Fix readdir for the root directory on a FAT32 file system. The root
  directory is like any subdirectory and as such needs to use a real
  cluster number. To this end, keep a DE structure for the root in
  the DOS_FS structure and populate it accordingly.
  
  While here:
  o   allow consecutive path separators by skipping them all.
  o   add missing $FreeBSD$ keyword to dosfs.h.

Modified:
  head/lib/libstand/dosfs.c
  head/lib/libstand/dosfs.h

Modified: head/lib/libstand/dosfs.c
==============================================================================
--- head/lib/libstand/dosfs.c   Thu Dec 19 05:22:48 2013        (r259589)
+++ head/lib/libstand/dosfs.c   Thu Dec 19 05:23:10 2013        (r259590)
@@ -162,6 +162,14 @@ dos_mount(DOS_FS *fs, struct open_file *
         (void)dosunmount(fs);
         return(err);
     }
+    fs->root = dot[0];
+    fs->root.name[0] = ' ';
+    if (fs->fatsz == 32) {
+        fs->root.clus[0] = fs->rdcl & 0xff;
+        fs->root.clus[1] = (fs->rdcl >> 8) & 0xff;
+        fs->root.dex.h_clus[0] = (fs->rdcl >> 16) & 0xff;
+        fs->root.dex.h_clus[1] = (fs->rdcl >> 24) & 0xff;
+    }
     return 0;
 }
 
@@ -494,10 +502,12 @@ namede(DOS_FS *fs, const char *path, DOS
     int err;
 
     err = 0;
-    de = dot;
-    if (*path == '/')
-        path++;
+    de = &fs->root;
     while (*path) {
+        while (*path == '/')
+            path++;
+        if (*path == '\0')
+            break;
         if (!(s = strchr(path, '/')))
             s = strchr(path, 0);
         if ((n = s - path) > 255)
@@ -509,8 +519,6 @@ namede(DOS_FS *fs, const char *path, DOS
             return ENOTDIR;
         if ((err = lookup(fs, stclus(fs->fatsz, de), name, &de)))
             return err;
-        if (*path == '/')
-            path++;
     }
     *dep = de;
     return 0;

Modified: head/lib/libstand/dosfs.h
==============================================================================
--- head/lib/libstand/dosfs.h   Thu Dec 19 05:22:48 2013        (r259589)
+++ head/lib/libstand/dosfs.h   Thu Dec 19 05:23:10 2013        (r259590)
@@ -23,6 +23,8 @@
  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
  */
 
 #ifndef DOSIO_H
@@ -108,6 +110,7 @@ typedef struct {
     u_int lsndta;               /* start of data area */
     u_int fatsz;                /* FAT entry size */
     u_int xclus;                /* maximum cluster number */
+    DOS_DE root;
 } DOS_FS;
 
 typedef struct {
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to