}
static void
-smtp_client_transaction_finish(struct smtp_client_transaction *trans)
+smtp_client_transaction_finish(struct smtp_client_transaction *trans,
+ const struct smtp_reply *final_reply ATTR_UNUSED)
{
struct smtp_client_connection *conn = trans->conn;
trans->data_callback = NULL;
/* finished */
- smtp_client_transaction_finish(trans);
+ smtp_client_transaction_finish(
+ trans, (trans->data_failure == NULL ? reply :
+ trans->data_failure));
smtp_client_transaction_unref(&trans);
}
static void
smtp_client_transaction_send_data(struct smtp_client_transaction *trans)
{
- bool finished = FALSE;
+ struct smtp_reply failure;
i_assert(!trans->reset);
i_assert(trans->data_input != NULL);
timeout_remove(&trans->to_send);
+ i_zero(&failure);
if (trans->failure != NULL) {
smtp_client_transaction_fail_reply(trans, trans->failure);
- finished = TRUE;
+ failure = *trans->failure;
+ i_assert(failure.status != 0);
} else if ((trans->rcpts_count + trans->rcpts_queue_count) == 0) {
e_debug(trans->event, "No valid recipients");
- finished = TRUE;
+ if (trans->failure != NULL)
+ failure = *trans->failure;
+ else {
+ smtp_reply_init(&failure, 554, "No valid recipients");
+ failure.enhanced_code = SMTP_REPLY_ENH_CODE(5, 5, 0);
+ }
+ i_assert(failure.status != 0);
} else {
trans->cmd_data = smtp_client_command_data_submit_after(
trans->conn, 0, trans->cmd_last, trans->data_input,
smtp_client_command_abort(&trans->cmd_plug);
trans->cmd_last = NULL;
- if (finished)
- smtp_client_transaction_finish(trans);
+ if (failure.status != 0)
+ smtp_client_transaction_finish(trans, &failure);
i_stream_unref(&trans->data_input);
}
trans->reset_callback = NULL;
/* finished */
- smtp_client_transaction_finish(trans);
+ smtp_client_transaction_finish(trans, reply);
smtp_client_transaction_unref(&trans);
}