From f567e9ad51a3b4f61580299f12b67e070fb16c5c Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Tue, 18 Mar 2014 16:49:10 +0200 Subject: [PATCH] maildir: Fixed looking up physical size for a mail while it's being saved. Based on patch by Teemu Huovila. --- src/lib-storage/index/maildir/maildir-mail.c | 4 ++++ src/lib-storage/index/maildir/maildir-save.c | 23 +++++++++++++++++-- .../index/maildir/maildir-storage.h | 3 +++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/lib-storage/index/maildir/maildir-mail.c b/src/lib-storage/index/maildir/maildir-mail.c index 918a2d65d3..8c4fade6f4 100644 --- a/src/lib-storage/index/maildir/maildir-mail.c +++ b/src/lib-storage/index/maildir/maildir-mail.c @@ -288,6 +288,10 @@ static int maildir_quick_size_lookup(struct index_mail *mail, bool vsize, if (maildir_mail_get_fname(mbox, _mail, &fname) <= 0) return -1; } else { + if (maildir_save_file_get_size(_mail->transaction, _mail->seq, + vsize, size_r) == 0) + return 1; + path = maildir_save_file_get_path(_mail->transaction, _mail->seq); fname = strrchr(path, '/'); diff --git a/src/lib-storage/index/maildir/maildir-save.c b/src/lib-storage/index/maildir/maildir-save.c index 113d0228a2..24c2f4883a 100644 --- a/src/lib-storage/index/maildir/maildir-save.c +++ b/src/lib-storage/index/maildir/maildir-save.c @@ -304,8 +304,9 @@ static const char *maildir_mf_get_path(struct maildir_save_context *ctx, return t_strdup_printf("%s/%s", dir, fname); } -const char *maildir_save_file_get_path(struct mailbox_transaction_context *t, - uint32_t seq) + +static struct maildir_filename * +maildir_save_get_mf(struct mailbox_transaction_context *t, uint32_t seq) { struct maildir_save_context *save_ctx = (struct maildir_save_context *)t->save_ctx; @@ -320,6 +321,24 @@ const char *maildir_save_file_get_path(struct mailbox_transaction_context *t, i_assert(mf != NULL); seq--; } + return mf; +} + +int maildir_save_file_get_size(struct mailbox_transaction_context *t, + uint32_t seq, bool vsize, uoff_t *size_r) +{ + struct maildir_filename *mf = maildir_save_get_mf(t, seq); + + *size_r = vsize ? mf->vsize : mf->size; + return *size_r == (uoff_t)-1 ? -1 : 0; +} + +const char *maildir_save_file_get_path(struct mailbox_transaction_context *t, + uint32_t seq) +{ + struct maildir_save_context *save_ctx = + (struct maildir_save_context *)t->save_ctx; + struct maildir_filename *mf = maildir_save_get_mf(t, seq); return maildir_mf_get_path(save_ctx, mf); } diff --git a/src/lib-storage/index/maildir/maildir-storage.h b/src/lib-storage/index/maildir/maildir-storage.h index cb20b2b907..937c0d2ac2 100644 --- a/src/lib-storage/index/maildir/maildir-storage.h +++ b/src/lib-storage/index/maildir/maildir-storage.h @@ -126,6 +126,9 @@ void maildir_save_set_dest_basename(struct mail_save_context *ctx, const char *basename); void maildir_save_set_sizes(struct maildir_filename *mf, uoff_t size, uoff_t vsize); + +int maildir_save_file_get_size(struct mailbox_transaction_context *t, + uint32_t seq, bool vsize, uoff_t *size_r); const char *maildir_save_file_get_path(struct mailbox_transaction_context *t, uint32_t seq); -- 2.47.3