feat: closedir(2)
[lunaix-os.git] / lunaix-os / usr / libc / readdir.c
1 #include <dirent.h>
2 #include <fcntl.h>
3 #include <string.h>
4 #include <sys/lxdirent.h>
5 #include <unistd.h>
6
7 DIR*
8 opendir(const char* dir)
9 {
10     static DIR _dir;
11     int fd = open(dir, O_RDONLY);
12     if (fd < 0) {
13         return NULL;
14     }
15
16     _dir = (DIR){ .dirfd = fd };
17     return &_dir;
18 }
19
20 int
21 closedir(DIR* dirp)
22 {
23     if (!dirp || dirp->dirfd == -1) {
24         // TODO migrate the status.h
25         return -1;
26     }
27
28     int err = close(dirp->dirfd);
29
30     if (!err) {
31         dirp->dirfd = -1;
32         return 0;
33     }
34
35     return -1;
36 }
37
38 struct dirent*
39 readdir(DIR* dir)
40 {
41     static struct dirent _dirent;
42     if (!dir) {
43         return NULL;
44     }
45
46     struct lx_dirent* _lxd = &dir->_lxd;
47
48     int more = sys_readdir(dir->dirfd, _lxd);
49
50     _dirent.d_type = _lxd->d_type;
51     strncpy(_dirent.d_name, _lxd->d_name, 256);
52
53     if (more) {
54         return &_dirent;
55     }
56
57     return NULL;
58 }