from scratch; write to /dev/tty if possible, block interrupts
[unix-history] / usr / src / lib / libc / gen / seekdir.c
... / ...
CommitLineData
1/*
2 * Copyright (c) 1983 Regents of the University of California.
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.
16 */
17
18#if defined(LIBC_SCCS) && !defined(lint)
19static char sccsid[] = "@(#)seekdir.c 5.3 (Berkeley) %G%";
20#endif /* LIBC_SCCS and not lint */
21
22#include <sys/param.h>
23#include <sys/dir.h>
24
25/*
26 * seek to an entry in a directory.
27 * Only values returned by "telldir" should be passed to seekdir.
28 */
29void
30seekdir(dirp, loc)
31 register DIR *dirp;
32 long loc;
33{
34 long curloc, base, offset;
35 struct direct *dp;
36 extern long lseek();
37
38 curloc = telldir(dirp);
39 if (loc == curloc)
40 return;
41 base = loc & ~(DIRBLKSIZ - 1);
42 offset = loc & (DIRBLKSIZ - 1);
43 (void) lseek(dirp->dd_fd, base, 0);
44 dirp->dd_loc = 0;
45 while (dirp->dd_loc < offset) {
46 dp = readdir(dirp);
47 if (dp == NULL)
48 return;
49 }
50}