xref: /openbsd/regress/lib/libc/telldir/telldir.c (revision 4bdff4be)
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