X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libsrc%2Fcbm%2Fopendir.c;h=fe7fecb20a942e8fa2ff69c369267e9efef7fa11;hb=6a92d8b987ef98b97fced19533573c9e74b208a9;hp=569c4918a34c975446af369262cf69e4b7d26706;hpb=a83bf3dc04fad6674218aeca24f0cb84a58d41eb;p=cc65 diff --git a/libsrc/cbm/opendir.c b/libsrc/cbm/opendir.c index 569c4918a..fe7fecb20 100644 --- a/libsrc/cbm/opendir.c +++ b/libsrc/cbm/opendir.c @@ -4,7 +4,6 @@ #include #include -#include #include #include #include @@ -12,23 +11,35 @@ -DIR* __fastcall__ opendir (const char*) -{ - unsigned char buf[32]; +DIR* __fastcall__ opendir (register const char* name) +{ + 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.off = 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 */ - if (_dirread (&d, buf, 32)) { + /* Skip the load address */ + if (_dirread (&d, buf, sizeof (buf))) { /* Allocate memory for the DIR structure returned */ dir = malloc (sizeof (*dir)); @@ -43,6 +54,7 @@ DIR* __fastcall__ opendir (const char*) } } +exitpoint: /* Done */ return dir; }