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