Added jigsum, a simple utility to calculate and print MD5sums in
authorSteve McIntyre <steve@einval.com>
Sun, 13 Mar 2005 22:16:43 +0000 (22:16 +0000)
committerSteve McIntyre <steve@einval.com>
Sun, 13 Mar 2005 22:16:43 +0000 (22:16 +0000)
jigdo's base64-style format

jigsum.1 [new file with mode: 0644]
jigsum.c [new file with mode: 0644]

diff --git a/jigsum.1 b/jigsum.1
new file mode 100644 (file)
index 0000000..f745f14
--- /dev/null
+++ b/jigsum.1
@@ -0,0 +1,34 @@
+.TH JIGSUM 1 "September 2004" "Jigit jigdo tools"
+.SH NAME
+jigsum \- List MD5 sums of files in jigdo's bas64-alike format
+.SH SYNOPSIS
+.B jigsum
+[\fIfiles\fR]... 
+.SH DESCRIPTION
+.PP
+jigsum will read in all the files specified and write the MD5sum of
+each file to stdout (similarly to the md5sum program), but in the jigdo
+base64-like format rather than the normal hexadecimal format.
+.SH "EXAMPLES"
+.TP
+$ jigsum *.c
+.P
+l47z1lSgp8LjDKFbK-JE4g  endian.c
+.P
+14LC5gWctrarRvkobDxRQQ  jigdump.c
+.P
+NBACGqWruP5PAsv_o8Ahyg  jigsum.c
+.P
+qIsPRZQZmUWwim_yeYIQvg  md5.c
+.P
+Im7-9TForecHp6C7bekXUg  mkimage.c
+.SH "SEE ALSO"
+\fBjigdo-file\fP(1), \fBjigit\fP(1), \fBjigdump\fP(1) and \fBmkimage\fP(1).
+.SH "COPYRIGHT"
+Copyright 2004 Steve McIntyre (steve@einval.com)
+.PP
+jigsum may be copied under the terms and conditions of version 2
+of the GNU General Public License, as published by the Free
+Software Foundation (Cambridge, MA, USA).
+.SH "AUTHOR"
+Written by Steve McIntyre (steve@einval.com)
diff --git a/jigsum.c b/jigsum.c
new file mode 100644 (file)
index 0000000..f48e787
--- /dev/null
+++ b/jigsum.c
@@ -0,0 +1,94 @@
+#include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include "md5.h"
+
+#define BUF_SIZE 65536
+
+#ifndef MIN
+#define MIN(x,y)        ( ((x) < (y)) ? (x) : (y))
+#endif
+
+static int md5_file(char *filename)
+{
+    FILE *file = NULL;
+    char buf[BUF_SIZE];
+    unsigned char file_md5[16] = {0};
+    char *base64_md5 = NULL;
+    struct mk_MD5Context file_context;
+    int done = 0;
+    int bytes_read = 0;
+
+    mk_MD5Init(&file_context);
+
+    /* Check if we're reading from stdin */
+    if (!strcmp("-", filename))
+        file = stdin;
+    else
+    {
+        fprintf(stderr, "\r %-75.75s", filename);
+        file = fopen(filename, "rb");
+        if (!file)
+        {
+            switch (errno)
+            {
+                case EACCES:
+                case EISDIR:
+                    break;
+                default:
+                    fprintf(stderr, "Unable to open file %s; error %d\n", filename, errno);
+                    break;
+            }
+            return errno;
+        }
+    }
+    
+    while (!done)
+    {
+        int used = 0;
+        memset(buf, 0, BUF_SIZE);
+
+        used = fread(buf, 1, BUF_SIZE, file);
+        bytes_read += used;
+        if (used)
+            mk_MD5Update(&file_context, buf, used);
+        else
+        {
+            if (ferror(file) && (EISDIR != errno))
+                fprintf(stderr, "Unable to read from file %s; error %d\n",
+                        filename, errno);
+            break;
+        }
+    }
+    
+    mk_MD5Final(file_md5, &file_context);
+    base64_md5 = base64_dump(file_md5, 16);
+    if (file != stdin)
+    {
+        fclose(file);
+        if (bytes_read)
+            printf("%s  %s\n", base64_md5, filename);
+    }
+    else
+        if (bytes_read)
+            printf("%s\n", base64_md5);
+    fflush(stdout);
+    
+    return 0;
+}
+
+int main(int argc, char **argv)
+{
+    int i = 0;
+    
+    for (i = 1; i < argc; i++)
+        (void) md5_file(argv[i]);
+
+    return 0;
+}
+