home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume9 / gwyn-dir-lib / opendir.c < prev    next >
C/C++ Source or Header  |  1987-04-30  |  1KB  |  73 lines

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