From: Ethan Glasser-Camp <ethan@betacantrips.com> Previously, notmuch_database_add_message used the notmuch_sha1_of_file function, which accesses a mail file directly. Create a new function called notmuch_sha1_of_message which uses a mailstore to access the file, and use that instead. Also, as a drive-by cleanup, use the named constant BLOCK_SIZE instead of the integer literal 4096. Signed-off-by: Ethan Glasser-Camp <ethan@betacantrips.com> --- lib/database.cc | 2 +- lib/notmuch-private.h | 3 ++ lib/sha1.c | 52 ++++++++++++++++++++++++++++++++++++------------ 3 files changed, 43 insertions(+), 14 deletions(-) diff --git a/lib/database.cc b/lib/database.cc index e3c8095..ff44e76 100644 --- a/lib/database.cc +++ b/lib/database.cc @@ -1700,7 +1700,7 @@ notmuch_database_add_message (notmuch_database_t *notmuch, if (message_id == NULL ) { /* No message-id at all, let's generate one by taking a * hash over the file's contents. */ - char *sha1 = notmuch_sha1_of_file (filename); + char *sha1 = notmuch_sha1_of_message (notmuch->mailstore, filename); /* If that failed too, something is really wrong. Give up. */ if (sha1 == NULL) { diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h index 0f01437..2589928 100644 --- a/lib/notmuch-private.h +++ b/lib/notmuch-private.h @@ -454,6 +454,9 @@ notmuch_sha1_of_string (const char *str); char * notmuch_sha1_of_file (const char *filename); +char * +notmuch_sha1_of_message (notmuch_mailstore_t *mailstore, const char *filename); + /* string-list.c */ typedef struct _notmuch_string_node { diff --git a/lib/sha1.c b/lib/sha1.c index cc48108..ea25999 100644 --- a/lib/sha1.c +++ b/lib/sha1.c @@ -64,19 +64,11 @@ notmuch_sha1_of_string (const char *str) return _hex_of_sha1_digest (digest); } -/* Create a hexadecimal string version of the SHA-1 digest of the - * contents of the named file. - * - * This function returns a newly allocated string which the caller - * should free() when finished. - * - * If any error occurs while reading the file, (permission denied, - * file not found, etc.), this function returns NULL. +/* Internal function to feed the contents of a FILE * to the sha1 functions. */ -char * -notmuch_sha1_of_file (const char *filename) +static char * +_notmuch_sha1_of_filep (FILE *file) { - FILE *file; #define BLOCK_SIZE 4096 unsigned char block[BLOCK_SIZE]; size_t bytes_read; @@ -84,14 +76,13 @@ notmuch_sha1_of_file (const char *filename) unsigned char digest[SHA1_DIGEST_SIZE]; char *result; - file = fopen (filename, "r"); if (file == NULL) return NULL; sha1_begin (&sha1); while (1) { - bytes_read = fread (block, 1, 4096, file); + bytes_read = fread (block, 1, BLOCK_SIZE, file); if (bytes_read == 0) { if (feof (file)) { break; @@ -113,3 +104,38 @@ notmuch_sha1_of_file (const char *filename) return result; } +/* Create a hexadecimal string version of the SHA-1 digest of the + * contents of the named file. + * + * This function returns a newly allocated string which the caller + * should free() when finished. + * + * If any error occurs while reading the file, (permission denied, + * file not found, etc.), this function returns NULL. + */ +char * +notmuch_sha1_of_file (const char *filename) +{ + FILE *file; + + file = fopen (filename, "r"); + return _notmuch_sha1_of_filep (file); +} + +/* Create a hexadecimal string version of the SHA-1 digest of the + * contents of the named message, which is accessed via a mailstore. + * + * This function returns a newly allocated string which the caller + * should free() when finished. + * + * If any error occurs while reading the file, (permission denied, + * file not found, etc.), this function returns NULL. + */ +char * +notmuch_sha1_of_message (notmuch_mailstore_t *mailstore, const char *filename) +{ + FILE *file; + + file = notmuch_mailstore_open (mailstore, filename); + return _notmuch_sha1_of_filep (file); +} -- 1.7.5.4