]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Add mailbox_list_get_last_internal_error()
authorMartti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
Fri, 17 Mar 2017 10:38:21 +0000 (12:38 +0200)
committerMartti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
Thu, 23 Mar 2017 09:46:58 +0000 (11:46 +0200)
This returns the error given to mailbox_list_set_critical().

src/lib-storage/mailbox-list-private.h
src/lib-storage/mailbox-list.c
src/lib-storage/mailbox-list.h

index 7d589e28a77944f4edf08148707dc0c0b6608eef..1870fc4b53db060c80446b0552b0da4535d5e219 100644 (file)
@@ -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 {
        bool index_root_dir_created:1;
        bool guid_cache_updated:1;
        bool guid_cache_invalidated:1;
+       bool last_error_is_internal:1;
 };
 
 union mailbox_list_iterate_module_context {
index f4011b6dc74072b0f72423e275e9798b546d6a59..9c7ce2e6b96076117c72dc4be2ea0b17de57d188 100644 (file)
@@ -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);
@@ -1778,10 +1779,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;
 }
 
@@ -1791,6 +1806,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;
 }
 
@@ -1808,9 +1824,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
index 253bc64d155cb7ab06f66a925a48df00db35cd3e..b6835d03de7b1fe51865914f49ddb6b3ac5a9182 100644 (file)
@@ -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,