From: Stephan Bosch Date: Sat, 29 Sep 2018 22:37:10 +0000 (+0200) Subject: lib-smtp: client: transaction: Add support for aborting a pending RCPT command. X-Git-Tag: 2.3.9~1245 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=210e323bb1f9febc67628c04470589c50270b6aa;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: client: transaction: Add support for aborting a pending RCPT command. --- diff --git a/src/lib-smtp/smtp-client-transaction.c b/src/lib-smtp/smtp-client-transaction.c index bbab299332..717e0346fe 100644 --- a/src/lib-smtp/smtp-client-transaction.c +++ b/src/lib-smtp/smtp-client-transaction.c @@ -195,6 +195,20 @@ smtp_client_transaction_rcpt_denied( smtp_client_transaction_rcpt_free(&prcpt); } +void smtp_client_transaction_rcpt_abort( + struct smtp_client_transaction_rcpt **_rcpt) +{ + struct smtp_client_transaction_rcpt *rcpt = *_rcpt; + struct smtp_client_transaction *trans = rcpt->trans; + + i_assert(rcpt->queued); + + i_assert(trans->state <= SMTP_CLIENT_TRANSACTION_STATE_RCPT_TO || + trans->state == SMTP_CLIENT_TRANSACTION_STATE_ABORTED); + + smtp_client_transaction_rcpt_free(_rcpt); +} + /* * Transaction */ @@ -733,12 +747,13 @@ smtp_client_transaction_rcpt_cb(const struct smtp_reply *reply, } #undef smtp_client_transaction_add_rcpt -void smtp_client_transaction_add_rcpt( - struct smtp_client_transaction *trans, - const struct smtp_address *rcpt_to, - const struct smtp_params_rcpt *rcpt_params, - smtp_client_command_callback_t *rcpt_callback, - smtp_client_command_callback_t *data_callback, void *context) +struct smtp_client_transaction_rcpt * +smtp_client_transaction_add_rcpt(struct smtp_client_transaction *trans, + const struct smtp_address *rcpt_to, + const struct smtp_params_rcpt *rcpt_params, + smtp_client_command_callback_t *rcpt_callback, + smtp_client_command_callback_t *data_callback, + void *context) { struct smtp_client_transaction_rcpt *rcpt; @@ -759,6 +774,8 @@ void smtp_client_transaction_add_rcpt( rcpt->context = context; smtp_client_transaction_submit(trans, FALSE); + + return rcpt; } static void diff --git a/src/lib-smtp/smtp-client-transaction.h b/src/lib-smtp/smtp-client-transaction.h index a031545c81..811b8420d4 100644 --- a/src/lib-smtp/smtp-client-transaction.h +++ b/src/lib-smtp/smtp-client-transaction.h @@ -7,6 +7,7 @@ struct smtp_address; struct smtp_client_transaction; struct smtp_client_transaction_mail; +struct smtp_client_transaction_rcpt; enum smtp_client_transaction_state { SMTP_CLIENT_TRANSACTION_STATE_NEW = 0, @@ -135,13 +136,14 @@ void smtp_client_transaction_mail_abort( smtp_client_transaction_send() is called for the transaction (see below). Until that time, any failure is remembered. */ -void smtp_client_transaction_add_rcpt( - struct smtp_client_transaction *trans, - const struct smtp_address *rcpt_to, - const struct smtp_params_rcpt *rcpt_params, - smtp_client_command_callback_t *rcpt_callback, - smtp_client_command_callback_t *data_callback, void *context) - ATTR_NULL(3,5,6); +struct smtp_client_transaction_rcpt * +smtp_client_transaction_add_rcpt(struct smtp_client_transaction *trans, + const struct smtp_address *rcpt_to, + const struct smtp_params_rcpt *rcpt_params, + smtp_client_command_callback_t *rcpt_callback, + smtp_client_command_callback_t *data_callback, + void *context) + ATTR_NOWARN_UNUSED_RESULT ATTR_NULL(3,5,6); #define smtp_client_transaction_add_rcpt(trans, \ rcpt_to, rcpt_params, rcpt_callback, data_callback, context) \ smtp_client_transaction_add_rcpt(trans, rcpt_to + \ @@ -152,6 +154,10 @@ void smtp_client_transaction_add_rcpt( rcpt_params, \ (smtp_client_command_callback_t *)rcpt_callback, \ (smtp_client_command_callback_t *)data_callback, context) +/* Abort the RCPT command prematurely. This function must not be called after + the rcpt_callback from smtp_client_transaction_add_rcpt() is called. */ +void smtp_client_transaction_rcpt_abort( + struct smtp_client_transaction_rcpt **_rcpt); /* Start sending input stream as DATA. This completes the transaction, which means that any pending failures that got recorded before this function was