home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume9 / gwyn-dir-lib / readdir.c < prev    next >
Encoding:
C/C++ Source or Header  |  1987-04-30  |  991 b   |  49 lines

  1. /*
  2.     readdir -- read next entry from 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    <dirent.h>
  10.  
  11. extern int    getdents();        /* SVR3 system call, or emulation */
  12.  
  13. extern int    errno;
  14.  
  15. #ifndef NULL
  16. #define    NULL    0
  17. #endif
  18.  
  19. struct dirent *
  20. readdir( dirp )
  21.     register DIR        *dirp;    /* stream from opendir() */
  22.     {
  23.     register struct dirent    *dp;    /* -> directory data */
  24.  
  25.     if ( dirp == NULL || dirp->dd_buf == NULL )
  26.         {
  27.         errno = EFAULT;
  28.         return NULL;        /* invalid pointer */
  29.         }
  30.  
  31.     do    {
  32.         if ( dirp->dd_loc >= dirp->dd_size )    /* empty or obsolete */
  33.             dirp->dd_loc = dirp->dd_size = 0;
  34.  
  35.         if ( dirp->dd_size == 0    /* need to refill buffer */
  36.           && (dirp->dd_size =
  37.             getdents( dirp->dd_fd, dirp->dd_buf, (unsigned)DIRBUF )
  38.              ) <= 0
  39.            )
  40.             return NULL;    /* EOF or error */
  41.  
  42.         dp = (struct dirent *)&dirp->dd_buf[dirp->dd_loc];
  43.         dirp->dd_loc += dp->d_reclen;
  44.         }
  45.     while ( dp->d_ino == 0L );    /* don't rely on getdents() */
  46.  
  47.     return dp;
  48.     }
  49.