]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: client: transaction: Add support for aborting a pending RCPT command.
authorStephan Bosch <stephan.bosch@dovecot.fi>
Sat, 29 Sep 2018 22:37:10 +0000 (00:37 +0200)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Tue, 12 Feb 2019 13:40:48 +0000 (15:40 +0200)
src/lib-smtp/smtp-client-transaction.c
src/lib-smtp/smtp-client-transaction.h

index bbab299332bf1d1c76dd8c6c8bfd43b030e9c2ea..717e0346fee9d01db13a2b744e2eebabfda12bda 100644 (file)
@@ -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
index a031545c81440f7b4731e66d00958f91399a1438..811b8420d41c219fd927576a923fcc5445c50162 100644 (file)
@@ -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