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