X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=message-file.c;h=18275fbf853fc89ecb4c5b703c34a5a9b084e995;hp=f625a9300829293ff6352d062bc36f5b63a110a4;hb=ae0bd3f503c8815affa733f48498bb77d023680b;hpb=cc48812cb55e046a77ce1b4aad33566acc5fbd47 diff --git a/message-file.c b/message-file.c index f625a930..18275fbf 100644 --- a/message-file.c +++ b/message-file.c @@ -70,12 +70,36 @@ strcase_hash (const void *ptr) return hash; } +static int +_notmuch_message_file_destructor (notmuch_message_file_t *message) +{ + if (message->line) + free (message->line); + + if (message->value.size) + free (message->value.str); + + if (message->headers) + g_hash_table_destroy (message->headers); + + if (message->file) + fclose (message->file); + + return 0; +} + +/* Create a new notmuch_message_file_t for 'filename' with 'ctx' as + * the talloc owner. */ notmuch_message_file_t * -notmuch_message_file_open (const char *filename) +_notmuch_message_file_open_ctx (void *ctx, const char *filename) { notmuch_message_file_t *message; - message = xcalloc (1, sizeof (notmuch_message_file_t)); + message = talloc_zero (ctx, notmuch_message_file_t); + if (unlikely (message == NULL)) + return NULL; + + talloc_set_destructor (message, _notmuch_message_file_destructor); message->file = fopen (filename, "r"); if (message->file == NULL) @@ -98,25 +122,16 @@ notmuch_message_file_open (const char *filename) return NULL; } +notmuch_message_file_t * +notmuch_message_file_open (const char *filename) +{ + return _notmuch_message_file_open_ctx (NULL, filename); +} + void notmuch_message_file_close (notmuch_message_file_t *message) { - if (message == NULL) - return; - - if (message->line) - free (message->line); - - if (message->value.size) - free (message->value.str); - - if (message->headers) - g_hash_table_destroy (message->headers); - - if (message->file) - fclose (message->file); - - free (message); + talloc_free (message); } void @@ -149,7 +164,7 @@ notmuch_message_file_restrict_headers (notmuch_message_file_t *message, ...) notmuch_message_file_restrict_headersv (message, va_headers); } -void +static void copy_header_unfolding (header_value_closure_t *value, const char *chunk) {