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