#include <u.h> | |
#include <libc.h> | |
#include <bio.h> | |
#include <libsec.h> | |
static int | |
digestfmt(Fmt *fmt) | |
{ | |
char buf[MD5dlen*2+1]; | |
uchar *p; | |
int i; | |
p = va_arg(fmt->args, uchar*); | |
for(i=0; i<MD5dlen; i++) | |
sprint(buf+2*i, "%.2ux", p[i]); | |
return fmtstrcpy(fmt, buf); | |
} | |
static void | |
sum(int fd, char *name) | |
{ | |
int n; | |
uchar buf[8192], digest[MD5dlen]; | |
DigestState *s; | |
s = md5(nil, 0, nil, nil); | |
while((n = read(fd, buf, sizeof buf)) > 0) | |
md5(buf, n, nil, s); | |
md5(nil, 0, digest, s); | |
if(name == nil) | |
print("%M\n", digest); | |
else | |
print("%M\t%s\n", digest, name); | |
} | |
void | |
main(int argc, char *argv[]) | |
{ | |
int i, fd; | |
ARGBEGIN{ | |
default: | |
fprint(2, "usage: md5sum [file...]\n"); | |
exits("usage"); | |
}ARGEND | |
fmtinstall('M', digestfmt); | |
if(argc == 0) | |
sum(0, nil); | |
else for(i = 0; i < argc; i++){ | |
fd = open(argv[i], OREAD); | |
if(fd < 0){ | |
fprint(2, "md5sum: can't open %s: %r\n", argv[i]); | |
continue; | |
} | |
sum(fd, argv[i]); | |
close(fd); | |
} | |
exits(nil); | |
} |