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