#include #include #include #include #include int main (int argc, char *argv[]) { DIR * dirp; long int save3 = 0; long int cur; int i = 0; int result = 0; struct dirent *dp; off_t save0, rewind_ret; dirp = opendir ("."); if (dirp == NULL) { printf ("opendir failed: %s\n", strerror(errno)); return 1; } save0 = telldir (dirp); if (save0 == -1) { printf ("telldir failed: %s\n", strerror(errno)); result = 1; } for (dp = readdir (dirp); dp != NULL; dp = readdir (dirp)) { /* save position 3 (after fourth entry) */ if (i++ == 3) save3 = telldir (dirp); printf ("%s\n", dp->d_name); /* stop at 400 (just to make sure dirp->__offset and dirp->__size are scrambled */ if (i == 400) break; } printf ("going back past 4-th entry...\n"); /* go back to saved entry */ seekdir (dirp, save3); /* Check whether telldir equals to save3 now. */ cur = telldir (dirp); if (cur != save3) { printf ("seekdir (d, %ld); telldir (d) == %ld\n", save3, cur); result = 1; } /* print remaining files (3-last) */ for (dp = readdir (dirp); dp != NULL; dp = readdir (dirp)) printf ("%s\n", dp->d_name); /* Check rewinddir */ rewinddir (dirp); rewind_ret = telldir (dirp); if (rewind_ret == -1) { printf ("telldir failed: %s\n", strerror(errno)); result = 1; } else if (save0 != rewind_ret) { printf ("rewinddir didn't reset directory stream\n"); result = 1; } closedir (dirp); return result; }