Mercurial > dovecot > core-2.2
changeset 17212:e47b3e215dec
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.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 15 Apr 2014 17:06:57 +0200 |
parents | ac26bb157938 |
children | 13ead8c6aed5 |
files | src/lib-storage/fail-mail.c src/lib-storage/index/index-mail.c src/lib-storage/index/index-mail.h src/lib-storage/index/index-search.c src/lib-storage/mail-storage-private.h src/lib-storage/mail-storage.c src/lib-storage/mail-storage.h src/lib-storage/mail.c src/plugins/virtual/virtual-mail.c |
diffstat | 9 files changed, 37 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- 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
--- 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 *
--- 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);
--- 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;
--- 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);
--- 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);
--- 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. */
--- 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,
--- 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)