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;
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 {
*_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);
"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;
}
i_free(list->error_string);
list->error_string = i_strdup(string);
+ list->last_error_is_internal = FALSE;
list->error = error;
}
{
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
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,