lsflib/src/md5sum.c
changeset 6 c3dc3eb3b541
child 9 c3fecc82ade6
new file mode 100644
--- /dev/null
+++ b/lsflib/src/md5sum.c
@@ -0,0 +1,57 @@
+/*
+ *  $Id: md5sum.c 94 2008-04-05 01:27:30Z mbroeker $
+ * $URL: http://localhost/svn/c/lsflib/trunk/src/md5sum.c $
+ *
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <openssl/evp.h>
+
+#include <lsf.h>
+
+unsigned char *md5sum (char *fname)
+{
+    EVP_MD_CTX mdctx;
+    const EVP_MD *md;
+    char line[81];
+    unsigned char md_value[EVP_MAX_MD_SIZE];
+    int md_len, i;
+    FILE *f;
+    static unsigned char *value = NULL;
+
+    OpenSSL_add_all_digests ();
+
+    if ((f = fopen (fname, "rb")) == NULL) {
+        perror ("FOPEN");
+        value = malloc (1);
+        value = 0;
+        return value;
+    }
+
+    if ((md = EVP_get_digestbyname ("md5")) == NULL) {
+        value = malloc (1);
+        value = 0;
+        return value;
+    }
+
+    EVP_MD_CTX_init (&mdctx);
+    EVP_DigestInit_ex (&mdctx, md, NULL);
+
+    *line = 0;
+    while ((i = fread (line, 1, 80, f)) != 0) {
+        EVP_DigestUpdate (&mdctx, line, i);
+    }
+
+    fclose (f);
+
+    EVP_DigestFinal_ex (&mdctx, md_value, (unsigned int *)&md_len);
+    EVP_MD_CTX_cleanup (&mdctx);
+
+    value = malloc (md_len + 1);
+
+    for (i = 0; i < md_len; i++)
+        value[i] = md_value[i];
+    value[i] = 0;
+    return value;
+}