xref: /csrg-svn/lib/libc/gen/readdir.c (revision 6370)
15751Smckusick /* Copyright (c) 1982 Regents of the University of California */
25751Smckusick 
3*6370Smckusic static char sccsid[] = "@(#)readdir.c 4.3 03/30/82";
45751Smckusick 
5*6370Smckusic #include <sys/param.h>
65751Smckusick #include <ndir.h>
75751Smckusick 
85751Smckusick /*
95767Smckusic  * read an old stlye directory entry and present it as a new one
105767Smckusic  */
115872Smckusic #define	ODIRSIZ	14
125767Smckusic 
135767Smckusic struct	olddirect {
145767Smckusic 	ino_t	d_ino;
155872Smckusic 	char	d_name[ODIRSIZ];
165767Smckusic };
175767Smckusic 
185767Smckusic /*
195751Smckusick  * get next entry in a directory.
205751Smckusick  */
215751Smckusick struct direct *
225751Smckusick readdir(dirp)
235751Smckusick 	register DIR *dirp;
245751Smckusick {
255766Smckusic 	register struct olddirect *dp;
265872Smckusic 	static struct direct dir;
275751Smckusick 
285751Smckusick 	for (;;) {
295751Smckusick 		if (dirp->dd_loc == 0) {
305756Smckusic 			dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf,
315872Smckusic 			    DIRBLKSIZ);
325751Smckusick 			if (dirp->dd_size <= 0)
335751Smckusick 				return NULL;
345751Smckusick 		}
355751Smckusick 		if (dirp->dd_loc >= dirp->dd_size) {
365751Smckusick 			dirp->dd_loc = 0;
375751Smckusick 			continue;
385751Smckusick 		}
395766Smckusic 		dp = (struct olddirect *)(dirp->dd_buf + dirp->dd_loc);
405766Smckusic 		dirp->dd_loc += sizeof(struct olddirect);
415766Smckusic 		if (dp->d_ino == 0)
425766Smckusic 			continue;
435766Smckusic 		dir.d_ino = dp->d_ino;
445872Smckusic 		strncpy(dir.d_name, dp->d_name, ODIRSIZ);
456122Smckusic 		dir.d_name[ODIRSIZ] = '\0'; /* insure null termination */
465766Smckusic 		dir.d_namlen = strlen(dir.d_name);
475872Smckusic 		dir.d_reclen = DIRSIZ(&dir);
485766Smckusic 		return (&dir);
495751Smckusick 	}
505751Smckusick }
51