# HG changeset patch # User Martti Rannanjärvi # Date 1489747101 -7200 # Node ID c17be6188c79fe82000d9cfc835a144633260a99 # Parent cc18acb777cbd27b9b9d0267e3998ccb94ebdde5 lib-storage: Add mailbox_list_get_last_internal_error() This returns the error given to mailbox_list_set_critical(). diff -r cc18acb777cb -r c17be6188c79 src/lib-storage/mailbox-list-private.h --- a/src/lib-storage/mailbox-list-private.h Wed Mar 22 23:19:51 2017 +0200 +++ b/src/lib-storage/mailbox-list-private.h Fri Mar 17 12:38:21 2017 +0200 @@ -127,6 +127,9 @@ 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 @@ 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 -r cc18acb777cb -r c17be6188c79 src/lib-storage/mailbox-list.c --- a/src/lib-storage/mailbox-list.c Wed Mar 22 23:19:51 2017 +0200 +++ b/src/lib-storage/mailbox-list.c Fri Mar 17 12:38:21 2017 +0200 @@ -760,6 +760,7 @@ *_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 @@ "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 @@ i_free(list->error_string); list->error_string = i_strdup(string); + list->last_error_is_internal = FALSE; list->error = error; } @@ -1813,9 +1829,12 @@ { 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 -r cc18acb777cb -r c17be6188c79 src/lib-storage/mailbox-list.h --- a/src/lib-storage/mailbox-list.h Wed Mar 22 23:19:51 2017 +0200 +++ b/src/lib-storage/mailbox-list.h Fri Mar 17 12:38:21 2017 +0200 @@ -261,6 +261,9 @@ 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,