"Connection failed: %s", smtp_reply_log(reply));
smtp_client_connection_ref(conn);
+ conn->failing = TRUE;
- smtp_client_connection_login_callback(conn, reply);
- smtp_client_connection_commands_fail_reply(conn, reply);
smtp_client_connection_disconnect(conn);
+ smtp_client_connection_login_callback(conn, reply);
trans = conn->transactions_head;
while (trans != NULL) {
trans = trans_next;
}
+ smtp_client_connection_commands_fail_reply(conn, reply);
+
+ conn->failing = FALSE;
smtp_client_connection_unref(&conn);
}
smtp_client_connection_set_state(conn,
SMTP_CLIENT_CONNECTION_STATE_DISCONNECTED);
- smtp_client_connection_login_fail(conn,
- SMTP_CLIENT_COMMAND_ERROR_ABORTED,
- "Disconnected from server");
- smtp_client_connection_commands_fail(conn,
- SMTP_CLIENT_COMMAND_ERROR_ABORTED,
- "Disconnected from server");
+
+ if (!conn->failing) {
+ smtp_client_connection_login_fail(conn,
+ SMTP_CLIENT_COMMAND_ERROR_ABORTED,
+ "Disconnected from server");
+ smtp_client_connection_commands_fail(conn,
+ SMTP_CLIENT_COMMAND_ERROR_ABORTED,
+ "Disconnected from server");
+ }
}
struct smtp_client_connection *
if (conn->reply_parser != NULL)
smtp_reply_parser_deinit(&conn->reply_parser);
+ smtp_client_connection_login_fail(conn,
+ SMTP_CLIENT_COMMAND_ERROR_ABORTED,
+ "Connection destroy");
+ smtp_client_connection_commands_fail(conn,
+ SMTP_CLIENT_COMMAND_ERROR_ABORTED,
+ "Connection destroy");
+
connection_deinit(&conn->conn);
i_free(conn->ips);
struct smtp_client_transaction_rcpt *rcpt =
trans->rcpts_queue_head;
- if (rcpt->cmd_rcpt_to != NULL &&
- conn->state != SMTP_CLIENT_CONNECTION_STATE_DISCONNECTED)
+ if (rcpt->cmd_rcpt_to != NULL)
smtp_client_command_abort(&rcpt->cmd_rcpt_to);
smtp_client_transaction_rcpt_free(&rcpt);
}
- if (conn->state != SMTP_CLIENT_CONNECTION_STATE_DISCONNECTED) {
- if (trans->cmd_data != NULL)
- smtp_client_command_abort(&trans->cmd_data);
- if (trans->cmd_rset != NULL)
- smtp_client_command_abort(&trans->cmd_rset);
- if (trans->cmd_plug != NULL)
- smtp_client_command_abort(&trans->cmd_plug);
- }
+ if (trans->cmd_data != NULL)
+ smtp_client_command_abort(&trans->cmd_data);
+ if (trans->cmd_rset != NULL)
+ smtp_client_command_abort(&trans->cmd_rset);
+ if (trans->cmd_plug != NULL)
+ smtp_client_command_abort(&trans->cmd_plug);
trans->cmd_data = NULL;
trans->cmd_rset = NULL;
trans->cmd_plug = NULL;
void smtp_client_transaction_fail_reply(struct smtp_client_transaction *trans,
const struct smtp_reply *reply)
{
- struct smtp_client_connection *conn = trans->conn;
struct smtp_client_transaction_rcpt *rcpt, *rcpt_next;
if (reply == NULL)
/* plug */
if (trans->failure == NULL)
trans->failure = smtp_reply_clone(trans->pool, reply);
- if (trans->cmd_plug != NULL &&
- conn->state != SMTP_CLIENT_CONNECTION_STATE_DISCONNECTED)
+ if (trans->cmd_plug != NULL)
smtp_client_command_abort(&trans->cmd_plug);
trans->cmd_plug = NULL;