opendir.c 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /*
  2. opendir -- open a directory stream
  3. last edit: 16-Jun-1987 D A Gwyn
  4. */
  5. #include <errno.h>
  6. #include <stdlib.h>
  7. #include <sys/errno.h>
  8. #include <sys/types.h>
  9. #include <sys/stat.h>
  10. #include <dirent.h>
  11. typedef void *pointer; /* (void *) if you have it */
  12. extern int _open(const char *path, int flags, int mode);
  13. extern int _close(int d);
  14. extern int _fstat(int fd, struct stat *buf);
  15. #ifndef NULL
  16. #define NULL 0
  17. #endif
  18. #ifndef O_RDONLY
  19. #define O_RDONLY 0
  20. #endif
  21. #ifndef S_ISDIR /* macro to test for directory file */
  22. #define S_ISDIR( mode ) (((mode) & S_IFMT) == S_IFDIR)
  23. #endif
  24. DIR *
  25. opendir(const char *dirname) /* name of directory */
  26. {
  27. register DIR *dirp; /* -> malloc'ed storage */
  28. register int fd; /* file descriptor for read */
  29. struct stat sbuf; /* result of fstat() */
  30. if ( (fd = _open( dirname, O_RDONLY, 0 )) < 0 )
  31. return NULL; /* errno set by open() */
  32. if ( _fstat( fd, &sbuf ) != 0 || !S_ISDIR( sbuf.st_mode ) )
  33. {
  34. (void)_close( fd );
  35. errno = ENOTDIR;
  36. return NULL; /* not a directory */
  37. }
  38. if ( (dirp = (DIR *)malloc( sizeof(DIR) )) == NULL
  39. || (dirp->dd_buf = (char *)malloc( (unsigned)DIRBUF )) == NULL
  40. ) {
  41. register int serrno = errno;
  42. /* errno set to ENOMEM by sbrk() */
  43. if ( dirp != NULL )
  44. free( (pointer)dirp );
  45. (void)_close( fd );
  46. errno = serrno;
  47. return NULL; /* not enough memory */
  48. }
  49. dirp->dd_fd = fd;
  50. dirp->dd_loc = dirp->dd_size = 0; /* refill needed */
  51. return dirp;
  52. }