Added jigsum, a simple utility to calculate and print MD5sums in
[jigit.git] / jigsum.c
1 #include <stdio.h>
2 #include <errno.h>
3 #include <stdlib.h>
4 #include <sys/types.h>
5 #include <sys/stat.h>
6 #include <string.h>
7 #include <fcntl.h>
8 #include <unistd.h>
9 #include "md5.h"
10
11 #define BUF_SIZE 65536
12
13 #ifndef MIN
14 #define MIN(x,y)        ( ((x) < (y)) ? (x) : (y))
15 #endif
16
17 static int md5_file(char *filename)
18 {
19     FILE *file = NULL;
20     char buf[BUF_SIZE];
21     unsigned char file_md5[16] = {0};
22     char *base64_md5 = NULL;
23     struct mk_MD5Context file_context;
24     int done = 0;
25     int bytes_read = 0;
26
27     mk_MD5Init(&file_context);
28
29     /* Check if we're reading from stdin */
30     if (!strcmp("-", filename))
31         file = stdin;
32     else
33     {
34         fprintf(stderr, "\r %-75.75s", filename);
35         file = fopen(filename, "rb");
36         if (!file)
37         {
38             switch (errno)
39             {
40                 case EACCES:
41                 case EISDIR:
42                     break;
43                 default:
44                     fprintf(stderr, "Unable to open file %s; error %d\n", filename, errno);
45                     break;
46             }
47             return errno;
48         }
49     }
50     
51     while (!done)
52     {
53         int used = 0;
54         memset(buf, 0, BUF_SIZE);
55
56         used = fread(buf, 1, BUF_SIZE, file);
57         bytes_read += used;
58         if (used)
59             mk_MD5Update(&file_context, buf, used);
60         else
61         {
62             if (ferror(file) && (EISDIR != errno))
63                 fprintf(stderr, "Unable to read from file %s; error %d\n",
64                         filename, errno);
65             break;
66         }
67     }
68     
69     mk_MD5Final(file_md5, &file_context);
70     base64_md5 = base64_dump(file_md5, 16);
71     if (file != stdin)
72     {
73         fclose(file);
74         if (bytes_read)
75             printf("%s  %s\n", base64_md5, filename);
76     }
77     else
78         if (bytes_read)
79             printf("%s\n", base64_md5);
80     fflush(stdout);
81     
82     return 0;
83 }
84
85 int main(int argc, char **argv)
86 {
87     int i = 0;
88     
89     for (i = 1; i < argc; i++)
90         (void) md5_file(argv[i]);
91
92     return 0;
93 }
94