From: Timo Sirainen Date: Tue, 20 Sep 2011 08:53:02 +0000 (+0300) Subject: imapc: Handle disconnection better when fetching a mail. X-Git-Tag: 2.1.beta1~162 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d5e131e809cf52342d904857d41c2bb41973dde8;p=thirdparty%2Fdovecot%2Fcore.git imapc: Handle disconnection better when fetching a mail. --- diff --git a/src/lib-storage/index/imapc/imapc-mail.c b/src/lib-storage/index/imapc/imapc-mail.c index 4cc40c4f47..ed57890a5a 100644 --- a/src/lib-storage/index/imapc/imapc-mail.c +++ b/src/lib-storage/index/imapc/imapc-mail.c @@ -51,6 +51,22 @@ static bool imapc_mail_is_expunged(struct mail *_mail) return !imapc_msgmap_uid_to_rseq(msgmap, _mail->uid, &rseq); } +static void imapc_mail_failed(struct mail *mail, const char *field) +{ + struct imapc_mailbox *mbox = (struct imapc_mailbox *)mail->box; + + if (mail->expunged || imapc_mail_is_expunged(mail)) + mail_set_expunged(mail); + else if (!imapc_client_mailbox_is_connected(mbox->client_box)) { + /* we've already logged a disconnection error */ + mail_storage_set_internal_error(mail->box->storage); + } else { + mail_storage_set_critical(mail->box->storage, + "imapc: Remote server didn't send %s for UID %u", + field, mail->uid); + } +} + static int imapc_mail_get_received_date(struct mail *_mail, time_t *date_r) { struct index_mail *mail = (struct index_mail *)_mail; @@ -63,13 +79,7 @@ static int imapc_mail_get_received_date(struct mail *_mail, time_t *date_r) if (imapc_mail_fetch(_mail, MAIL_FETCH_RECEIVED_DATE) < 0) return -1; if (data->received_date == (time_t)-1) { - if (_mail->expunged || imapc_mail_is_expunged(_mail)) - mail_set_expunged(_mail); - else { - mail_storage_set_critical(_mail->box->storage, - "imapc: Remote server didn't send " - "INTERNALDATE for UID %u", _mail->uid); - } + imapc_mail_failed(_mail, "INTERNALDATE"); return -1; } } @@ -140,13 +150,7 @@ imapc_mail_get_stream(struct mail *_mail, struct message_size *hdr_size, return -1; if (data->stream == NULL) { - if (_mail->expunged || imapc_mail_is_expunged(_mail)) - mail_set_expunged(_mail); - else { - mail_storage_set_critical(_mail->box->storage, - "imapc: Remote server didn't send " - "BODY[] for UID %u", _mail->uid); - } + imapc_mail_failed(_mail, "BODY[]"); return -1; } }