return box->reopen_callback != NULL && box->reconnect_ok;
}
-void imapc_client_mailbox_reconnect(struct imapc_client_mailbox *box)
+void imapc_client_mailbox_reconnect(struct imapc_client_mailbox *box,
+ const char *errmsg)
{
i_assert(!box->reconnecting);
- box->reconnecting = TRUE;
- /* if we fail again, avoid reconnecting immediately. if the server is
- broken we could just get into an infinitely failing reconnection
- loop. */
- box->reconnect_ok = FALSE;
-
- imapc_connection_disconnect_full(box->conn, TRUE);
- imapc_connection_connect(box->conn);
+ imapc_connection_try_reconnect(box->conn, errmsg, 0);
}
void imapc_client_mailbox_close(struct imapc_client_mailbox **_box)
void *context);
void imapc_client_mailbox_close(struct imapc_client_mailbox **box);
bool imapc_client_mailbox_can_reconnect(struct imapc_client_mailbox *box);
-void imapc_client_mailbox_reconnect(struct imapc_client_mailbox *box);
+void imapc_client_mailbox_reconnect(struct imapc_client_mailbox *box,
+ const char *errmsg);
struct imapc_command *
imapc_client_mailbox_cmd(struct imapc_client_mailbox *box,
imapc_command_callback_t *callback, void *context);
conn->reconnect_ok = FALSE;
conn->reconnect_waiting = FALSE;
- if (conn->selected_box != NULL)
- imapc_client_mailbox_reconnect(conn->selected_box);
- else {
- imapc_connection_disconnect_full(conn, TRUE);
- imapc_connection_connect(conn);
+ if (conn->selected_box != NULL) {
+ i_assert(!conn->selected_box->reconnecting);
+ conn->selected_box->reconnecting = TRUE;
+ /* if we fail again, avoid reconnecting immediately. if the
+ server is broken we could just get into an infinitely
+ failing reconnection loop. */
+ conn->selected_box->reconnect_ok = FALSE;
}
+ imapc_connection_disconnect_full(conn, TRUE);
+ imapc_connection_connect(conn);
}
-static void
-imapc_connection_try_reconnect(struct imapc_connection *conn,
- const char *errstr, unsigned int delay_msecs)
+void imapc_connection_try_reconnect(struct imapc_connection *conn,
+ const char *errstr,
+ unsigned int delay_msecs)
{
if (conn->prev_connect_idx + 1 < conn->ips_count) {
conn->reconnect_ok = TRUE;
void imapc_connection_disconnect(struct imapc_connection *conn);
void imapc_connection_disconnect_full(struct imapc_connection *conn,
bool reconnecting);
+void imapc_connection_try_reconnect(struct imapc_connection *conn,
+ const char *errstr,
+ unsigned int delay_msecs);
void imapc_connection_abort_commands(struct imapc_connection *conn,
struct imapc_client_mailbox *only_box,
bool keep_retriable) ATTR_NULL(2);
void imapc_mailbox_set_corrupted(struct imapc_mailbox *mbox,
const char *reason, ...)
{
+ const char *errmsg;
va_list va;
va_start(va, reason);
- i_error("imapc: Mailbox '%s' state corrupted: %s",
+ errmsg = t_strdup_printf("Mailbox '%s' state corrupted: %s",
mbox->box.name, t_strdup_vprintf(reason, va));
va_end(va);
/* maybe the remote server is buggy and has become confused.
try reconnecting. */
}
- imapc_client_mailbox_reconnect(mbox->client_box);
+ imapc_client_mailbox_reconnect(mbox->client_box, errmsg);
}
static struct mail_index_view *
mbox->storage->reopen_count--;
mbox->selecting = FALSE;
if (reply->state != IMAPC_COMMAND_STATE_OK) {
- mail_storage_set_critical(mbox->box.storage,
- "imapc: Reopening mailbox '%s' failed: %s",
+ const char *errmsg = t_strdup_printf(
+ "Reopening mailbox '%s' failed: %s",
mbox->box.name, reply->text_full);
- imapc_client_mailbox_reconnect(mbox->client_box);
+ imapc_client_mailbox_reconnect(mbox->client_box, errmsg);
}
imapc_client_stop(mbox->storage->client->client);
}