From: Stephan Bosch Date: Thu, 19 Mar 2020 00:04:53 +0000 (+0100) Subject: lib-storage: mail-storage - Change mail_get_save_date() to return 1 when result is... X-Git-Tag: 2.3.11.2~488 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2d6ad094588e1e6786cd8e17370c7cd776e61496;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: mail-storage - Change mail_get_save_date() to return 1 when result is reliable. --- diff --git a/src/lib-storage/index/cydir/cydir-mail.c b/src/lib-storage/index/cydir/cydir-mail.c index 08132bb9e8..5dddbf8433 100644 --- a/src/lib-storage/index/cydir/cydir-mail.c +++ b/src/lib-storage/index/cydir/cydir-mail.c @@ -63,15 +63,15 @@ static int cydir_mail_get_save_date(struct mail *_mail, time_t *date_r) struct index_mail_data *data = &mail->data; struct stat st; - if (index_mail_get_save_date(_mail, date_r) == 0) - return 0; + if (index_mail_get_save_date(_mail, date_r) > 0) + return 1; if (cydir_mail_stat(_mail, &st) < 0) return -1; data->save_date = st.st_ctime; *date_r = data->save_date; - return 0; + return 1; } static int cydir_mail_get_physical_size(struct mail *_mail, uoff_t *size_r) diff --git a/src/lib-storage/index/dbox-common/dbox-mail.c b/src/lib-storage/index/dbox-common/dbox-mail.c index cea046456e..25b6d3b438 100644 --- a/src/lib-storage/index/dbox-common/dbox-mail.c +++ b/src/lib-storage/index/dbox-common/dbox-mail.c @@ -146,8 +146,8 @@ int dbox_mail_get_save_date(struct mail *_mail, time_t *date_r) struct stat st; uoff_t offset; - if (index_mail_get_save_date(_mail, date_r) == 0) - return 0; + if (index_mail_get_save_date(_mail, date_r) > 0) + return 1; if (storage->v.mail_open(mail, &offset, &file) < 0) return -1; @@ -159,7 +159,7 @@ int dbox_mail_get_save_date(struct mail *_mail, time_t *date_r) return -1; } *date_r = data->save_date = st.st_ctime; - return 0; + return 1; } static int diff --git a/src/lib-storage/index/dbox-multi/mdbox-mail.c b/src/lib-storage/index/dbox-multi/mdbox-mail.c index 1b48f4fedf..071a30804b 100644 --- a/src/lib-storage/index/dbox-multi/mdbox-mail.c +++ b/src/lib-storage/index/dbox-multi/mdbox-mail.c @@ -162,7 +162,7 @@ static int mdbox_mail_get_save_date(struct mail *mail, time_t *date_r) } *date_r = dbox_rec->save_date; - return 0; + return 1; } static int diff --git a/src/lib-storage/index/imapc/imapc-mail.c b/src/lib-storage/index/imapc/imapc-mail.c index 9cc0ea2760..414327f264 100644 --- a/src/lib-storage/index/imapc/imapc-mail.c +++ b/src/lib-storage/index/imapc/imapc-mail.c @@ -145,7 +145,9 @@ static int imapc_mail_get_save_date(struct mail *_mail, time_t *date_r) if (data->save_date == (time_t)-1) { /* FIXME: we could use a value stored in cache */ - return imapc_mail_get_received_date(_mail, date_r); + if (imapc_mail_get_received_date(_mail, date_r) < 0) + return -1; + return 0; } *date_r = data->save_date; return 0; diff --git a/src/lib-storage/index/index-mail.c b/src/lib-storage/index/index-mail.c index 26d22311f9..f0fc37573a 100644 --- a/src/lib-storage/index/index-mail.c +++ b/src/lib-storage/index/index-mail.c @@ -388,7 +388,7 @@ int index_mail_get_save_date(struct mail *_mail, time_t *date_r) } *date_r = data->save_date; - return *date_r == (time_t)-1 ? -1 : 0; + return *date_r == (time_t)-1 ? -1 : 1; } static int index_mail_cache_sent_date(struct index_mail *mail) diff --git a/src/lib-storage/index/index-status.c b/src/lib-storage/index/index-status.c index 1a2fff8aee..4188794589 100644 --- a/src/lib-storage/index/index-status.c +++ b/src/lib-storage/index/index-status.c @@ -281,7 +281,7 @@ index_mailbox_get_first_save_date(struct mailbox *box, mail = mail_alloc(t, 0, NULL); for (seq = 1; seq <= hdr->messages_count; seq++) { mail_set_seq(mail, seq); - if (mail_get_save_date(mail, &metadata_r->first_save_date) == 0) { + if (mail_get_save_date(mail, &metadata_r->first_save_date) >= 0) { ret = 0; break; } diff --git a/src/lib-storage/index/maildir/maildir-mail.c b/src/lib-storage/index/maildir/maildir-mail.c index c21215faba..24197706fe 100644 --- a/src/lib-storage/index/maildir/maildir-mail.c +++ b/src/lib-storage/index/maildir/maildir-mail.c @@ -170,14 +170,14 @@ static int maildir_mail_get_save_date(struct mail *_mail, time_t *date_r) struct index_mail_data *data = &mail->data; struct stat st; - if (index_mail_get_save_date(_mail, date_r) == 0) - return 0; + if (index_mail_get_save_date(_mail, date_r) > 0) + return 1; if (maildir_mail_stat(_mail, &st) < 0) return -1; *date_r = data->save_date = st.st_ctime; - return 0; + return 1; } static int diff --git a/src/lib-storage/index/mbox/mbox-mail.c b/src/lib-storage/index/mbox/mbox-mail.c index 0b183a8ce1..0614970a90 100644 --- a/src/lib-storage/index/mbox/mbox-mail.c +++ b/src/lib-storage/index/mbox/mbox-mail.c @@ -135,7 +135,7 @@ static int mbox_mail_get_save_date(struct mail *_mail, time_t *date_r) struct index_mail *mail = INDEX_MAIL(_mail); struct index_mail_data *data = &mail->data; - if (index_mail_get_save_date(_mail, date_r) == 0) + if (index_mail_get_save_date(_mail, date_r) > 0) return 0; /* no way to know this. save the current time into cache and use diff --git a/src/lib-storage/index/pop3c/pop3c-mail.c b/src/lib-storage/index/pop3c/pop3c-mail.c index 8e845eaa7d..eb39a8cda8 100644 --- a/src/lib-storage/index/pop3c/pop3c-mail.c +++ b/src/lib-storage/index/pop3c/pop3c-mail.c @@ -60,7 +60,9 @@ static int pop3c_mail_get_save_date(struct mail *_mail, time_t *date_r) if (data->save_date == (time_t)-1) { /* FIXME: we could use a value stored in cache */ - return pop3c_mail_get_received_date(_mail, date_r); + if (pop3c_mail_get_received_date(_mail, date_r) < 0) + return -1; + return 0; } *date_r = data->save_date; return 0; diff --git a/src/lib-storage/index/raw/raw-mail.c b/src/lib-storage/index/raw/raw-mail.c index 64b33a91aa..2c473fef1b 100644 --- a/src/lib-storage/index/raw/raw-mail.c +++ b/src/lib-storage/index/raw/raw-mail.c @@ -60,7 +60,7 @@ static int raw_mail_get_save_date(struct mail *_mail, time_t *date_r) } *date_r = mail->data.save_date = mbox->ctime; - return 0; + return 1; } static int raw_mail_get_physical_size(struct mail *_mail, uoff_t *size_r) diff --git a/src/lib-storage/list/mailbox-list-index-status.c b/src/lib-storage/list/mailbox-list-index-status.c index 45f079bd53..33cd49f9b0 100644 --- a/src/lib-storage/list/mailbox-list-index-status.c +++ b/src/lib-storage/list/mailbox-list-index-status.c @@ -488,7 +488,7 @@ index_list_update_first_saved(struct mailbox *box, messages_count = mail_index_view_get_messages_count(box->view); for (seq = 1; seq <= messages_count; seq++) { mail_set_seq(mail, seq); - if (mail_get_save_date(mail, &save_date) == 0) { + if (mail_get_save_date(mail, &save_date) >= 0) { first_saved.uid = mail->uid; first_saved.timestamp = save_date; break; diff --git a/src/lib-storage/mail-autoexpunge.c b/src/lib-storage/mail-autoexpunge.c index 47920ceaf3..a38af80f9d 100644 --- a/src/lib-storage/mail-autoexpunge.c +++ b/src/lib-storage/mail-autoexpunge.c @@ -86,7 +86,7 @@ mailbox_autoexpunge_batch(struct mailbox *box, /* only max_mails is used. nothing further to do. */ done = TRUE; break; - } else if (mail_get_save_date(mail, ×tamp) == 0) { + } else if (mail_get_save_date(mail, ×tamp) >= 0) { if (I_MAX(last_rename_stamp, timestamp) > expire_time) { done = TRUE; break; diff --git a/src/lib-storage/mail-storage.h b/src/lib-storage/mail-storage.h index 328abd9dd6..501a815317 100644 --- a/src/lib-storage/mail-storage.h +++ b/src/lib-storage/mail-storage.h @@ -895,8 +895,9 @@ int mail_get_parts(struct mail *mail, struct message_part **parts_r); int mail_get_date(struct mail *mail, time_t *date_r, int *timezone_r); /* Get the time when the mail was received (IMAP INTERNALDATE). */ int mail_get_received_date(struct mail *mail, time_t *date_r); -/* Get the time when the mail was saved into this mailbox. This time may not - always be entirely reliable. */ +/* Get the time when the mail was saved into this mailbox. This returns -1 on + error, 0 if a real save date is not supported and a fall-back date is used, + and 1 when a save date was successfully retrieved. */ int mail_get_save_date(struct mail *mail, time_t *date_r); /* Get the space used by the mail as seen by the reader. Linefeeds are always diff --git a/src/plugins/expire/expire-plugin.c b/src/plugins/expire/expire-plugin.c index 6dd713b829..0a245ad517 100644 --- a/src/plugins/expire/expire-plugin.c +++ b/src/plugins/expire/expire-plugin.c @@ -196,7 +196,7 @@ static void first_nonexpunged_timestamp(struct mailbox_transaction_context *t, for (seq = 2; seq <= hdr->messages_count; seq++) { if (!mail_index_is_expunged(view, seq)) { mail_set_seq(mail, seq); - if (mail_get_save_date(mail, stamp_r) == 0) + if (mail_get_save_date(mail, stamp_r) >= 0) break; } } diff --git a/src/plugins/virtual/virtual-mail.c b/src/plugins/virtual/virtual-mail.c index 3ee67cf704..38dde49e8b 100644 --- a/src/plugins/virtual/virtual-mail.c +++ b/src/plugins/virtual/virtual-mail.c @@ -349,14 +349,14 @@ static int virtual_mail_get_save_date(struct mail *mail, time_t *date_r) { struct virtual_mail *vmail = (struct virtual_mail *)mail; struct mail *backend_mail; + int ret; if (backend_mail_get(vmail, &backend_mail) < 0) return -1; - if (mail_get_save_date(backend_mail, date_r) < 0) { + ret = mail_get_save_date(backend_mail, date_r); + if (ret < 0) virtual_box_copy_error(mail->box, backend_mail->box); - return -1; - } - return 0; + return ret; } static int virtual_mail_get_virtual_mail_size(struct mail *mail, uoff_t *size_r)