xref: /csrg-svn/lib/libc/gen/readdir.c (revision 6712)
15751Smckusick /* Copyright (c) 1982 Regents of the University of California */
25751Smckusick 
3*6712Smckusick static char sccsid[] = "@(#)readdir.c 4.4 05/07/82";
45751Smckusick 
56370Smckusic #include <sys/param.h>
6*6712Smckusick #include <dir.h>
75751Smckusick 
85751Smckusick /*
95751Smckusick  * get next entry in a directory.
105751Smckusick  */
115751Smckusick struct direct *
125751Smckusick readdir(dirp)
135751Smckusick 	register DIR *dirp;
145751Smckusick {
15*6712Smckusick 	register struct direct *dp;
165751Smckusick 
175751Smckusick 	for (;;) {
185751Smckusick 		if (dirp->dd_loc == 0) {
195756Smckusic 			dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf,
205872Smckusic 			    DIRBLKSIZ);
215751Smckusick 			if (dirp->dd_size <= 0)
225751Smckusick 				return NULL;
235751Smckusick 		}
245751Smckusick 		if (dirp->dd_loc >= dirp->dd_size) {
255751Smckusick 			dirp->dd_loc = 0;
265751Smckusick 			continue;
275751Smckusick 		}
28*6712Smckusick 		dp = (struct direct *)(dirp->dd_buf + dirp->dd_loc);
29*6712Smckusick 		if (dp->d_reclen <= 0 ||
30*6712Smckusick 		    dp->d_reclen > DIRBLKSIZ + 1 - dirp->dd_loc)
31*6712Smckusick 			return NULL;
32*6712Smckusick 		dirp->dd_loc += dp->d_reclen;
335766Smckusic 		if (dp->d_ino == 0)
345766Smckusic 			continue;
35*6712Smckusick 		return (dp);
365751Smckusick 	}
375751Smckusick }
38