add Berkeley specific header; written by Sam Leffler
[unix-history] / usr / src / lib / libc / gen / seekdir.c
CommitLineData
bb0cfa24
DF
1/*
2 * Copyright (c) 1983 Regents of the University of California.
d99e6414
KB
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms are permitted
6 * provided that the above copyright notice and this paragraph are
7 * duplicated in all such forms and that any documentation,
8 * advertising materials, and other materials related to such
9 * distribution and use acknowledge that the software was developed
10 * by the University of California, Berkeley. The name of the
11 * University may not be used to endorse or promote products derived
12 * from this software without specific prior written permission.
13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
bb0cfa24
DF
16 */
17
2ce81398 18#if defined(LIBC_SCCS) && !defined(lint)
d99e6414
KB
19static char sccsid[] = "@(#)seekdir.c 5.3 (Berkeley) %G%";
20#endif /* LIBC_SCCS and not lint */
07063983 21
c4a04593 22#include <sys/param.h>
455b164d 23#include <sys/dir.h>
07063983
KM
24
25/*
67d6a82e 26 * seek to an entry in a directory.
8b57b083 27 * Only values returned by "telldir" should be passed to seekdir.
07063983
KM
28 */
29void
67d6a82e
KM
30seekdir(dirp, loc)
31 register DIR *dirp;
32 long loc;
07063983 33{
0ba12054
KM
34 long curloc, base, offset;
35 struct direct *dp;
17b5e9d0 36 extern long lseek();
0ba12054
KM
37
38 curloc = telldir(dirp);
39 if (loc == curloc)
40 return;
41 base = loc & ~(DIRBLKSIZ - 1);
42 offset = loc & (DIRBLKSIZ - 1);
17b5e9d0 43 (void) lseek(dirp->dd_fd, base, 0);
0ba12054
KM
44 dirp->dd_loc = 0;
45 while (dirp->dd_loc < offset) {
46 dp = readdir(dirp);
47 if (dp == NULL)
48 return;
49 }
07063983 50}