xref: /csrg-svn/lib/libc/gen/readdir.c (revision 5766)
15751Smckusick /* Copyright (c) 1982 Regents of the University of California */
25751Smckusick 
3*5766Smckusic static char sccsid[] = "@(#)readdir.c 1.3 02/12/82";
45751Smckusick 
55751Smckusick #include <sys/types.h>
65751Smckusick #include <ndir.h>
75751Smckusick 
85751Smckusick /*
95751Smckusick  * get next entry in a directory.
105751Smckusick  */
115751Smckusick struct direct *
125751Smckusick readdir(dirp)
135751Smckusick 	register DIR *dirp;
145751Smckusick {
15*5766Smckusic 	register struct olddirect *dp;
16*5766Smckusic 	static union {
17*5766Smckusic 		struct direct un_dir;
18*5766Smckusic 		char pad[MAXDIRSIZ];
19*5766Smckusic 	} dirun;
20*5766Smckusic #define dir dirun.un_dir
215751Smckusick 
225751Smckusick 	for (;;) {
235751Smckusick 		if (dirp->dd_loc == 0) {
245756Smckusic 			dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf,
255756Smckusic 			    MAXDIRSIZ);
265751Smckusick 			if (dirp->dd_size <= 0)
275751Smckusick 				return NULL;
285751Smckusick 		}
295751Smckusick 		if (dirp->dd_loc >= dirp->dd_size) {
305751Smckusick 			dirp->dd_loc = 0;
315751Smckusick 			continue;
325751Smckusick 		}
33*5766Smckusic 		dp = (struct olddirect *)(dirp->dd_buf + dirp->dd_loc);
34*5766Smckusic 		dirp->dd_loc += sizeof(struct olddirect);
35*5766Smckusic 		if (dp->d_ino == 0)
36*5766Smckusic 			continue;
37*5766Smckusic 		dir.d_ino = dp->d_ino;
38*5766Smckusic 		strncpy(dir.d_name, dp->d_name, DIRSIZ);
39*5766Smckusic 		dir.d_namlen = strlen(dir.d_name);
40*5766Smckusic 		dir.d_reclen = ((sizeof(struct direct) + dir.d_namlen)
41*5766Smckusic 		    + 4) & ~03;
42*5766Smckusic 		return (&dir);
435751Smckusick 	}
445751Smckusick }
45