dovecot-2.2: lib-storage: Replaced mail_get_real_mail() with mai...

dovecot at dovecot.org dovecot at dovecot.org
Tue Apr 15 15:20:50 UTC 2014


details:   http://hg.dovecot.org/dovecot-2.2/rev/e47b3e215dec
changeset: 17212:e47b3e215dec
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Apr 15 17:06:57 2014 +0200
description:
lib-storage: Replaced mail_get_real_mail() with mail_get_backend_mail() that can fail.
For now the mail_get_real_mail() can still be used for backwards
compatibility.

diffstat:

 src/lib-storage/fail-mail.c            |   5 +++--
 src/lib-storage/index/index-mail.c     |   5 +++--
 src/lib-storage/index/index-mail.h     |   2 +-
 src/lib-storage/index/index-search.c   |   5 ++++-
 src/lib-storage/mail-storage-private.h |   2 +-
 src/lib-storage/mail-storage.c         |   9 ++++++---
 src/lib-storage/mail-storage.h         |   3 +++
 src/lib-storage/mail.c                 |  15 +++++++++++++--
 src/plugins/virtual/virtual-mail.c     |   5 +++--
 9 files changed, 37 insertions(+), 14 deletions(-)

diffs (163 lines):

diff -r ac26bb157938 -r e47b3e215dec src/lib-storage/fail-mail.c
--- a/src/lib-storage/fail-mail.c	Tue Apr 15 16:37:26 2014 +0200
+++ b/src/lib-storage/fail-mail.c	Tue Apr 15 17:06:57 2014 +0200
@@ -196,9 +196,10 @@
 	return -1;
 }
 
-static struct mail *fail_mail_get_real_mail(struct mail *mail)
+static int fail_mail_get_real_mail(struct mail *mail, struct mail **real_mail_r)
 {
-	return mail;
+	*real_mail_r = mail;
+	return 0;
 }
 
 static void
diff -r ac26bb157938 -r e47b3e215dec src/lib-storage/index/index-mail.c
--- a/src/lib-storage/index/index-mail.c	Tue Apr 15 16:37:26 2014 +0200
+++ b/src/lib-storage/index/index-mail.c	Tue Apr 15 17:06:57 2014 +0200
@@ -1211,9 +1211,10 @@
 	}
 }
 
-struct mail *index_mail_get_real_mail(struct mail *mail)
+int index_mail_get_real_mail(struct mail *mail, struct mail **real_mail_r)
 {
-	return mail;
+	*real_mail_r = mail;
+	return 0;
 }
 
 struct mail *
diff -r ac26bb157938 -r e47b3e215dec src/lib-storage/index/index-mail.h
--- a/src/lib-storage/index/index-mail.h	Tue Apr 15 16:37:26 2014 +0200
+++ b/src/lib-storage/index/index-mail.h	Tue Apr 15 17:06:57 2014 +0200
@@ -216,7 +216,7 @@
 				 struct istream **stream_r);
 int index_mail_get_special(struct mail *_mail, enum mail_fetch_field field,
 			   const char **value_r);
-struct mail *index_mail_get_real_mail(struct mail *mail);
+int index_mail_get_real_mail(struct mail *mail, struct mail **real_mail_r);
 
 void index_mail_update_flags(struct mail *mail, enum modify_type modify_type,
 			     enum mail_flags flags);
diff -r ac26bb157938 -r e47b3e215dec src/lib-storage/index/index-search.c
--- a/src/lib-storage/index/index-search.c	Tue Apr 15 16:37:26 2014 +0200
+++ b/src/lib-storage/index/index-search.c	Tue Apr 15 17:06:57 2014 +0200
@@ -640,6 +640,7 @@
 	const enum message_header_parser_flags hdr_parser_flags =
 		MESSAGE_HEADER_PARSER_FLAG_CLEAN_ONELINE;
 	struct index_mail *imail = (struct index_mail *)ctx->cur_mail;
+	struct mail *real_mail;
 	struct istream *input = NULL;
 	struct mailbox_header_lookup_ctx *headers_ctx;
 	struct search_header_context hdr_ctx;
@@ -657,7 +658,9 @@
 	hdr_ctx.index_ctx = ctx;
 	/* hdr_ctx.imail is different from imail for mails in
 	   virtual mailboxes */
-	hdr_ctx.imail = (struct index_mail *)mail_get_real_mail(ctx->cur_mail);
+	if (mail_get_backend_mail(ctx->cur_mail, &real_mail) < 0)
+		return -1;
+	hdr_ctx.imail = (struct index_mail *)real_mail;
 	hdr_ctx.custom_header = TRUE;
 	hdr_ctx.args = args;
 
