readdir.c 1002 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. /*
  2. readdir -- read next entry from a directory stream
  3. last edit: 25-Apr-1987 D A Gwyn
  4. */
  5. #include <errno.h>
  6. #include <sys/errno.h>
  7. #include <sys/types.h>
  8. #include <dirent.h>
  9. /* SVR3 system call, or emulation for getdents() */
  10. extern int getdents(int fildes, char *buf, unsigned nbyte);
  11. #ifndef NULL
  12. #define NULL 0
  13. #endif
  14. struct dirent *
  15. readdir(register DIR *dirp)
  16. {
  17. register struct dirent *dp; /* -> directory data */
  18. if ( dirp == NULL || dirp->dd_buf == NULL )
  19. {
  20. errno = EFAULT;
  21. return NULL; /* invalid pointer */
  22. }
  23. do {
  24. if ( dirp->dd_loc >= dirp->dd_size ) /* empty or obsolete */
  25. dirp->dd_loc = dirp->dd_size = 0;
  26. if ( dirp->dd_size == 0 /* need to refill buffer */
  27. && (dirp->dd_size =
  28. getdents( dirp->dd_fd, dirp->dd_buf, (unsigned)DIRBUF )
  29. ) <= 0
  30. )
  31. return NULL; /* EOF or error */
  32. dp = (struct dirent *)&dirp->dd_buf[dirp->dd_loc];
  33. dirp->dd_loc += dp->d_reclen;
  34. }
  35. while ( dp->d_ino == 0L ); /* don't rely on getdents() */
  36. return dp;
  37. }