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