1implement Zeros; 2 3include "sys.m"; 4 sys: Sys; 5include "arg.m"; 6 arg: Arg; 7include "string.m"; 8 str: String; 9include "keyring.m"; 10include "security.m"; 11 random: Random; 12 13include "draw.m"; 14 15Zeros: module 16{ 17 init: fn(nil: ref Draw->Context, argv: list of string); 18}; 19 20init(nil: ref Draw->Context, argv: list of string) 21{ 22 z: array of byte; 23 i: int; 24 sys = load Sys Sys->PATH; 25 arg = load Arg Arg->PATH; 26 str = load String String->PATH; 27 28 if(sys == nil || arg == nil) 29 return; 30 31 bs := 0; 32 n := 0; 33 val := 0; 34 rflag := 0; 35 arg->init(argv); 36 while ((c := arg->opt()) != 0) 37 case c { 38 'r' => rflag = 1; 39 'v' => (val, nil) = str->toint(arg->arg(), 16); 40 * => raise sys->sprint("fail:unknown option (%c)\n", c); 41 } 42 argv = arg->argv(); 43 if(len argv >= 1) 44 bs = int hd argv; 45 else 46 bs = 1; 47 if (len argv >= 2) 48 n = int hd tl argv; 49 else 50 n = 1; 51 if(bs == 0 || n == 0) { 52 sys->fprint(sys->fildes(2), "usage: zeros [-r] [-v value] blocksize [number]\n"); 53 raise "fail:usage"; 54 } 55 if (rflag) { 56 random = load Random Random->PATH; 57 if (random == nil) 58 raise "fail:no security module\n"; 59 z = random->randombuf(random->NotQuiteRandom, bs); 60 } 61 else { 62 z = array[bs] of byte; 63 for(i=0;i<bs;i++) 64 z[i] = byte val; 65 } 66 for(i=0;i<n;i++) 67 sys->write(sys->fildes(1), z, bs); 68} 69