xref: /csrg-svn/lib/libc/gen/readdir.c (revision 5767)
15751Smckusick /* Copyright (c) 1982 Regents of the University of California */
25751Smckusick 
3*5767Smckusic static char sccsid[] = "@(#)readdir.c 1.4 02/12/82";
45751Smckusick 
55751Smckusick #include <sys/types.h>
65751Smckusick #include <ndir.h>
75751Smckusick 
85751Smckusick /*
9*5767Smckusic  * read an old stlye directory entry and present it as a new one
10*5767Smckusic  */
11*5767Smckusic #ifndef	DIRSIZ
12*5767Smckusic #define	DIRSIZ	14
13*5767Smckusic #endif
14*5767Smckusic 
15*5767Smckusic struct	olddirect {
16*5767Smckusic 	ino_t	d_ino;
17*5767Smckusic 	char	d_name[DIRSIZ];
18*5767Smckusic };
19*5767Smckusic 
20*5767Smckusic /*
215751Smckusick  * get next entry in a directory.
225751Smckusick  */
235751Smckusick struct direct *
245751Smckusick readdir(dirp)
255751Smckusick 	register DIR *dirp;
265751Smckusick {
275766Smckusic 	register struct olddirect *dp;
285766Smckusic 	static union {
295766Smckusic 		struct direct un_dir;
305766Smckusic 		char pad[MAXDIRSIZ];
315766Smckusic 	} dirun;
325766Smckusic #define dir dirun.un_dir
335751Smckusick 
345751Smckusick 	for (;;) {
355751Smckusick 		if (dirp->dd_loc == 0) {
365756Smckusic 			dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf,
375756Smckusic 			    MAXDIRSIZ);
385751Smckusick 			if (dirp->dd_size <= 0)
395751Smckusick 				return NULL;
405751Smckusick 		}
415751Smckusick 		if (dirp->dd_loc >= dirp->dd_size) {
425751Smckusick 			dirp->dd_loc = 0;
435751Smckusick 			continue;
445751Smckusick 		}
455766Smckusic 		dp = (struct olddirect *)(dirp->dd_buf + dirp->dd_loc);
465766Smckusic 		dirp->dd_loc += sizeof(struct olddirect);
475766Smckusic 		if (dp->d_ino == 0)
485766Smckusic 			continue;
495766Smckusic 		dir.d_ino = dp->d_ino;
505766Smckusic 		strncpy(dir.d_name, dp->d_name, DIRSIZ);
515766Smckusic 		dir.d_namlen = strlen(dir.d_name);
525766Smckusic 		dir.d_reclen = ((sizeof(struct direct) + dir.d_namlen)
535766Smckusic 		    + 4) & ~03;
545766Smckusic 		return (&dir);
555751Smckusick 	}
565751Smckusick }
57