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