xref: /original-bsd/lib/libc/gen/seekdir.c (revision 62734ea8)
1 /* Copyright (c) 1982 Regents of the University of California */
2 
3 static char sccsid[] = "@(#)seekdir.c 4.7 11/14/82";
4 
5 #include <sys/param.h>
6 #include <dir.h>
7 
8 /*
9  * seek to an entry in a directory.
10  * Only values returned by ``telldir'' should be passed to seekdir.
11  */
12 void
13 seekdir(dirp, loc)
14 	register DIR *dirp;
15 	long loc;
16 {
17 	long curloc, base, offset;
18 	struct direct *dp;
19 
20 	curloc = telldir(dirp);
21 	if (loc == curloc)
22 		return;
23 	base = loc & ~(DIRBLKSIZ - 1);
24 	offset = loc & (DIRBLKSIZ - 1);
25 	if (dirp->dd_loc != 0 && (curloc & ~(DIRBLKSIZ - 1)) == base) {
26 		dirp->dd_loc = offset;
27 		return;
28 	}
29 	lseek(dirp->dd_fd, base, 0);
30 	dirp->dd_loc = 0;
31 	while (dirp->dd_loc < offset) {
32 		dp = readdir(dirp);
33 		if (dp == NULL)
34 			return;
35 	}
36 }
37