xref: /csrg-svn/lib/libc/gen/readdir.c (revision 13582)
1*13582Ssam #ifndef lint
2*13582Ssam static char sccsid[] = "@(#)readdir.c	4.5 (Berkeley) 07/01/83";
3*13582Ssam #endif
45751Smckusick 
56370Smckusic #include <sys/param.h>
6*13582Ssam #include <sys/dir.h>
75751Smckusick 
85751Smckusick /*
95751Smckusick  * get next entry in a directory.
105751Smckusick  */
115751Smckusick struct direct *
125751Smckusick readdir(dirp)
135751Smckusick 	register DIR *dirp;
145751Smckusick {
156712Smckusick 	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 		}
286712Smckusick 		dp = (struct direct *)(dirp->dd_buf + dirp->dd_loc);
296712Smckusick 		if (dp->d_reclen <= 0 ||
306712Smckusick 		    dp->d_reclen > DIRBLKSIZ + 1 - dirp->dd_loc)
316712Smckusick 			return NULL;
326712Smckusick 		dirp->dd_loc += dp->d_reclen;
335766Smckusic 		if (dp->d_ino == 0)
345766Smckusic 			continue;
356712Smckusick 		return (dp);
365751Smckusick 	}
375751Smckusick }
38