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