md5sum.c - 9base - revived minimalist port of Plan 9 userland to Unix | |
git clone git://git.suckless.org/9base | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
md5sum.c (975B) | |
--- | |
1 #include <u.h> | |
2 #include <libc.h> | |
3 #include <bio.h> | |
4 #include <libsec.h> | |
5 | |
6 static int | |
7 digestfmt(Fmt *fmt) | |
8 { | |
9 char buf[MD5dlen*2+1]; | |
10 uchar *p; | |
11 int i; | |
12 | |
13 p = va_arg(fmt->args, uchar*); | |
14 for(i=0; i<MD5dlen; i++) | |
15 sprint(buf+2*i, "%.2ux", p[i]); | |
16 return fmtstrcpy(fmt, buf); | |
17 } | |
18 | |
19 static void | |
20 sum(int fd, char *name) | |
21 { | |
22 int n; | |
23 uchar buf[8192], digest[MD5dlen]; | |
24 DigestState *s; | |
25 | |
26 s = md5(nil, 0, nil, nil); | |
27 while((n = read(fd, buf, sizeof buf)) > 0) | |
28 md5(buf, n, nil, s); | |
29 md5(nil, 0, digest, s); | |
30 if(name == nil) | |
31 print("%M\n", digest); | |
32 else | |
33 print("%M\t%s\n", digest, name); | |
34 } | |
35 | |
36 void | |
37 main(int argc, char *argv[]) | |
38 { | |
39 int i, fd; | |
40 | |
41 ARGBEGIN{ | |
42 default: | |
43 fprint(2, "usage: md5sum [file...]\n"); | |
44 exits("usage"); | |
45 }ARGEND | |
46 | |
47 fmtinstall('M', digestfmt); | |
48 | |
49 if(argc == 0) | |
50 sum(0, nil); | |
51 else for(i = 0; i < argc; i++){ | |
52 fd = open(argv[i], OREAD); | |
53 if(fd < 0){ | |
54 fprint(2, "md5sum: can't open %s: %r\n", argv[i]… | |
55 continue; | |
56 } | |
57 sum(fd, argv[i]); | |
58 close(fd); | |
59 } | |
60 exits(nil); | |
61 } |