Advertisement
Guest User

Untitled

a guest
Sep 22nd, 2022
27
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.95 KB | None | 0 0
  1. #include <errno.h>
  2. #include <fcntl.h>
  3. #include <limits.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <time.h>
  8. #ifndef WIN32
  9. #include <unistd.h>
  10. #include <getopt.h>
  11. #else
  12. #include <io.h>
  13. #include "win/getopt/getopt.h"
  14. #endif
  15.  
  16. #define MAX_FNAME 128
  17.  
  18. struct flist {
  19. char filename[MAX_FNAME];
  20. struct flist *next;
  21. };
  22.  
  23. static int add_flist(struct flist **f, const char *filename)
  24. {
  25. struct flist *p, *c;
  26. c = malloc(sizeof(*c));
  27. if (!c)
  28. return -1;
  29. strcpy(c->filename, filename);
  30. c->next = NULL;
  31. if (!(*f)) {
  32. *f = c;
  33. return 0;
  34. }
  35. for (p=*f;p->next;p=p->next)
  36. ;
  37. p->next = c;
  38. return 0;
  39. }
  40.  
  41. struct option longopts[] = {
  42. { "minsize", required_argument, 0, 'm' },
  43. { "maxsize", required_argument, 0, 'M' },
  44. { "maxfiles", required_argument, 0, 'f' },
  45. { "seed", required_argument, 0, 's' },
  46. { NULL, 0, 0, 0 }
  47. };
  48.  
  49. #define DEFAULT_MINSIZE 0
  50. #define DEFAULT_MAXSIZE (128 * 1024)
  51.  
  52. int main(int argc, char **argv)
  53. {
  54. struct flist *f = NULL, *p, *prev;
  55. char *buffer;
  56. int c, count;
  57. int i;
  58. int err;
  59.  
  60. int minsize = DEFAULT_MINSIZE, maxsize = DEFAULT_MAXSIZE, maxfiles = 0;
  61. int seed = time(0)|1;
  62.  
  63. while ((c = getopt_long(argc, argv, "f:s:m:M:", longopts, NULL)) != EOF) {
  64. switch (c) {
  65. case 'm' : minsize = strtol(optarg,0,0); break;
  66. case 'M' : maxsize = strtol(optarg,0,0); break;
  67. case 's' : seed = strtol(optarg,0,0); break;
  68. case 'f' : maxfiles = strtol(optarg,0,0); break;
  69. case '?' :
  70. printf("arguments:\n"
  71. " --minsize|-m <bytes> -- minimum file size to create (default %d)\n"
  72. " --maxsize|-M <bytes> -- maximum file size to create (default %d)\n"
  73. " --maxfiles|-f <files> -- limit the maximum number of files to create\n"
  74. " --seed|-s <value> -- random number seed to use\n",
  75. DEFAULT_MINSIZE, DEFAULT_MAXSIZE);
  76. return 1;
  77. }
  78. }
  79.  
  80. if (optind != argc) {
  81. printf("Extra arguments found. Aborting.\n");
  82. return 1;
  83. }
  84.  
  85. if (maxsize < minsize) {
  86. printf("Maximum file size (0x%x) < Minimum file size (0x%x)!\n",
  87. maxsize, minsize);
  88. return 1;
  89. }
  90.  
  91. buffer = calloc(maxsize, 1);
  92. if (!buffer) {
  93. printf("Out of memory allocating write buffer\n");
  94. return 1;
  95. }
  96.  
  97. srand(seed);
  98.  
  99. printf("Seed = 0x%x, minsize = %d, maxsize = %d, ",
  100. seed, minsize, maxsize);
  101. if (maxfiles)
  102. printf("maxfiles = %d\n", maxfiles);
  103. else
  104. printf("no maxfiles\n");
  105.  
  106. while(1) {
  107.  
  108. printf("Creating files\n");
  109. count = 0;
  110. while ((maxfiles == 0) || (count < maxfiles)) {
  111. char fname[MAX_FNAME];
  112. int fd;
  113. int size;
  114.  
  115. sprintf(fname, "f%8.8x.%8.8x", rand(), rand());
  116. fd = open(fname, O_RDWR | O_CREAT, 0666);
  117. if (fd < 0)
  118. break;
  119. printf("Created file '%s'\n", fname);
  120. #ifdef WIN32
  121. size = (((int)rand() + ((int)rand() << 16)) % (maxsize - minsize + 1)) + minsize;
  122. #else
  123. size = rand() % (maxsize - minsize + 1) + minsize;
  124. #endif
  125. for(i=0; i<size; i++) {
  126. if((rand() % 100) >= 75) buffer[i] = rand();
  127. else buffer[i] = 0;
  128. }
  129. err = write(fd, buffer, size);
  130. close(fd);
  131. if(err < 0) {
  132. printf("err writing to file, unlinking it\n");
  133. unlink(fname);
  134. break;
  135. }
  136.  
  137. if (add_flist(&f, fname) < 0) {
  138. printf("Error adding filename to list (Out of memory?)\n");
  139. return 1;
  140. }
  141.  
  142. if ((++count % 100) == 0) {
  143. printf("%d files created\r", count); fflush(stdout);
  144. }
  145. }
  146.  
  147. printf("%d files created. Deleting 50%% of files.\n", count);
  148.  
  149. prev = NULL;
  150. p = f;
  151. count = 0;
  152. while (p) {
  153. if((rand() % 100) >= 50) {
  154. unlink(p->filename);
  155. printf("Unlinked file '%s'\n", p->filename);
  156. if ((++count % 100) == 0) {
  157. printf("%d files deleted\r", count); fflush(stdout);
  158. }
  159. if(prev == NULL) {
  160. f = p->next;
  161. free(p);
  162. p = f;
  163. } else {
  164. prev->next = p->next;
  165. free(p);
  166. p = prev->next;
  167. }
  168. } else {
  169. prev = p;
  170. p = p->next;
  171. }
  172. }
  173. }
  174.  
  175. free(buffer);
  176.  
  177. printf("done\n");
  178.  
  179. return 0;
  180. }
  181.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement