1/* random-access.c (GPL)*/
2/* Hironobu SUZUKI <hironobu@h2np.net> */
3#include <stdio.h>
4#include <errno.h>
5#include <sys/stat.h>
6#include <sys/types.h>
7#include <fcntl.h>
8#include <unistd.h>
9#include <time.h>
10#include <stdlib.h>
11#define FAIL 0
12#define SUCCESS 1
13
14int openlog[2] = { 0, 0 };
15
16#define MAXNUM 0x100000
17
18void open_read_close(char *fname);
19
20int nullfd;
21
22int main(int ac, char **av)
23{
24	int r;
25	char fname[1024];
26	time_t t;
27	int i;
28	int m;
29
30	if (ac != 2) {
31		printf("%s hex-style-filename \n", av[0]);
32		printf("ex) %s 00022300\n", av[0]);
33		exit(1);
34	}
35	sscanf(av[1], "%x", &m);
36	if (m < 1 || m > MAXNUM) {
37		printf("out of size %d\n", m);
38		exit(1);
39	}
40
41	time(&t);
42	srandom((unsigned int)getpid() ^
43		(((unsigned int)t << 16) | (unsigned int)t >> 16));
44
45	if ((nullfd = open("/dev/null", O_WRONLY)) < 0) {
46		perror("/dev/null");
47		exit(1);
48	}
49
50	/* 00/00/00/00 */
51	for (i = 0; i < m; i++) {
52		r = random() % m;
53		sprintf(fname, "00/%2.2x/%2.2x/00%2.2x%2.2x%2.2x",
54			((r >> 16) & 0xFF),
55			((r >> 8) & 0xFF),
56			((r >> 16) & 0xFF), ((r >> 8) & 0xFF), (r & 0xFF));
57		open_read_close(fname);
58	}
59	close(nullfd);
60	printf("Success:\t%d\nFail:\t%d\n", openlog[SUCCESS], openlog[FAIL]);
61	exit(0);
62}
63
64#define BUFS 8192
65void open_read_close(char *fname)
66{
67	int fd;
68	char buf[BUFS];
69	int c;
70
71	if ((fd = open(fname, O_RDONLY)) < 0) {
72		openlog[FAIL]++;
73		close(fd);
74		return;
75	}
76	openlog[SUCCESS]++;
77	while ((c = read(fd, buf, BUFS)) > 0) {
78		if (write(nullfd, buf, c) < 0) {
79			perror("/dev/null");
80			printf("Opened\t %d\nUnopend:\t%d\n", openlog[SUCCESS],
81			       openlog[FAIL]);
82			exit(1);
83		}
84	}
85	if (c < 0) {
86		perror(fname);
87		printf("Opened\t %d\nUnopend:\t%d\n", openlog[SUCCESS],
88		       openlog[FAIL]);
89		exit(1);
90	}
91	close(fd);
92}
93