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