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