dir.c 800 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #include <unistd.h>
  2. #include <fcntl.h>
  3. #include <string.h>
  4. #include <syscall.h>
  5. #include <errno.h>
  6. #include <bits/dirent.h>
  7. DIR * opendir (const char * dirname) {
  8. int fd = open(dirname, O_RDONLY);
  9. if (fd < 0) {
  10. errno = -fd;
  11. return NULL;
  12. }
  13. DIR * dir = (DIR *)malloc(sizeof(DIR));
  14. dir->fd = fd;
  15. dir->cur_entry = -1;
  16. return dir;
  17. }
  18. int closedir (DIR * dir) {
  19. if (dir && (dir->fd != -1)) {
  20. return close(dir->fd);
  21. } else {
  22. return -EBADF;
  23. }
  24. }
  25. struct dirent * readdir (DIR * dirp) {
  26. static struct dirent ent;
  27. int ret = syscall_readdir(dirp->fd, ++dirp->cur_entry, &ent);
  28. if (ret < 0) {
  29. errno = -ret;
  30. memset(&ent, 0, sizeof(struct dirent));
  31. return NULL;
  32. }
  33. if (ret == 0) {
  34. /* end of directory */
  35. memset(&ent, 0, sizeof(struct dirent));
  36. return NULL;
  37. }
  38. return &ent;
  39. }