1 /* $OpenBSD: telldir.c,v 1.2 2006/04/01 18:24:53 otto Exp $ */ 2 3 /* Written by Otto Moerbeek, 2006, Public domain. */ 4 5 #include <sys/types.h> 6 #include <sys/stat.h> 7 #include <dirent.h> 8 #include <err.h> 9 #include <limits.h> 10 #include <fcntl.h> 11 #include <stdio.h> 12 #include <string.h> 13 #include <unistd.h> 14 15 16 #define NFILES 1000 17 18 void 19 createfiles(void) 20 { 21 int i, fd; 22 char file[PATH_MAX]; 23 24 mkdir("d", 0755); 25 for (i = 0; i < NFILES; i++) { 26 snprintf(file, sizeof file, "d/%d", i); 27 if ((fd = open(file, O_CREAT | O_WRONLY, 0600)) == -1) 28 err(1, "open %s", file); 29 close(fd); 30 } 31 } 32 33 void 34 delfiles(void) 35 { 36 DIR *dp; 37 struct dirent *f; 38 char file[PATH_MAX]; 39 40 dp = opendir("d"); 41 if (dp == NULL) 42 err(1, "opendir"); 43 while (f = readdir(dp)) { 44 if (strcmp(f->d_name, ".") == 0 || 45 strcmp(f->d_name, "..") == 0) 46 continue; 47 snprintf(file, sizeof file, "d/%s", f->d_name); 48 if (unlink(file) == -1) 49 err(1, "unlink %s", f->d_name); 50 } 51 closedir(dp); 52 if (rmdir("d") == -1) 53 err(1, "rmdir"); 54 } 55 56 void 57 loop(DIR *dp, int i) 58 { 59 struct dirent *f; 60 char file[PATH_MAX]; 61 long pos, remember = -1; 62 63 rewinddir(dp); 64 snprintf(file, sizeof file, "%d", i); 65 for (;;) { 66 pos = telldir(dp); 67 f = readdir(dp); 68 if (f == NULL) 69 break; 70 if (strcmp(file, f->d_name) == 0) 71 remember = pos; 72 } 73 if (remember == -1) 74 errx(1, "remember"); 75 seekdir(dp, remember); 76 if (telldir(dp) != remember) 77 errx(1, "tell after seek"); 78 if (telldir(dp) != remember) 79 errx(1, "tell after tell"); 80 f = readdir(dp); 81 if (f == NULL) 82 err(1, "seek to %s %ld", file, remember); 83 84 if (strcmp(f->d_name, file) != 0) 85 err(1, "name mismatch: %s != %s\n", f->d_name, file); 86 } 87 88 int 89 main(void) 90 { 91 DIR *dp; 92 int i; 93 94 createfiles(); 95 96 dp = opendir("d"); 97 if (dp == NULL) 98 err(1, "opendir"); 99 100 for (i = 0; i < NFILES; i++) 101 loop(dp, (i + NFILES/2) % NFILES); 102 103 closedir(dp); 104 delfiles(); 105 return 0; 106 } 107