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