xref: /csrg-svn/lib/libc/gen/readdir.c (revision 5751)
1*5751Smckusick /* Copyright (c) 1982 Regents of the University of California */
2*5751Smckusick 
3*5751Smckusick static char sccsid[] = "@(#)readdir.c 1.1 02/11/82";
4*5751Smckusick 
5*5751Smckusick #include <sys/types.h>
6*5751Smckusick #include <ndir.h>
7*5751Smckusick 
8*5751Smckusick /*
9*5751Smckusick  * get next entry in a directory.
10*5751Smckusick  */
11*5751Smckusick struct direct *
12*5751Smckusick readdir(dirp)
13*5751Smckusick 	register DIR *dirp;
14*5751Smckusick {
15*5751Smckusick 	struct direct *dp;
16*5751Smckusick 
17*5751Smckusick 	for (;;) {
18*5751Smckusick 		if (dirp->dd_loc == 0) {
19*5751Smckusick 			dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf, DIRSIZ);
20*5751Smckusick 			if (dirp->dd_size <= 0)
21*5751Smckusick 				return NULL;
22*5751Smckusick 		}
23*5751Smckusick 		if (dirp->dd_loc >= dirp->dd_size) {
24*5751Smckusick 			dirp->dd_loc = 0;
25*5751Smckusick 			continue;
26*5751Smckusick 		}
27*5751Smckusick 		dp = (struct direct *)dirp->dd_buf + dirp->dd_loc;
28*5751Smckusick 		dirp->dd_loc += sizeof(struct direct);
29*5751Smckusick 		if (dp->d_ino != 0)
30*5751Smckusick 			return dp;
31*5751Smckusick 	}
32*5751Smckusick }
33