forsyth20121205-174063a80cc13 years agoHistory
61 lines · 977 B · C
RawDownload
#include <lib9.h>#include <libsec.h> #pragma	varargck	type	"M"	uchar* static intdigestfmt(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 voidsum(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);} voidmain(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);}