• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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