// $Id: filler.c 2445 2007-04-20 01:07:22Z flaterco $ // Data source for overwriting a disk. // gcc -Wall -Wextra -O2 -static -s -o filler filler.c #define __STDC_FORMAT_MACROS #include #include #include #include #include #include void usage () { fprintf (stderr, "Usage: filler [0|1|F0|0F|R]\n"); fprintf (stderr, " 0 = generate zeros\n"); fprintf (stderr, " 1 = generate ones\n"); fprintf (stderr, " F0 = generate character F0\n"); fprintf (stderr, " 0F = generate character 0F\n"); fprintf (stderr, " R = generate cheap pseudorandom bits\n"); exit (-1); } uint32_t pseudorand () { // Other than not getting a blatantly repetitive pattern, I don't // really care how random it is. It just needs to be fast. // /dev/urandom is too slow. // On Linux, the low-order bits of rand() are supposedly as good as // the high-order ones (according to man rand). However, RAND_MAX // is 2147483647. We need one more bit. uint32_t r = rand(); if (rand() & 1) r = ~r; return r; } int main (int argc, char **argv) { uintmax_t bcount = 0; if (argc != 2) usage (); if (!strcmp (argv[1], "0")) { while (putchar (0) != EOF) ++bcount; } else if (!strcmp (argv[1], "1")) { while (putchar (0xFF) != EOF) ++bcount; } else if (!strcmp (argv[1], "F0")) { while (putchar (0xF0) != EOF) ++bcount; } else if (!strcmp (argv[1], "0F")) { while (putchar (0x0F) != EOF) ++bcount; } else if (!strcmp (argv[1], "R")) { assert (RAND_MAX == 2147483647); // portability be damned. assert (sizeof(uint32_t) == 4); srand (time(NULL)); uint32_t word = pseudorand(); while (fwrite (&word, 4, 1, stdout) == 1) { bcount += 4; word = pseudorand(); } } else { usage (); } fprintf (stderr, "%" PRIuMAX " bytes written\n", bcount); return 0; }