Mercurial > dovecot > core-2.2
changeset 21795:c17be6188c79
lib-storage: Add mailbox_list_get_last_internal_error()
This returns the error given to mailbox_list_set_critical().
author | Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi> |
---|---|
date | Fri, 17 Mar 2017 12:38:21 +0200 |
parents | cc18acb777cb |
children | e9db2f82f290 |
files | src/lib-storage/mailbox-list-private.h src/lib-storage/mailbox-list.c src/lib-storage/mailbox-list.h |
diffstat | 3 files changed, 27 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- 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 {
--- 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
--- 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,