9d2b23ed3b80ef45859155a496fa2ef2328eaa50
[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
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, .prev_res = 0 };
16     return &_dir;
17 }
18
19 struct dirent*
20 readdir(DIR* dir)
21 {
22     static struct dirent _dirent;
23     if (!dir) {
24         return NULL;
25     }
26
27     struct lx_dirent _lxd;
28     int more = sys_readdir(dir->dirfd, &_lxd);
29
30     _dirent.d_type = _lxd.d_type;
31     strncpy(_dirent.d_name, _lxd.d_name, 256);
32
33     if (more || dir->prev_res) {
34         dir->prev_res = more;
35         return &_dirent;
36     }
37
38     if (!dir->prev_res) {
39         return NULL;
40     }
41 }