xref: /csrg-svn/lib/libc/gen/seekdir.c (revision 5947)
15752Smckusick /* Copyright (c) 1982 Regents of the University of California */
25752Smckusick 
3*5947Smckusic static char sccsid[] = "@(#)seekdir.c 4.2 02/24/82";
45752Smckusick 
55752Smckusick #include <sys/types.h>
65752Smckusick #include <ndir.h>
75752Smckusick 
85752Smckusick /*
95928Smckusic  * seek to an entry in a directory.
105928Smckusic  * Only values returned by ``telldir'' should be passed to seekdir.
115752Smckusick  */
125752Smckusick void
135928Smckusic seekdir(dirp, loc)
145928Smckusic 	register DIR *dirp;
155928Smckusic 	long loc;
165752Smckusick {
17*5947Smckusic 	long curloc, base, offset;
18*5947Smckusic 	struct direct *dp;
19*5947Smckusic 
20*5947Smckusic 	curloc = telldir(dirp);
21*5947Smckusic 	if (loc == curloc)
22*5947Smckusic 		return;
23*5947Smckusic 	base = loc & ~(DIRBLKSIZ - 1);
24*5947Smckusic 	offset = loc & (DIRBLKSIZ - 1);
25*5947Smckusic 	if ((curloc & ~(DIRBLKSIZ - 1)) == base) {
26*5947Smckusic 		dirp->dd_loc = offset;
27*5947Smckusic 		return;
28*5947Smckusic 	}
29*5947Smckusic 	lseek(dirp->dd_fd, base, 0);
30*5947Smckusic 	dirp->dd_loc = 0;
31*5947Smckusic 	while (dirp->dd_loc < offset) {
32*5947Smckusic 		dp = readdir(dirp);
33*5947Smckusic 		if (dp == NULL)
34*5947Smckusic 			return;
35*5947Smckusic 	}
365752Smckusick }
37