1 bc7cb1a1 2003-11-23 devnull #include <u.h>
2 bc7cb1a1 2003-11-23 devnull #include <libc.h>
3 bc7cb1a1 2003-11-23 devnull #include <bio.h>
4 bc7cb1a1 2003-11-23 devnull #include <libsec.h>
6 bc7cb1a1 2003-11-23 devnull static int
7 bc7cb1a1 2003-11-23 devnull digestfmt(Fmt *fmt)
9 bc7cb1a1 2003-11-23 devnull char buf[MD5dlen*2+1];
10 bc7cb1a1 2003-11-23 devnull uchar *p;
13 bc7cb1a1 2003-11-23 devnull p = va_arg(fmt->args, uchar*);
14 bc7cb1a1 2003-11-23 devnull for(i=0; i<MD5dlen; i++)
15 bc7cb1a1 2003-11-23 devnull sprint(buf+2*i, "%.2ux", p[i]);
16 bc7cb1a1 2003-11-23 devnull return fmtstrcpy(fmt, buf);
19 bc7cb1a1 2003-11-23 devnull static void
20 bc7cb1a1 2003-11-23 devnull sum(int fd, char *name)
23 bc7cb1a1 2003-11-23 devnull uchar buf[8192], digest[MD5dlen];
24 bc7cb1a1 2003-11-23 devnull DigestState *s;
26 bc7cb1a1 2003-11-23 devnull s = md5(nil, 0, nil, nil);
27 bc7cb1a1 2003-11-23 devnull while((n = read(fd, buf, sizeof buf)) > 0)
28 bc7cb1a1 2003-11-23 devnull md5(buf, n, nil, s);
29 bc7cb1a1 2003-11-23 devnull md5(nil, 0, digest, s);
30 bc7cb1a1 2003-11-23 devnull if(name == nil)
31 bc7cb1a1 2003-11-23 devnull print("%M\n", digest);
33 bc7cb1a1 2003-11-23 devnull print("%M\t%s\n", digest, name);
37 bc7cb1a1 2003-11-23 devnull main(int argc, char *argv[])
39 bc7cb1a1 2003-11-23 devnull int i, fd;
41 bc7cb1a1 2003-11-23 devnull ARGBEGIN{
43 bc7cb1a1 2003-11-23 devnull fprint(2, "usage: md5sum [file...]\n");
44 bc7cb1a1 2003-11-23 devnull exits("usage");
47 bc7cb1a1 2003-11-23 devnull fmtinstall('M', digestfmt);
49 bc7cb1a1 2003-11-23 devnull if(argc == 0)
50 bc7cb1a1 2003-11-23 devnull sum(0, nil);
51 bc7cb1a1 2003-11-23 devnull else for(i = 0; i < argc; i++){
52 bc7cb1a1 2003-11-23 devnull fd = open(argv[i], OREAD);
53 bc7cb1a1 2003-11-23 devnull if(fd < 0){
54 bc7cb1a1 2003-11-23 devnull fprint(2, "md5sum: can't open %s: %r\n", argv[i]);
55 bc7cb1a1 2003-11-23 devnull continue;
57 bc7cb1a1 2003-11-23 devnull sum(fd, argv[i]);
58 bc7cb1a1 2003-11-23 devnull close(fd);
60 bc7cb1a1 2003-11-23 devnull exits(nil);