1218887Sdim/* $OpenBSD: telldir.c,v 1.4 2013/11/03 00:20:24 schwarze Exp $ */ 2218887Sdim 3218887Sdim/* Written by Otto Moerbeek, 2006, Public domain. */ 4218887Sdim 5218887Sdim#include <sys/types.h> 6218887Sdim#include <dirent.h> 7218887Sdim#include <err.h> 8218887Sdim#include <limits.h> 9218887Sdim#include <stdio.h> 10218887Sdim#include <string.h> 11218887Sdim 12218887Sdim#include "utils.h" 13218887Sdim 14218887Sdim#define NFILES 1000 15249423Sdim 16226633Sdimstatic void 17226633Sdimlongloop(DIR *dp, int i) 18249423Sdim{ 19221345Sdim struct dirent *f; 20226633Sdim char file[PATH_MAX]; 21234353Sdim long pos, t, remember = -1; 22226633Sdim 23218887Sdim rewinddir(dp); 24218887Sdim snprintf(file, sizeof file, "%d", i); 25218887Sdim 26218887Sdim /* Scan through all files, remember where file i is. */ 27218887Sdim 28218887Sdim for (;;) { 29226633Sdim pos = telldir(dp); 30218887Sdim f = readdir(dp); 31218887Sdim if (f == NULL) 32218887Sdim break; 33218887Sdim if (strcmp(file, f->d_name) == 0) 34239462Sdim remember = pos; 35218887Sdim } 36218887Sdim if (remember == -1) 37218887Sdim errx(1, "remember %s", file); 38218887Sdim 39234353Sdim /* Go back to i, checking seekdir, telldir and readdir. */ 40234353Sdim 41234353Sdim seekdir(dp, remember); 42234353Sdim if ((t = telldir(dp)) != remember) 43234353Sdim errx(1, "tell after seek %s %ld != %ld", file, t, remember); 44234353Sdim if ((t = telldir(dp)) != remember) 45234353Sdim errx(1, "tell after tell %s %ld != %ld", file, t, remember); 46234353Sdim f = readdir(dp); 47234353Sdim if (f == NULL) 48234353Sdim errx(1, "readdir %s at %ld", file, remember); 49234353Sdim 50234353Sdim if (strcmp(f->d_name, file) != 0) 51218887Sdim errx(1, "name mismatch: %s != %s", f->d_name, file); 52218887Sdim} 53234353Sdim 54218887Sdimvoid 55218887Sdimlongseek(void) 56218887Sdim{ 57218887Sdim DIR *dp; 58234353Sdim int i; 59218887Sdim 60218887Sdim createfiles(NFILES); 61234353Sdim 62234353Sdim dp = opendir("d"); 63226633Sdim if (dp == NULL) 64234353Sdim err(1, "longseek: opendir"); 65234353Sdim 66218887Sdim for (i = 0; i < NFILES; i++) 67218887Sdim longloop(dp, (i + NFILES/2) % NFILES); 68218887Sdim 69218887Sdim closedir(dp); 70218887Sdim delfiles(); 71218887Sdim} 72218887Sdim