From: Martti Rannanjärvi Date: Fri, 17 Mar 2017 10:38:21 +0000 (+0200) Subject: lib-storage: Add mailbox_list_get_last_internal_error() X-Git-Tag: 2.2.29.rc1~113 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=99b77f8e57396a1fcb45ba6163b48ab57d646d4e;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Add mailbox_list_get_last_internal_error() This returns the error given to mailbox_list_set_critical(). --- diff --git a/src/lib-storage/mailbox-list-private.h b/src/lib-storage/mailbox-list-private.h index 48723d7065..f11d4e82e7 100644 --- a/src/lib-storage/mailbox-list-private.h +++ b/src/lib-storage/mailbox-list-private.h @@ -127,6 +127,9 @@ struct mailbox_list { HASH_TABLE(uint8_t *, struct mailbox_guid_cache_rec *) guid_cache; bool guid_cache_errors; + /* Last error set in mailbox_list_set_critical(). */ + char *last_internal_error; + char *error_string; enum mail_error error; bool temporary_error; @@ -136,6 +139,7 @@ struct mailbox_list { unsigned int index_root_dir_created:1; unsigned int guid_cache_updated:1; unsigned int guid_cache_invalidated:1; + unsigned int last_error_is_internal:1; }; union mailbox_list_iterate_module_context { diff --git a/src/lib-storage/mailbox-list.c b/src/lib-storage/mailbox-list.c index 269cc63f38..d11fe3bf7b 100644 --- a/src/lib-storage/mailbox-list.c +++ b/src/lib-storage/mailbox-list.c @@ -760,6 +760,7 @@ void mailbox_list_destroy(struct mailbox_list **_list) *_list = NULL; i_free_and_null(list->error_string); + i_free(list->last_internal_error); if (hash_table_is_created(list->guid_cache)) { hash_table_destroy(&list->guid_cache); @@ -1783,10 +1784,24 @@ const char *mailbox_list_get_last_error(struct mailbox_list *list, "Unknown internal list error"; } +const char *mailbox_list_get_last_internal_error(struct mailbox_list *list, + enum mail_error *error_r) +{ + if (error_r != NULL) + *error_r = list->error; + if (list->last_error_is_internal) { + i_assert(list->last_internal_error != NULL); + return list->last_internal_error; + } + return mailbox_list_get_last_error(list, error_r); +} + void mailbox_list_clear_error(struct mailbox_list *list) { i_free_and_null(list->error_string); + i_free(list->last_internal_error); + list->last_error_is_internal = FALSE; list->error = MAIL_ERROR_NONE; } @@ -1796,6 +1811,7 @@ void mailbox_list_set_error(struct mailbox_list *list, i_free(list->error_string); list->error_string = i_strdup(string); + list->last_error_is_internal = FALSE; list->error = error; } @@ -1813,9 +1829,12 @@ void mailbox_list_set_critical(struct mailbox_list *list, const char *fmt, ...) { va_list va; + i_free(list->last_internal_error); va_start(va, fmt); - i_error("%s", t_strdup_vprintf(fmt, va)); + list->last_internal_error = i_strdup_vprintf(fmt, va); va_end(va); + list->last_error_is_internal = TRUE; + i_error("%s", list->last_internal_error); /* critical errors may contain sensitive data, so let user see only "Internal error" with a timestamp to make it diff --git a/src/lib-storage/mailbox-list.h b/src/lib-storage/mailbox-list.h index 253bc64d15..b6835d03de 100644 --- a/src/lib-storage/mailbox-list.h +++ b/src/lib-storage/mailbox-list.h @@ -261,6 +261,9 @@ int mailbox_list_delete_symlink(struct mailbox_list *list, const char *name); const char * ATTR_NOWARN_UNUSED_RESULT mailbox_list_get_last_error(struct mailbox_list *list, enum mail_error *error_r); +const char * ATTR_NOWARN_UNUSED_RESULT +mailbox_list_get_last_internal_error(struct mailbox_list *list, + enum mail_error *error_r); /* Create a fs based on the settings in the given mailbox_list. */ int mailbox_list_init_fs(struct mailbox_list *list, const char *driver,