1f08c3bdfSopenharmony_ci/* random-del-create.c (GPL)*/
2f08c3bdfSopenharmony_ci/* Hironobu SUZUKI <hironobu@h2np.net> */
3f08c3bdfSopenharmony_ci
4f08c3bdfSopenharmony_ci#include <stdio.h>
5f08c3bdfSopenharmony_ci#include <sys/stat.h>
6f08c3bdfSopenharmony_ci#include <sys/types.h>
7f08c3bdfSopenharmony_ci#include <fcntl.h>
8f08c3bdfSopenharmony_ci#include <unistd.h>
9f08c3bdfSopenharmony_ci#include <time.h>
10f08c3bdfSopenharmony_ci#include <stdlib.h>
11f08c3bdfSopenharmony_ci#define FAIL 0
12f08c3bdfSopenharmony_ci#define SUCCESS 1
13f08c3bdfSopenharmony_ci
14f08c3bdfSopenharmony_ciint openlog[2] = { 0, 0 };
15f08c3bdfSopenharmony_ci
16f08c3bdfSopenharmony_ci#define MAXNUM 0x100000
17f08c3bdfSopenharmony_ci
18f08c3bdfSopenharmony_ci#define  MAXERROR 1024
19f08c3bdfSopenharmony_ci
20f08c3bdfSopenharmony_ciextern int box_muler(int, int);
21f08c3bdfSopenharmony_ciextern void create_or_delete(char *);
22f08c3bdfSopenharmony_ci
23f08c3bdfSopenharmony_ciint cfilecount = 0;
24f08c3bdfSopenharmony_ciint dfilecount = 0;
25f08c3bdfSopenharmony_ciint errorcount = 0;
26f08c3bdfSopenharmony_ci
27f08c3bdfSopenharmony_ciint main(int ac, char **av)
28f08c3bdfSopenharmony_ci{
29f08c3bdfSopenharmony_ci	int r;
30f08c3bdfSopenharmony_ci	char fname[1024];
31f08c3bdfSopenharmony_ci	time_t t;
32f08c3bdfSopenharmony_ci	int i;
33f08c3bdfSopenharmony_ci	int m;
34f08c3bdfSopenharmony_ci
35f08c3bdfSopenharmony_ci	if (ac != 2) {
36f08c3bdfSopenharmony_ci		printf("%s hex-style-filename \n", av[0]);
37f08c3bdfSopenharmony_ci		printf("ex) %s 00022300\n", av[0]);
38f08c3bdfSopenharmony_ci		exit(1);
39f08c3bdfSopenharmony_ci	}
40f08c3bdfSopenharmony_ci	sscanf(av[1], "%x", &m);
41f08c3bdfSopenharmony_ci	if (m < 1 || m > MAXNUM) {
42f08c3bdfSopenharmony_ci		printf("out of size %d\n", m);
43f08c3bdfSopenharmony_ci		exit(1);
44f08c3bdfSopenharmony_ci	}
45f08c3bdfSopenharmony_ci
46f08c3bdfSopenharmony_ci	time(&t);
47f08c3bdfSopenharmony_ci	srandom((unsigned int)getpid() ^
48f08c3bdfSopenharmony_ci		(((unsigned int)t << 16) | (unsigned int)t >> 16));
49f08c3bdfSopenharmony_ci
50f08c3bdfSopenharmony_ci	/* 00/00/00/00 */
51f08c3bdfSopenharmony_ci	for (i = 0; i < m; i++) {
52f08c3bdfSopenharmony_ci		r = random() % m;
53f08c3bdfSopenharmony_ci		sprintf(fname, "00/%2.2x/%2.2x/00%2.2x%2.2x%2.2x",
54f08c3bdfSopenharmony_ci			((r >> 16) & 0xFF),
55f08c3bdfSopenharmony_ci			((r >> 8) & 0xFF),
56f08c3bdfSopenharmony_ci			((r >> 16) & 0xFF), ((r >> 8) & 0xFF), (r & 0xFF));
57f08c3bdfSopenharmony_ci		create_or_delete(fname);
58f08c3bdfSopenharmony_ci	}
59f08c3bdfSopenharmony_ci	fprintf(stderr, "Total create files: %d\n", cfilecount);
60f08c3bdfSopenharmony_ci	fprintf(stderr, "Total delete files: %d\n", dfilecount);
61f08c3bdfSopenharmony_ci	fprintf(stderr, "Total error       : %d\n", errorcount);
62f08c3bdfSopenharmony_ci	exit(0);
63f08c3bdfSopenharmony_ci}
64f08c3bdfSopenharmony_ci
65f08c3bdfSopenharmony_ci#define MAXFSIZE (192*1024)
66f08c3bdfSopenharmony_ci#define AVEFSIZE (MAXFSIZE/2)
67f08c3bdfSopenharmony_ci#define POOLDISKSPACE (AVEFSIZE*128)
68f08c3bdfSopenharmony_ci
69f08c3bdfSopenharmony_cistatic int disk_space_pool = 0;
70f08c3bdfSopenharmony_civoid create_or_delete(char *fname)
71f08c3bdfSopenharmony_ci{
72f08c3bdfSopenharmony_ci	int r;
73f08c3bdfSopenharmony_ci	int fsize;
74f08c3bdfSopenharmony_ci
75f08c3bdfSopenharmony_ci	r = (random() & 1);
76f08c3bdfSopenharmony_ci	if (r && disk_space_pool > POOLDISKSPACE) {
77f08c3bdfSopenharmony_ci		/* create */
78f08c3bdfSopenharmony_ci		create_file(fname);
79f08c3bdfSopenharmony_ci	} else {
80f08c3bdfSopenharmony_ci		delete_file(fname);
81f08c3bdfSopenharmony_ci	}
82f08c3bdfSopenharmony_ci	if ((errorcount > dfilecount || errorcount > cfilecount)
83f08c3bdfSopenharmony_ci	    && (errorcount > MAXERROR)) {
84f08c3bdfSopenharmony_ci		fprintf(stderr, "too much error -- stop\n");
85f08c3bdfSopenharmony_ci		fprintf(stderr, "Total create files: %d\n", cfilecount);
86f08c3bdfSopenharmony_ci		fprintf(stderr, "Total delete files: %d\n", dfilecount);
87f08c3bdfSopenharmony_ci		fprintf(stderr, "Total error       : %d\n", errorcount);
88f08c3bdfSopenharmony_ci		exit(1);
89f08c3bdfSopenharmony_ci	}
90f08c3bdfSopenharmony_ci}
91f08c3bdfSopenharmony_ci
92f08c3bdfSopenharmony_ciint create_file(char *filename)
93f08c3bdfSopenharmony_ci{
94f08c3bdfSopenharmony_ci	int fd;
95f08c3bdfSopenharmony_ci	int randomsize;
96f08c3bdfSopenharmony_ci	char wbuf[MAXFSIZE];
97f08c3bdfSopenharmony_ci	if ((fd = creat(filename, S_IRWXU)) < 0) {
98f08c3bdfSopenharmony_ci		errorcount++;
99f08c3bdfSopenharmony_ci		return (-1);
100f08c3bdfSopenharmony_ci	}
101f08c3bdfSopenharmony_ci	if ((randomsize = box_muler(0, MAXFSIZE)) < 0) {
102f08c3bdfSopenharmony_ci		randomsize = MAXFSIZE;
103f08c3bdfSopenharmony_ci	}
104f08c3bdfSopenharmony_ci	if (write(fd, wbuf, randomsize) < 0) {
105f08c3bdfSopenharmony_ci		errorcount++;
106f08c3bdfSopenharmony_ci		close(fd);
107f08c3bdfSopenharmony_ci		return (-1);
108f08c3bdfSopenharmony_ci	}
109f08c3bdfSopenharmony_ci	cfilecount++;
110f08c3bdfSopenharmony_ci	disk_space_pool -= randomsize;
111f08c3bdfSopenharmony_ci	close(fd);
112f08c3bdfSopenharmony_ci	return 0;
113f08c3bdfSopenharmony_ci}
114f08c3bdfSopenharmony_ci
115f08c3bdfSopenharmony_ci#include <sys/stat.h>
116f08c3bdfSopenharmony_ci#include <unistd.h>
117f08c3bdfSopenharmony_ci
118f08c3bdfSopenharmony_ciint delete_file(char *filename)
119f08c3bdfSopenharmony_ci{
120f08c3bdfSopenharmony_ci	struct stat buf;
121f08c3bdfSopenharmony_ci	int st;
122f08c3bdfSopenharmony_ci	st = stat(filename, &buf);
123f08c3bdfSopenharmony_ci	if (st < 0) {
124f08c3bdfSopenharmony_ci		errorcount++;
125f08c3bdfSopenharmony_ci		return (-1);
126f08c3bdfSopenharmony_ci	}
127f08c3bdfSopenharmony_ci	disk_space_pool += buf.st_size;
128f08c3bdfSopenharmony_ci	if (unlink(filename) < 0) {
129f08c3bdfSopenharmony_ci		errorcount++;
130f08c3bdfSopenharmony_ci		return (-1);
131f08c3bdfSopenharmony_ci	}
132f08c3bdfSopenharmony_ci	dfilecount++;
133f08c3bdfSopenharmony_ci	return 0;
134f08c3bdfSopenharmony_ci}
135