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