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,