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