seekdir.c 701 B

12345678910111213141516171819202122232425262728293031323334
  1. /* $Id$ */
  2. #include <sys/types.h>
  3. #include <sys/dir.h>
  4. /*
  5. * seek to an entry in a directory.
  6. * Only values returned by "telldir" should be passed to seekdir.
  7. */
  8. seekdir(dirp, loc)
  9. register DIR *dirp;
  10. long loc;
  11. {
  12. long curloc, base, offset;
  13. extern long telldir();
  14. extern struct direct *readdir();
  15. curloc = telldir(dirp);
  16. if (loc == curloc)
  17. return;
  18. offset = loc % dirp->dd_bsize;
  19. base = loc - offset;
  20. if (dirp->dd_loc != -1 &&
  21. (curloc - (curloc % dirp->dd_bsize)) == base) {
  22. dirp->dd_loc = offset;
  23. return;
  24. }
  25. (void) lseek(dirp->dd_fd, base, 0);
  26. dirp->dd_loc = -1;
  27. dirp->dd_size = 0;
  28. while (dirp->dd_loc < offset) {
  29. if (readdir(dirp) == (struct direct *) 0)
  30. return;
  31. }
  32. }