summaryrefslogtreecommitdiff
path: root/sha1.c
diff options
context:
space:
mode:
authorCarl Worth <cworth@cworth.org>2009-10-22 15:31:56 -0700
committerCarl Worth <cworth@cworth.org>2009-10-22 15:31:56 -0700
commit6a4992bc611881b363583b4a20fc530c770aedd8 (patch)
tree7b5a8465e86e1cd3f732fc62115474eb7ae0aae1 /sha1.c
parent5794496c6e8b49ab62478b21a2178e5e2e353399 (diff)
Generate message ID (using SHA1) when a mail message contains none.
This is important as we're using the message ID as the unique key in our database. So previously, all messages with no message ID would be treated as the same message---not good at all.
Diffstat (limited to 'sha1.c')
-rw-r--r--sha1.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/sha1.c b/sha1.c
new file mode 100644
index 0000000..152d870
--- /dev/null
+++ b/sha1.c
@@ -0,0 +1,77 @@
+/* sha1.c - Interfaces to SHA-1 hash for the notmuch mail system
+ *
+ * Copyright © 2009 Carl Worth
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see http://www.gnu.org/licenses/ .
+ *
+ * Author: Carl Worth <cworth@cworth.org>
+ */
+
+#include "notmuch-private.h"
+
+#include "libsha1.h"
+
+/* Just some simple interfaces on top of libsha1 so that we can leave
+ * libsha1 as untouched as possible. */
+
+char *
+notmuch_sha1_of_file (const char *filename)
+{
+ FILE *file;
+#define BLOCK_SIZE 4096
+ unsigned char block[BLOCK_SIZE];
+ size_t bytes_read;
+ sha1_ctx sha1;
+ unsigned char digest[SHA1_DIGEST_SIZE];
+ char *result, *r;
+ int i;
+
+ file = fopen (filename, "r");
+ if (file == NULL)
+ return NULL;
+
+ sha1_begin (&sha1);
+
+ while (1) {
+ bytes_read = fread (block, 1, 4096, file);
+ if (bytes_read == 0) {
+ if (feof (file)) {
+ break;
+ } else if (ferror (file)) {
+ fclose (file);
+ return NULL;
+ }
+ } else {
+ sha1_hash (block, bytes_read, &sha1);
+ }
+ }
+
+ sha1_end (digest, &sha1);
+
+ result = calloc (SHA1_DIGEST_SIZE * 2 + 1, 1);
+ if (result == NULL)
+ return NULL;
+
+ for (r = result, i = 0;
+ i < SHA1_DIGEST_SIZE;
+ r += 2, i++)
+ {
+ sprintf (r, "%02x", digest[i]);
+ }
+
+ fclose (file);
+
+ return result;
+}
+