void *ext_hdr_init_data;
};
+struct mail_index_error {
+ /* Human-readable error text */
+ char *text;
+
+ /* Error happened because there's no disk space, i.e. syscall failed
+ with ENOSPC or EDQUOT. */
+ bool nodiskspace:1;
+};
+
struct mail_index {
char *dir, *prefix;
struct event *event;
/* Module-specific contexts. */
ARRAY(union mail_index_module_context *) module_contexts;
- char *error;
- bool nodiskspace:1;
+ /* Last error returned by mail_index_get_error_message().
+ Cleared by mail_index_reset_error(). */
+ struct mail_index_error last_error;
bool index_delete_requested:1; /* next sync sets it deleted */
bool index_deleted:1; /* no changes allowed anymore */
i_free(index->set.cache_dir);
i_free(index->set.ext_hdr_init_data);
i_free(index->set.gid_origin);
- i_free(index->error);
+ i_free(index->last_error.text);
i_free(index->dir);
i_free(index->prefix);
i_free(index->need_recreate);
{
va_list va;
- i_free(index->error);
+ i_free(index->last_error.text);
if (fmt == NULL)
- index->error = NULL;
+ index->last_error.text = NULL;
else {
va_start(va, fmt);
- index->error = i_strdup_vprintf(fmt, va);
+ index->last_error.text = i_strdup_vprintf(fmt, va);
va_end(va);
- e_error(index->event, "%s", index->error);
+ e_error(index->event, "%s", index->last_error.text);
}
}
{
i_assert(str != NULL);
- char *old_error = index->error;
- index->error = i_strdup(str);
+ char *old_error = index->last_error.text;
+ index->last_error.text = i_strdup(str);
i_free(old_error);
}
}
if (ENOSPACE(errno)) {
- index->nodiskspace = TRUE;
+ index->last_error.nodiskspace = TRUE;
if ((index->flags & MAIL_INDEX_OPEN_FLAG_NEVER_IN_MEMORY) == 0)
return;
}
const char *mail_index_get_error_message(struct mail_index *index)
{
- return index->error;
+ return index->last_error.text;
}
void mail_index_reset_error(struct mail_index *index)
{
- if (index->error != NULL) {
- i_free(index->error);
- index->error = NULL;
- }
-
- index->nodiskspace = FALSE;
+ i_free(index->last_error.text);
+ i_zero(&index->last_error);
}