+/*
+** 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));
/* 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;
}