]> git.sur5r.net Git - cc65/commitdiff
Parse the name passed to opendir().
authoruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 3 Jun 2012 15:48:32 +0000 (15:48 +0000)
committeruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 3 Jun 2012 15:48:32 +0000 (15:48 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@5678 b7a2c559-68d2-44c3-8de9-860c34a00d81

libsrc/cbm/opendir.c

index 8b2334da9e10ba7720ad94461634cc0dcd11b4ea..c23aa0d51b82ae3b35fb237caf44fad8f428f341 100644 (file)
 
 
 
-DIR* __fastcall__ opendir (const char*)
+DIR* __fastcall__ opendir (register const char* name)
 {
     unsigned char buf[32];
-    DIR* dir = 0;
     DIR d;
+    DIR* dir = 0;
 
-    /* Setup file name and offset */
+    /* Setup the actual file name that is sent to the disk. We accept "0:",
+     * "1:" and "." as directory names.
+     */
     d.name[0] = '$';
-    d.name[1] = '\0';
-    d.off     = sizeof (buf);
+    if (name == 0 || name[0] == '\0' || (name[0] == '.' && name[1] == '\0')) {
+        d.name[1] = '\0';
+    } else if ((name[0] == '0' || name[0] == '1') && name[1] == ':' && name[2] == '\0') {
+        d.name[1] = name[0];
+        d.name[2] = '\0';
+    } else {
+        errno = EINVAL;
+        goto exitpoint;
+    }
+
+    /* Set the offset of the first entry */
+    d.off = sizeof (buf);
 
     /* Open the directory on disk for reading */
     d.fd = open (d.name, O_RDONLY);
@@ -42,6 +54,7 @@ DIR* __fastcall__ opendir (const char*)
         }
     }
 
+exitpoint:
     /* Done */
     return dir;
 }