X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libsrc%2Fcbm%2Fopendir.c;h=fe7fecb20a942e8fa2ff69c369267e9efef7fa11;hb=6a92d8b987ef98b97fced19533573c9e74b208a9;hp=8b2334da9e10ba7720ad94461634cc0dcd11b4ea;hpb=55463bbf91e41d319ffc176f62ca5d90738ecbb7;p=cc65 diff --git a/libsrc/cbm/opendir.c b/libsrc/cbm/opendir.c index 8b2334da9..fe7fecb20 100644 --- a/libsrc/cbm/opendir.c +++ b/libsrc/cbm/opendir.c @@ -11,23 +11,35 @@ -DIR* __fastcall__ opendir (const char*) +DIR* __fastcall__ opendir (register const char* name) { - unsigned char buf[32]; + 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 = 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); 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)); @@ -42,6 +54,7 @@ DIR* __fastcall__ opendir (const char*) } } +exitpoint: /* Done */ return dir; }