/* * readdir.c: opendir/readdir/closedir */ #include #include #include #define __KLIBC_DIRENT_INTERNALS #include 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; }