1 /* $OpenBSD: telldir.c,v 1.4 2013/11/03 00:20:24 schwarze Exp $ */ 2 3 /* Written by Otto Moerbeek, 2006, Public domain. */ 4 5 #include <sys/types.h> 6 #include <dirent.h> 7 #include <err.h> 8 #include <limits.h> 9 #include <stdio.h> 10 #include <string.h> 11 12 #include "utils.h" 13 14 #define NFILES 1000 15 16 static void 17 longloop(DIR *dp, int i) 18 { 19 struct dirent *f; 20 char file[PATH_MAX]; 21 long pos, t, remember = -1; 22 23 rewinddir(dp); 24 snprintf(file, sizeof file, "%d", i); 25 26 /* Scan through all files, remember where file i is. */ 27 28 for (;;) { 29 pos = telldir(dp); 30 f = readdir(dp); 31 if (f == NULL) 32 break; 33 if (strcmp(file, f->d_name) == 0) 34 remember = pos; 35 } 36 if (remember == -1) 37 errx(1, "remember %s", file); 38 39 /* Go back to i, checking seekdir, telldir and readdir. */ 40 41 seekdir(dp, remember); 42 if ((t = telldir(dp)) != remember) 43 errx(1, "tell after seek %s %ld != %ld", file, t, remember); 44 if ((t = telldir(dp)) != remember) 45 errx(1, "tell after tell %s %ld != %ld", file, t, remember); 46 f = readdir(dp); 47 if (f == NULL) 48 errx(1, "readdir %s at %ld", file, remember); 49 50 if (strcmp(f->d_name, file) != 0) 51 errx(1, "name mismatch: %s != %s", f->d_name, file); 52 } 53 54 void 55 longseek(void) 56 { 57 DIR *dp; 58 int i; 59 60 createfiles(NFILES); 61 62 dp = opendir("d"); 63 if (dp == NULL) 64 err(1, "longseek: opendir"); 65 66 for (i = 0; i < NFILES; i++) 67 longloop(dp, (i + NFILES/2) % NFILES); 68 69 closedir(dp); 70 delfiles(); 71 } 72