]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imapc: Handle disconnection better when fetching a mail.
authorTimo Sirainen <tss@iki.fi>
Tue, 20 Sep 2011 08:53:02 +0000 (11:53 +0300)
committerTimo Sirainen <tss@iki.fi>
Tue, 20 Sep 2011 08:53:02 +0000 (11:53 +0300)
src/lib-storage/index/imapc/imapc-mail.c

index 4cc40c4f477968594582a32ad5f10a070a0680f1..ed57890a5ae6387115d62caa756227bab1e61c86 100644 (file)
@@ -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;
                }
        }