| /* |
| * readdir.c: opendir/readdir/closedir |
| */ |
| |
| #include <unistd.h> |
| #include <fcntl.h> |
| #include <stdlib.h> |
| |
| #define __KLIBC_DIRENT_INTERNALS |
| #include <dirent.h> |
| |
| DIR *opendir(const char *name) |
| { |
| DIR *dp = malloc(sizeof(DIR)); |
| |
| if ( !dp ) |
| return NULL; |
| |
| dp->__fd = open(name, O_DIRECTORY|O_RDONLY); |
| |
| if ( dp->__fd < 0 ) { |
| free(dp); |
| return NULL; |
| } |
| |
| dp->bytes_left = 0; |
| |
| return dp; |
| } |
| |
| struct dirent *readdir(DIR *dir) |
| { |
| struct dirent *dent; |
| int rv; |
| |
| if ( !dir->bytes_left ) { |
| rv = getdents(dir->__fd, dir->buffer, sizeof(dir->buffer)); |
| if ( rv <= 0 ) |
| return NULL; |
| dir->bytes_left = rv; |
| dir->next = dir->buffer; |
| } |
| |
| dent = dir->next; |
| dir->next = (struct dirent *)((char *)dir->next + dent->d_reclen); |
| dir->bytes_left -= dent->d_reclen; |
| |
| return dent; |
| } |
| |
| int closedir(DIR *dir) |
| { |
| int rv; |
| rv = close(dir->__fd); |
| free(dir); |
| return rv; |
| } |