|
|
1.1 ! root 1: /* Copyright (c) 1982 Regents of the University of California ! 2: * and modified by pjw in 1987 */ ! 3: ! 4: #include "ndir.h" ! 5: ! 6: /* ! 7: * seek to an entry in a directory. ! 8: * ! 9: * offset `told' is interpreted in a non-obvious way: ! 10: * telldir computes it as dd_offset*DIRBLKSIZ + dd_loc ! 11: * dd_loc is the byte offset into the current dd_buf contents; ! 12: * dd_offset is the number of times dirread(fd, buf, DIRBLKSIZ) ! 13: * must be called to reproduce the same buffer. ! 14: * ! 15: * Why not just use lseek? Because told isn't a seek offset, ! 16: * and cannot conveniently be turned into one: the byte count ! 17: * in dd_loc is unrelated to the seek offset required to reach ! 18: * lseek(fd, 0L, 1)+dd_loc, because the seek offset refers to the raw ! 19: * directory, but dirread has reformatted the data. ! 20: * One might let dd_offset be the seek offset to the the beginning ! 21: * of dd_buf, compute told the same way, and let seekdir become ! 22: * lseek(fd, told/DIRBLKSIZ, 0); dirp->dd_loc = told%DIRBLKSIZ; ! 23: * but a somewhat strident prior implementor worries that this unfairly ! 24: * constrains the size of directories. This is probably a silly worry ! 25: * (will any real system have directories a megabyte long?) but it ! 26: * doesn't matter much except in programs that use seekdir a lot. ! 27: */ ! 28: void ! 29: seekdir(dirp, told) ! 30: register DIR *dirp; ! 31: long told; ! 32: { long offset; ! 33: ! 34: offset = told / DIRBLKSIZ; ! 35: dirp->dd_loc = told % DIRBLKSIZ; ! 36: if (offset < dirp->dd_offset) ! 37: lseek(dirp->dd_fd, dirp->dd_offset = 0L, 0); ! 38: if(offset > dirp->dd_offset) { ! 39: do { ! 40: dirp->dd_size = dirread(dirp->dd_fd, dirp->dd_buf, ! 41: DIRBLKSIZ); ! 42: if(dirp->dd_size < 0) ! 43: dirp->dd_size = pdirread(dirp->dd_fd, ! 44: dirp->dd_buf, DIRBLKSIZ); ! 45: } ! 46: while(++dirp->dd_offset < offset); ! 47: } ! 48: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.