]> 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)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 27 Mar 2017 09:44:12 +0000 (12:44 +0300)
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 48723d7065836c045e84da5aede5041635d7a5b9..f11d4e82e74c2265afc50bc588301f628d307170 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 {
        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 {
index 269cc63f38e2fb9d053fd2a1132963dc5efacaba..d11fe3bf7b8b462e4ec9276ad8f03a0dd974d04f 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);
@@ -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
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,