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