1 #include <u.h> 2 #include <libc.h> 3 #include <bio.h> 4 #include <libsec.h> 5 6 #pragma varargck type "M" uchar* 7 8 static int 9 digestfmt(Fmt *fmt) 10 { 11 char buf[MD5dlen*2+1]; 12 uchar *p; 13 int i; 14 15 p = va_arg(fmt->args, uchar*); 16 for(i=0; i<MD5dlen; i++) 17 sprint(buf+2*i, "%.2ux", p[i]); 18 return fmtstrcpy(fmt, buf); 19 } 20 21 static void 22 sum(int fd, char *name) 23 { 24 int n; 25 uchar buf[8192], digest[MD5dlen]; 26 DigestState *s; 27 28 s = md5(nil, 0, nil, nil); 29 while((n = read(fd, buf, sizeof buf)) > 0) 30 md5(buf, n, nil, s); 31 md5(nil, 0, digest, s); 32 if(name == nil) 33 print("%M\n", digest); 34 else 35 print("%M\t%s\n", digest, name); 36 } 37 38 void 39 main(int argc, char *argv[]) 40 { 41 int i, fd; 42 43 ARGBEGIN{ 44 default: 45 fprint(2, "usage: md5sum [file...]\n"); 46 exits("usage"); 47 }ARGEND 48 49 fmtinstall('M', digestfmt); 50 51 if(argc == 0) 52 sum(0, nil); 53 else for(i = 0; i < argc; i++){ 54 fd = open(argv[i], OREAD); 55 if(fd < 0){ 56 fprint(2, "md5sum: can't open %s: %r\n", argv[i]); 57 continue; 58 } 59 sum(fd, argv[i]); 60 close(fd); 61 } 62 exits(nil); 63 } 64