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