]> git.sur5r.net Git - cc65/blob - libsrc/cbm/opendir.c
cf8cfb631b645123680e65bff080c08583bf9adc
[cc65] / libsrc / cbm / opendir.c
1 #include <stdlib.h>
2 #include <string.h>
3 #include <dirent.h>
4 #include <fcntl.h>
5 #include <unistd.h>
6 #include <errno.h>
7 #include "dir.h"
8
9
10
11 DIR* __fastcall__ opendir (const char*)
12 {
13     unsigned char buffer[8+16+1+7];
14     int count;
15     DIR d;
16     DIR* dir = 0;
17
18     /* Setup file name and offset */
19     d.name[0] = '$';
20     d.name[1] = '\0';
21     d.offs    = 0;
22
23     /* Open the directory on disk for reading */
24     d.fd = open (d.name, O_RDONLY);
25     if (d.fd >= 0) {
26
27         /* Skip the disk header */
28         count = read (d.fd, buffer, sizeof (buffer));
29         if (count == sizeof (buffer)) {
30
31             /* Allocate memory for the DIR structure returned */
32             dir = malloc (sizeof (*dir));
33
34             /* Copy the contents of d */
35             if (dir) {
36                 memcpy (dir, &d, sizeof (d));
37             } else {
38                 /* Set an appropriate error code */
39                 errno = ENOMEM;
40             }
41         } else if (count >= 0) {
42             /* Short read - need to set an error code */
43             errno = EIO;
44         }
45     }
46
47     /* Done */
48     return dir;
49 }
50
51
52