dovecot-1.2: Virtual mailboxes: Fixes to handling errors.
dovecot at dovecot.org
dovecot at dovecot.org
Sat Oct 25 23:56:39 EEST 2008
details: http://hg.dovecot.org/dovecot-1.2/rev/fa564d405f51
changeset: 8341:fa564d405f51
user: Timo Sirainen <tss at iki.fi>
date: Sat Oct 25 23:56:35 2008 +0300
description:
Virtual mailboxes: Fixes to handling errors.
diffstat:
4 files changed, 102 insertions(+), 16 deletions(-)
src/plugins/virtual/virtual-mail.c | 70 +++++++++++++++++++++++++++------
src/plugins/virtual/virtual-storage.c | 37 ++++++++++++++++-
src/plugins/virtual/virtual-storage.h | 3 +
src/plugins/virtual/virtual-sync.c | 8 ++-
diffs (254 lines):
diff -r 1bf3afdd6450 -r fa564d405f51 src/plugins/virtual/virtual-mail.c
--- a/src/plugins/virtual/virtual-mail.c Sat Oct 25 23:56:16 2008 +0300
+++ b/src/plugins/virtual/virtual-mail.c Sat Oct 25 23:56:35 2008 +0300
@@ -141,7 +141,11 @@ virtual_mail_get_parts(struct mail *mail
{
struct virtual_mail *vmail = (struct virtual_mail *)mail;
- return mail_get_parts(vmail->backend_mail, parts_r);
+ if (mail_get_parts(vmail->backend_mail, parts_r) < 0) {
+ virtual_box_copy_error(mail->box, vmail->backend_mail->box);
+ return -1;
+ }
+ return 0;
}
static int
@@ -153,35 +157,55 @@ virtual_mail_get_date(struct mail *mail,
if (timezone_r == NULL)
timezone_r = &tz;
- return mail_get_date(vmail->backend_mail, date_r, timezone_r);
+ if (mail_get_date(vmail->backend_mail, date_r, timezone_r) < 0) {
+ virtual_box_copy_error(mail->box, vmail->backend_mail->box);
+ return -1;
+ }
+ return 0;
}
static int virtual_mail_get_received_date(struct mail *mail, time_t *date_r)
{
struct virtual_mail *vmail = (struct virtual_mail *)mail;
- return mail_get_received_date(vmail->backend_mail, date_r);
+ if (mail_get_received_date(vmail->backend_mail, date_r) < 0) {
+ virtual_box_copy_error(mail->box, vmail->backend_mail->box);
+ return -1;
+ }
+ return 0;
}
static int virtual_mail_get_save_date(struct mail *mail, time_t *date_r)
{
struct virtual_mail *vmail = (struct virtual_mail *)mail;
- return mail_get_save_date(vmail->backend_mail, date_r);
+ if (mail_get_save_date(vmail->backend_mail, date_r) < 0) {
+ virtual_box_copy_error(mail->box, vmail->backend_mail->box);
+ return -1;
+ }
+ return 0;
}
static int virtual_mail_get_virtual_mail_size(struct mail *mail, uoff_t *size_r)
{
struct virtual_mail *vmail = (struct virtual_mail *)mail;
- return mail_get_virtual_size(vmail->backend_mail, size_r);
+ if (mail_get_virtual_size(vmail->backend_mail, size_r) < 0) {
+ virtual_box_copy_error(mail->box, vmail->backend_mail->box);
+ return -1;
+ }
+ return 0;
}
static int virtual_mail_get_physical_size(struct mail *mail, uoff_t *size_r)
{
struct virtual_mail *vmail = (struct virtual_mail *)mail;
- return mail_get_physical_size(vmail->backend_mail, size_r);
+ if (mail_get_physical_size(vmail->backend_mail, size_r) < 0) {
+ virtual_box_copy_error(mail->box, vmail->backend_mail->box);
+ return -1;
+ }
+ return 0;
}
static int
@@ -191,8 +215,12 @@ virtual_mail_get_first_header(struct mai
struct virtual_mail *vmail = (struct virtual_mail *)mail;
struct mail_private *p = (struct mail_private *)vmail->backend_mail;
- return p->v.get_first_header(vmail->backend_mail, field,
- decode_to_utf8, value_r);
+ if (p->v.get_first_header(vmail->backend_mail, field,
+ decode_to_utf8, value_r) < 0) {
+ virtual_box_copy_error(mail->box, vmail->backend_mail->box);
+ return -1;
+ }
+ return 0;
}
static int
@@ -202,8 +230,12 @@ virtual_mail_get_headers(struct mail *ma
struct virtual_mail *vmail = (struct virtual_mail *)mail;
struct mail_private *p = (struct mail_private *)vmail->backend_mail;
- return p->v.get_headers(vmail->backend_mail, field,
- decode_to_utf8, value_r);
+ if (p->v.get_headers(vmail->backend_mail, field,
+ decode_to_utf8, value_r) < 0) {
+ virtual_box_copy_error(mail->box, vmail->backend_mail->box);
+ return -1;
+ }
+ return 0;
}
static int
@@ -219,6 +251,11 @@ virtual_mail_get_header_stream(struct ma
headers->headers);
ret = mail_get_header_stream(vmail->backend_mail, headers, stream_r);
mailbox_header_lookup_unref(&backend_headers);
+ if (ret < 0) {
+ virtual_box_copy_error(mail->box, vmail->backend_mail->box);
+ return -1;
+ }
+ return 0;
return ret;
}
@@ -229,7 +266,12 @@ virtual_mail_get_stream(struct mail *mai
{
struct virtual_mail *vmail = (struct virtual_mail *)mail;
- return mail_get_stream(vmail->backend_mail, hdr_size, body_size, stream_r);
+ if (mail_get_stream(vmail->backend_mail, hdr_size, body_size,
+ stream_r) < 0) {
+ virtual_box_copy_error(mail->box, vmail->backend_mail->box);
+ return -1;
+ }
+ return 0;
}
static int
@@ -242,7 +284,11 @@ virtual_mail_get_special(struct mail *ma
*value_r = vmail->backend_mail->box->name;
return 0;
}
- return mail_get_special(vmail->backend_mail, field, value_r);
+ if (mail_get_special(vmail->backend_mail, field, value_r) < 0) {
+ virtual_box_copy_error(mail->box, vmail->backend_mail->box);
+ return -1;
+ }
+ return 0;
}
static void virtual_mail_expunge(struct mail *mail)
diff -r 1bf3afdd6450 -r fa564d405f51 src/plugins/virtual/virtual-storage.c
--- a/src/plugins/virtual/virtual-storage.c Sat Oct 25 23:56:16 2008 +0300
+++ b/src/plugins/virtual/virtual-storage.c Sat Oct 25 23:56:35 2008 +0300
@@ -36,6 +36,34 @@ virtual_list_iter_is_mailbox(struct mail
enum mailbox_list_file_type type,
enum mailbox_info_flags *flags);
+void virtual_copy_error(struct mail_storage *dest, struct mail_storage *src)
+{
+ const char *str;
+ enum mail_error error;
+
+ str = mail_storage_get_last_error(src, &error);
+ if ((src->ns->flags & NAMESPACE_FLAG_HIDDEN) != 0) {
+ str = t_strdup_printf("%s (namespace %s)", str,
+ src->ns->prefix);
+ }
+ mail_storage_set_error(dest, error, str);
+}
+
+void virtual_box_copy_error(struct mailbox *dest, struct mailbox *src)
+{
+ const char *str;
+ enum mail_error error;
+
+ str = mail_storage_get_last_error(src->storage, &error);
+ if ((src->storage->ns->flags & NAMESPACE_FLAG_HIDDEN) != 0)
+ str = t_strdup_printf("%s (mailbox %s)", str, src->name);
+ else {
+ str = t_strdup_printf("%s (mailbox %s%s)", str,
+ src->storage->ns->prefix, src->name);
+ }
+ mail_storage_set_error(dest->storage, error, str);
+}
+
static int
virtual_get_list_settings(struct mailbox_list_settings *list_set,
const char *data, struct mail_storage *storage,
@@ -203,7 +231,7 @@ static int virtual_mailboxes_open(struct
else {
/* failed */
for (; i > 0; i--) {
- mailbox_close(&bboxes[i-1]->box);
+ (void)mailbox_close(&bboxes[i-1]->box);
array_free(&bboxes[i-1]->uids);
}
return -1;
@@ -300,6 +328,7 @@ static int virtual_storage_mailbox_close
static int virtual_storage_mailbox_close(struct mailbox *box)
{
struct virtual_mailbox *mbox = (struct virtual_mailbox *)box;
+ struct mail_storage *storage;
struct virtual_backend_box **bboxes;
unsigned int i, count;
int ret = 0;
@@ -310,8 +339,12 @@ static int virtual_storage_mailbox_close
for (i = 0; i < count; i++) {
if (bboxes[i]->search_result != NULL)
mailbox_search_result_free(&bboxes[i]->search_result);
- if (mailbox_close(&bboxes[i]->box) < 0)
+
+ storage = bboxes[i]->box->storage;
+ if (mailbox_close(&bboxes[i]->box) < 0) {
+ virtual_copy_error(box->storage, storage);
ret = -1;
+ }
array_free(&bboxes[i]->sync_pending_removes);
array_free(&bboxes[i]->uids);
}
diff -r 1bf3afdd6450 -r fa564d405f51 src/plugins/virtual/virtual-storage.h
--- a/src/plugins/virtual/virtual-storage.h Sat Oct 25 23:56:16 2008 +0300
+++ b/src/plugins/virtual/virtual-storage.h Sat Oct 25 23:56:35 2008 +0300
@@ -129,6 +129,9 @@ struct mailbox_sync_context *
struct mailbox_sync_context *
virtual_storage_sync_init(struct mailbox *box, enum mailbox_sync_flags flags);
+void virtual_copy_error(struct mail_storage *dest, struct mail_storage *src);
+void virtual_box_copy_error(struct mailbox *dest, struct mailbox *src);
+
void virtual_transaction_class_init(void);
void virtual_transaction_class_deinit(void);
diff -r 1bf3afdd6450 -r fa564d405f51 src/plugins/virtual/virtual-sync.c
--- a/src/plugins/virtual/virtual-sync.c Sat Oct 25 23:56:16 2008 +0300
+++ b/src/plugins/virtual/virtual-sync.c Sat Oct 25 23:56:35 2008 +0300
@@ -1112,8 +1112,12 @@ static int virtual_sync_backend_boxes(st
i_array_init(&ctx->all_adds, 128);
bboxes = array_get(&ctx->mbox->backend_boxes, &count);
for (i = 0; i < count; i++) {
- if (virtual_sync_backend_box(ctx, bboxes[i]) < 0)
+ if (virtual_sync_backend_box(ctx, bboxes[i]) < 0) {
+ /* backend failed, copy the error */
+ virtual_box_copy_error(&ctx->mbox->ibox.box,
+ bboxes[i]->box);
return -1;
+ }
}
if (!ctx->mbox->uids_mapped) {
@@ -1151,7 +1155,7 @@ static int virtual_sync_finish(struct vi
mail_index_sync_rollback(&ctx->index_sync_ctx);
}
i_free(ctx);
- return 0;
+ return ret;
}
static int virtual_sync(struct virtual_mailbox *mbox,
More information about the dovecot-cvs
mailing list