}
/* plug command line pipeline if no RCPT commands are yet issued */
- if (mail->next == NULL && mail->cmd_mail_from == trans->cmd_last) {
+ if (!trans->immediate && mail->next == NULL &&
+ mail->cmd_mail_from == trans->cmd_last) {
trans->cmd_plug = trans->cmd_last =
smtp_client_command_plug(trans->conn, trans->cmd_last);
}
trans->state = SMTP_CLIENT_TRANSACTION_STATE_PENDING;
smtp_client_connection_add_transaction(conn, trans);
+
+ if (trans->immediate) {
+ trans->state = SMTP_CLIENT_TRANSACTION_STATE_MAIL_FROM;
+
+ if (!trans->submitting)
+ smtp_client_transaction_submit_more(trans);
+ }
}
#undef smtp_client_transaction_start_empty
rcpt->rcpt_callback = NULL;
/* plug command line pipeline if DATA command is not yet issued */
- if (!trans->reset && rcpt->cmd_rcpt_to == trans->cmd_last &&
- trans->cmd_data == NULL) {
+ if (!trans->immediate && !trans->reset &&
+ rcpt->cmd_rcpt_to == trans->cmd_last && trans->cmd_data == NULL) {
trans->cmd_plug = trans->cmd_last =
smtp_client_command_plug(trans->conn, trans->cmd_last);
}
smtp_client_transaction_data_cb, trans);
trans->submitted_data = TRUE;
- i_assert(trans->cmd_last != NULL);
- smtp_client_command_unlock(trans->cmd_last);
+ if (trans->cmd_last != NULL)
+ smtp_client_command_unlock(trans->cmd_last);
smtp_client_transaction_try_complete(trans);
}
trans->conn, 0, trans->cmd_last,
smtp_client_transaction_rset_cb, trans);
- i_assert(trans->cmd_last != NULL);
- smtp_client_command_unlock(trans->cmd_last);
+ if (trans->cmd_last != NULL)
+ smtp_client_command_unlock(trans->cmd_last);
smtp_client_transaction_try_complete(trans);
}
static void
-smtp_client_transaction_submit_more(struct smtp_client_transaction *trans)
+smtp_client_transaction_do_submit_more(struct smtp_client_transaction *trans)
{
timeout_remove(&trans->to_send);
+ if (trans->immediate)
+ trans->cmd_last = NULL;
+
/* Check whether we already failed */
if (trans->failure == NULL &&
trans->state > SMTP_CLIENT_TRANSACTION_STATE_MAIL_FROM)
mail->mail_from, &mail->mail_params,
smtp_client_transaction_mail_cb, trans);
}
- smtp_client_command_lock(trans->cmd_last);
+
+ if (!trans->immediate)
+ smtp_client_command_lock(trans->cmd_last);
}
/* RCPT */
rcpt->rcpt_to, &rcpt->rcpt_params,
smtp_client_transaction_rcpt_cb, rcpt);
}
- smtp_client_command_lock(trans->cmd_last);
+ if (!trans->immediate)
+ smtp_client_command_lock(trans->cmd_last);
}
- if (trans->cmd_plug != NULL && trans->cmd_last != trans->cmd_plug)
+ if (trans->cmd_plug != NULL &&
+ (trans->immediate || trans->cmd_last != trans->cmd_plug))
smtp_client_command_abort(&trans->cmd_plug);
/* DATA / RSET */
}
}
+static void
+smtp_client_transaction_submit_more(struct smtp_client_transaction *trans)
+{
+ smtp_client_transaction_ref(trans);
+ trans->submitting = TRUE;
+ smtp_client_transaction_do_submit_more(trans);
+ trans->submitting = FALSE;
+ smtp_client_transaction_unref(&trans);
+}
+
static void
smtp_client_transaction_submit(struct smtp_client_transaction *trans,
bool start)
/* Cannot submit commands at this time */
return;
}
+
+ if (trans->immediate) {
+ /* Submit immediately if not failed already: avoid calling
+ failure callbacks directly (which is the first thing
+ smtp_client_transaction_submit_more() would do). */
+ if (trans->failure == NULL &&
+ trans->state > SMTP_CLIENT_TRANSACTION_STATE_MAIL_FROM)
+ trans->failure = trans->mail_failure;
+ if (trans->failure == NULL) {
+ smtp_client_transaction_submit_more(trans);
+ return;
+ }
+ }
+
if (trans->to_send != NULL) {
/* Already scheduled command submission */
return;
smtp_client_connection_next_transaction(trans->conn, trans);
}
+void smtp_client_transaction_set_immediate(
+ struct smtp_client_transaction *trans, bool immediate)
+{
+ trans->immediate = immediate;
+}
+
void smtp_client_transaction_connection_result(
struct smtp_client_transaction *trans,
const struct smtp_reply *reply)