xref: /inferno-os/appl/cmd/md5sum.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsythimplement MD5sum;
2*37da2899SCharles.Forsyth
3*37da2899SCharles.Forsythinclude "sys.m";
4*37da2899SCharles.Forsyth	sys: Sys;
5*37da2899SCharles.Forsyth
6*37da2899SCharles.Forsythinclude "draw.m";
7*37da2899SCharles.Forsyth
8*37da2899SCharles.Forsythinclude "keyring.m";
9*37da2899SCharles.Forsyth	kr: Keyring;
10*37da2899SCharles.Forsyth
11*37da2899SCharles.ForsythMD5sum: module
12*37da2899SCharles.Forsyth{
13*37da2899SCharles.Forsyth	init: fn(nil : ref Draw->Context, argv: list of string);
14*37da2899SCharles.Forsyth};
15*37da2899SCharles.Forsyth
16*37da2899SCharles.Forsythstderr: ref Sys->FD;
17*37da2899SCharles.Forsyth
18*37da2899SCharles.Forsythinit(nil: ref Draw->Context, argv: list of string)
19*37da2899SCharles.Forsyth{
20*37da2899SCharles.Forsyth	sys = load Sys Sys->PATH;
21*37da2899SCharles.Forsyth	stderr = sys->fildes(2);
22*37da2899SCharles.Forsyth	kr = load Keyring Keyring->PATH;
23*37da2899SCharles.Forsyth	a := tl argv;
24*37da2899SCharles.Forsyth	err := 0;
25*37da2899SCharles.Forsyth	if(a != nil){
26*37da2899SCharles.Forsyth		for( ; a != nil; a = tl a) {
27*37da2899SCharles.Forsyth			s := hd a;
28*37da2899SCharles.Forsyth			fd := sys->open(s, Sys->OREAD);
29*37da2899SCharles.Forsyth			if (fd == nil) {
30*37da2899SCharles.Forsyth				sys->fprint(stderr, "md5sum: cannot open %s: %r\n", s);
31*37da2899SCharles.Forsyth				err = 1;
32*37da2899SCharles.Forsyth			} else
33*37da2899SCharles.Forsyth				err |= md5sum(fd, s);
34*37da2899SCharles.Forsyth		}
35*37da2899SCharles.Forsyth	} else
36*37da2899SCharles.Forsyth		err |= md5sum(sys->fildes(0), "");
37*37da2899SCharles.Forsyth	if(err)
38*37da2899SCharles.Forsyth		raise "fail:error";
39*37da2899SCharles.Forsyth}
40*37da2899SCharles.Forsyth
41*37da2899SCharles.Forsythmd5sum(fd: ref Sys->FD, file: string): int
42*37da2899SCharles.Forsyth{
43*37da2899SCharles.Forsyth	err := 0;
44*37da2899SCharles.Forsyth	buf := array[Sys->ATOMICIO] of byte;
45*37da2899SCharles.Forsyth	state: ref Keyring->DigestState = nil;
46*37da2899SCharles.Forsyth	nbytes := big 0;
47*37da2899SCharles.Forsyth	while((nr := sys->read(fd, buf, len buf)) > 0){
48*37da2899SCharles.Forsyth		state = kr->md5(buf, nr, nil, state);
49*37da2899SCharles.Forsyth		nbytes += big nr;
50*37da2899SCharles.Forsyth	}
51*37da2899SCharles.Forsyth	if(nr < 0) {
52*37da2899SCharles.Forsyth		sys->fprint(stderr, "md5sum: error reading %s: %r\n", file);
53*37da2899SCharles.Forsyth		err = 1;
54*37da2899SCharles.Forsyth	}
55*37da2899SCharles.Forsyth	digest := array[Keyring->MD5dlen] of byte;
56*37da2899SCharles.Forsyth	kr->md5(buf, 0, digest, state);
57*37da2899SCharles.Forsyth	sum := "";
58*37da2899SCharles.Forsyth	for(i:=0; i<len digest; i++)
59*37da2899SCharles.Forsyth		sum += sys->sprint("%2.2ux", int digest[i]);
60*37da2899SCharles.Forsyth	if(file != nil)
61*37da2899SCharles.Forsyth		sys->print("%s\t%s\n", sum, file);
62*37da2899SCharles.Forsyth	else
63*37da2899SCharles.Forsyth		sys->print("%s\n", sum);
64*37da2899SCharles.Forsyth	return err;
65*37da2899SCharles.Forsyth}
66