/* ** 2012-06-03, Ullrich von Bassewitz. Based on code by Groepaz. ** 2014-07-16, Greg King */ #include #include #include #include "dir.h" void __fastcall__ seekdir (register DIR* dir, long offs) { unsigned o; unsigned char count; unsigned char buf[128]; /* Make sure that we have a reasonable value for offs. We reject ** negative numbers by converting them to (very high) unsigned values. */ if ((unsigned long)offs > 0x1000uL) { errno = EINVAL; return; } /* Close the directory file descriptor */ close (dir->fd); /* Reopen it using the old name */ dir->fd = open (dir->name, O_RDONLY); if (dir->fd < 0) { /* Oops! */ return; } /* Skip until we've reached the target offset in the directory */ o = dir->off = (unsigned)offs; while (o) { /* Determine size of next chunk to read */ if (o > sizeof (buf)) { count = sizeof (buf); o -= sizeof (buf); } else { count = (unsigned char)o; o = 0; } /* Skip */ if (!_dirread (dir, buf, count)) { return; } } }