diff -r ac26bb157938 -r e47b3e215dec src/lib-storage/mail-storage-private.h
--- a/src/lib-storage/mail-storage-private.h	Tue Apr 15 16:37:26 2014 +0200
+++ b/src/lib-storage/mail-storage-private.h	Tue Apr 15 17:06:57 2014 +0200
@@ -391,7 +391,7 @@
 
 	int (*get_special)(struct mail *mail, enum mail_fetch_field field,
 			   const char **value_r);
-	struct mail *(*get_real_mail)(struct mail *mail);
+	int (*get_real_mail)(struct mail *mail, struct mail **real_mail_r);
 
 	void (*update_flags)(struct mail *mail, enum modify_type modify_type,
 			     enum mail_flags flags);
diff -r ac26bb157938 -r e47b3e215dec src/lib-storage/mail-storage.c
--- a/src/lib-storage/mail-storage.c	Tue Apr 15 16:37:26 2014 +0200
+++ b/src/lib-storage/mail-storage.c	Tue Apr 15 17:06:57 2014 +0200
@@ -2116,7 +2116,7 @@
 	struct mailbox_transaction_context *t = ctx->transaction;
 	struct mail_keywords *keywords = ctx->data.keywords;
 	enum mail_flags pvt_flags = ctx->data.pvt_flags;
-	struct mail *real_mail;
+	struct mail *backend_mail;
 	int ret;
 
 	*_ctx = NULL;
@@ -2129,8 +2129,11 @@
 
 	/* bypass virtual storage, so hard linking can be used whenever
 	   possible */
-	real_mail = mail_get_real_mail(mail);
-	ret = t->box->v.copy(ctx, real_mail);
+	if (mail_get_backend_mail(mail, &backend_mail) < 0) {
+		mailbox_save_cancel(&ctx);
+		return -1;
+	}
+	ret = t->box->v.copy(ctx, backend_mail);
 	if (ret == 0) {
 		if (pvt_flags != 0)
 			mailbox_save_add_pvt_flags(t, pvt_flags);
diff -r ac26bb157938 -r e47b3e215dec src/lib-storage/mail-storage.h
--- a/src/lib-storage/mail-storage.h	Tue Apr 15 16:37:26 2014 +0200
+++ b/src/lib-storage/mail-storage.h	Tue Apr 15 17:06:57 2014 +0200
@@ -909,6 +909,9 @@
 		     const char **value_r);
 /* Returns the mail for the physical message. Normally this is the mail itself,
    but in virtual mailboxes it points to the backend mailbox. */
+int mail_get_backend_mail(struct mail *mail, struct mail **real_mail_r);
+/* FIXME: For backwards compatibility for now, use mail_get_backend_mail()
+   instead. */
 struct mail *mail_get_real_mail(struct mail *mail);
 
 /* Update message flags. */
diff -r ac26bb157938 -r e47b3e215dec src/lib-storage/mail.c
--- a/src/lib-storage/mail.c	Tue Apr 15 16:37:26 2014 +0200
+++ b/src/lib-storage/mail.c	Tue Apr 15 17:06:57 2014 +0200
@@ -272,11 +272,22 @@
 	return 0;
 }
 
-struct mail *mail_get_real_mail(struct mail *mail)
+int mail_get_backend_mail(struct mail *mail, struct mail **real_mail_r)
 {
 	struct mail_private *p = (struct mail_private *)mail;
 
-	return p->v.get_real_mail(mail);
+	return p->v.get_real_mail(mail, real_mail_r);
+}
+
+struct mail *mail_get_real_mail(struct mail *mail)
+{
+	struct mail *backend_mail;
+
+	if (mail_get_backend_mail(mail, &backend_mail) < 0) {
+		i_panic("FIXME: Error occurred in mail_get_real_mail(), "
+			"switch to using mail_get_backend_mail() instead");
+	}
+	return backend_mail;
 }
 
 void mail_update_flags(struct mail *mail, enum modify_type modify_type,
diff -r ac26bb157938 -r e47b3e215dec src/plugins/virtual/virtual-mail.c
--- a/src/plugins/virtual/virtual-mail.c	Tue Apr 15 16:37:26 2014 +0200
+++ b/src/plugins/virtual/virtual-mail.c	Tue Apr 15 17:06:57 2014 +0200
@@ -387,11 +387,12 @@
 	return 0;
 }
 
-static struct mail *virtual_mail_get_real_mail(struct mail *mail)
+static int
+virtual_mail_get_real_mail(struct mail *mail, struct mail **real_mail_r)
 {
 	struct virtual_mail *vmail = (struct virtual_mail *)mail;
 
-	return mail_get_real_mail(vmail->backend_mail);
+	return mail_get_backend_mail(vmail->backend_mail, real_mail_r);
 }
 
 static void virtual_mail_update_pop3_uidl(struct mail *mail, const char *uidl)


More information about the dovecot-cvs mailing list