stdlib: call __neatlibc_exit() in exit()
[neatlibc.git] / dirent.c
blob843840cfc3c1a18402d83ec5177d74704ba7dd2e
1 #include <dirent.h>
2 #include <fcntl.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include <sys/stat.h>
7 struct __dirent_dir {
8 int fd;
9 int buf_pos;
10 int buf_end;
11 char buf[2048];
14 DIR *opendir(char *path)
16 DIR *dir;
17 int fd;
18 if ((fd = open(path, O_RDONLY | O_DIRECTORY)) < 0)
19 return NULL;
20 fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
21 if (!(dir = malloc(sizeof(*dir)))) {
22 close(fd);
23 return NULL;
25 memset(dir, 0, sizeof(*dir));
26 dir->fd = fd;
27 return dir;
30 int closedir(DIR *dir)
32 int ret;
33 ret = close(dir->fd);
34 free(dir);
35 return ret;
38 int getdents(int fd, struct dirent *de, size_t len);
40 struct dirent *readdir(DIR *dir)
42 struct dirent *de;
43 int len;
44 if (dir->buf_pos >= dir->buf_end) {
45 len = getdents(dir->fd, (void *) dir->buf, sizeof(dir->buf));
46 if (len <= 0)
47 return NULL;
48 dir->buf_pos = 0;
49 dir->buf_end = len;
51 de = (void *) (dir->buf + dir->buf_pos);
52 dir->buf_pos += de->d_reclen;
53 return de;