1/* 2 * Copyright (c) 2007 Michael Niedermayer 3 * 4 * This file is part of FFmpeg. 5 * 6 * FFmpeg is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * FFmpeg is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with FFmpeg; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 */ 20 21#include <stdio.h> 22#include <stdlib.h> 23#include <inttypes.h> 24#include <errno.h> 25#include <string.h> 26 27static uint32_t state; 28static uint32_t ran(void) 29{ 30 return state = state * 1664525 + 1013904223; 31} 32 33int main(int argc, char **argv) 34{ 35 FILE *f; 36 int count, maxburst, length; 37 38 if (argc < 5) { 39 printf("USAGE: trasher <filename> <count> <maxburst> <seed>\n"); 40 return 1; 41 } 42 43 f = fopen(argv[1], "rb+"); 44 if (!f) { 45 perror(argv[1]); 46 return 2; 47 } 48 count = atoi(argv[2]); 49 maxburst = atoi(argv[3]); 50 state = atoi(argv[4]); 51 52 fseek(f, 0, SEEK_END); 53 length = ftell(f); 54 fseek(f, 0, SEEK_SET); 55 56 while (count--) { 57 int burst = 1 + ran() * (uint64_t) (abs(maxburst) - 1) / UINT32_MAX; 58 int pos = ran() * (uint64_t) length / UINT32_MAX; 59 if (fseek(f, pos, SEEK_SET) < 0) { 60 fprintf(stderr, "seek failed\n"); 61 return 1; 62 } 63 64 if (maxburst < 0) 65 burst = -maxburst; 66 67 if (pos + burst > length) 68 continue; 69 70 while (burst--) { 71 int val = ran() * 256ULL / UINT32_MAX; 72 73 if (maxburst < 0) 74 val = 0; 75 76 fwrite(&val, 1, 1, f); 77 } 78 } 79 80 return 0; 81} 82