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
14 int openlog[2] = { 0, 0 };
15
16 #define MAXNUM 0x100000
17
18 void open_read_close(char *fname);
19
20 int nullfd;
21
main(int ac,char ** av)22 int 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
open_read_close(char * fname)65 void 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