smtp_client_connection_transactions_fail_reply(conn, &reply);
}
+static void
+smtp_client_connection_transactions_drop(struct smtp_client_connection *conn)
+{
+ struct smtp_client_transaction *trans;
+
+ trans = conn->transactions_head;
+ while (trans != NULL) {
+ struct smtp_client_transaction *trans_next = trans->next;
+ smtp_client_transaction_connection_destroyed(trans);
+ trans = trans_next;
+ }
+}
+
static void
smtp_client_connection_login_callback(struct smtp_client_connection *conn,
const struct smtp_reply *reply)
smtp_client_connection_commands_fail(
conn, SMTP_CLIENT_COMMAND_ERROR_ABORTED,
"Connection destroy");
+ smtp_client_connection_transactions_drop(conn);
connection_deinit(&conn->conn);
void smtp_client_transaction_set_event(struct smtp_client_transaction *trans,
struct event *event)
{
+ i_assert(trans->conn != NULL);
event_unref(&trans->event);
trans->event = event_create(event);
event_set_forced_debug(trans->event, trans->conn->set.debug);
e_debug(trans->event, "Got MAIL reply: %s", smtp_reply_log(reply));
i_assert(mail != NULL);
+ i_assert(trans->conn != NULL);
if (success) {
if (trans->sender_accepted) {
struct smtp_client_transaction_mail *mail = trans->mail_head;
i_assert(trans->state == SMTP_CLIENT_TRANSACTION_STATE_NEW);
+ i_assert(trans->conn != NULL);
i_assert(mail != NULL);
event_add_str(trans->event, "mail_from",
{
struct smtp_client_transaction *trans = rcpt->trans;
+ i_assert(trans->conn != NULL);
+
e_debug(trans->event, "Got RCPT reply: %s", smtp_reply_log(reply));
/* plug command line pipeline if DATA command is not yet issued */
}
i_assert(failure.status != 0);
} else {
+ i_assert(trans->conn != NULL);
+
trans->cmd_data = smtp_client_command_data_submit_after(
trans->conn, 0, trans->cmd_last, trans->data_input,
smtp_client_transaction_data_cb, trans);
failure = *trans->failure;
i_assert(failure.status != 0);
} else {
+ i_assert(trans->conn != NULL);
+
trans->cmd_rset = smtp_client_command_rset_submit_after(
trans->conn, 0, trans->cmd_last,
smtp_client_transaction_rset_cb, trans);
return;
}
+ i_assert(trans->conn != NULL);
+
/* Make sure transaction is started */
if (trans->state == SMTP_CLIENT_TRANSACTION_STATE_NEW) {
enum smtp_client_transaction_state state;
static void
smtp_client_transaction_try_complete(struct smtp_client_transaction *trans)
{
+ i_assert(trans->conn != NULL);
+
if (trans->rcpts_queue_count > 0) {
/* Not all RCPT replies have come in yet */
e_debug(trans->event, "RCPT replies are still pending (%u/%u)",
smtp_client_transaction_connection_ready(trans);
}
+void smtp_client_transaction_connection_destroyed(
+ struct smtp_client_transaction *trans)
+{
+ i_assert(trans->failure != NULL);
+ smtp_client_connection_unref(&trans->conn);
+}
+
const struct smtp_client_transaction_times *
smtp_client_transaction_get_times(struct smtp_client_transaction *trans)
{
case SMTP_CLIENT_TRANSACTION_STATE_NEW:
break;
case SMTP_CLIENT_TRANSACTION_STATE_PENDING:
+ i_assert(trans->conn != NULL);
conn_state = smtp_client_connection_get_state(trans->conn);
switch (conn_state) {
case SMTP_CLIENT_CONNECTION_STATE_CONNECTING: