]> git.sur5r.net Git - cc65/blobdiff - libsrc/cbm/opendir.c
Merge remote-tracking branch 'upstream/master'
[cc65] / libsrc / cbm / opendir.c
index cf8cfb631b645123680e65bff080c08583bf9adc..fe7fecb20a942e8fa2ff69c369267e9efef7fa11 100644 (file)
@@ -1,6 +1,9 @@
+/*
+ * Ullrich von Bassewitz, 2012-05-30. Based on code by Groepaz.
+ */
+
 #include <stdlib.h>
 #include <string.h>
-#include <dirent.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <errno.h>
 
 
 
-DIR* __fastcall__ opendir (const char*)
+DIR* __fastcall__ opendir (register const char* name)
 {
-    unsigned char buffer[8+16+1+7];
-    int count;
-    DIR d;
+    unsigned char buf[2];
     DIR* dir = 0;
+    DIR d;
 
-    /* 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.offs    = 0;
+    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);
     if (d.fd >= 0) {
 
-        /* Skip the disk header */
-        count = read (d.fd, buffer, sizeof (buffer));
-        if (count == sizeof (buffer)) {
+        /* Skip the load address */         
+        if (_dirread (&d, buf, sizeof (buf))) {
 
             /* Allocate memory for the DIR structure returned */
             dir = malloc (sizeof (*dir));
@@ -38,12 +51,10 @@ DIR* __fastcall__ opendir (const char*)
                 /* Set an appropriate error code */
                 errno = ENOMEM;
             }
-        } else if (count >= 0) {
-            /* Short read - need to set an error code */
-            errno = EIO;
         }
     }
 
+exitpoint:
     /* Done */
     return dir;
 }