xref: /inferno-os/appl/cmd/zeros.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
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