]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: client: transaction: Add support for aborting a pending MAIL command.
authorStephan Bosch <stephan.bosch@dovecot.fi>
Sat, 29 Sep 2018 22:35:26 +0000 (00:35 +0200)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 10 Oct 2018 09:49:07 +0000 (09:49 +0000)
src/lib-smtp/smtp-client-transaction.c
src/lib-smtp/smtp-client-transaction.h

index d2d136fb09d3bdf2653e77916fbfe0d735be8341..bbab299332bf1d1c76dd8c6c8bfd43b030e9c2ea 100644 (file)
@@ -82,6 +82,18 @@ smtp_client_transaction_mail_free(struct smtp_client_transaction_mail **_mail)
        pool_unref(&mail->pool);
 }
 
+void smtp_client_transaction_mail_abort(
+       struct smtp_client_transaction_mail **_mail)
+{
+       struct smtp_client_transaction_mail *mail = *_mail;
+       struct smtp_client_transaction *trans = mail->trans;
+
+       i_assert(trans->state <= SMTP_CLIENT_TRANSACTION_STATE_MAIL_FROM ||
+                trans->state == SMTP_CLIENT_TRANSACTION_STATE_ABORTED);
+
+       smtp_client_transaction_mail_free(_mail);
+}
+
 /*
  * Recipient
  */
@@ -608,11 +620,12 @@ smtp_client_transaction_mail_cb(const struct smtp_reply *reply,
 }
 
 #undef smtp_client_transaction_add_mail
-void smtp_client_transaction_add_mail(
-       struct smtp_client_transaction *trans,
-       const struct smtp_address *mail_from,
-       const struct smtp_params_mail *mail_params,
-       smtp_client_command_callback_t *mail_callback, void *context)
+struct smtp_client_transaction_mail *
+smtp_client_transaction_add_mail(struct smtp_client_transaction *trans,
+                                const struct smtp_address *mail_from,
+                                const struct smtp_params_mail *mail_params,
+                                smtp_client_command_callback_t *mail_callback,
+                                void *context)
 {
        struct smtp_client_transaction_mail *mail;
 
@@ -628,6 +641,8 @@ void smtp_client_transaction_add_mail(
        mail->context = context;
 
        smtp_client_transaction_submit(trans, FALSE);
+
+       return mail;
 }
 
 static void smtp_client_transaction_connection_ready(
index 545cd689d606a44ae2023ff16688b689ea663d0f..a031545c81440f7b4731e66d00958f91399a1438 100644 (file)
@@ -6,6 +6,7 @@
 
 struct smtp_address;
 struct smtp_client_transaction;
+struct smtp_client_transaction_mail;
 
 enum smtp_client_transaction_state {
        SMTP_CLIENT_TRANSACTION_STATE_NEW = 0,
@@ -106,13 +107,15 @@ void smtp_client_transaction_start_empty(
    than a single MAIL command (e.g. to have an implicit fallback sender address
    in the pipeline when the first one fails). Of course, only one MAIL command
    will succeed and therefore error replies for the others will not abort the
-   transaction. */
-void smtp_client_transaction_add_mail(
-       struct smtp_client_transaction *trans,
-       const struct smtp_address *mail_from,
-       const struct smtp_params_mail *mail_params,
-       smtp_client_command_callback_t *mail_callback, void *context)
-       ATTR_NULL(3,5);
+   transaction. This function returns struct that can be used to abort the
+   MAIL command prematurely (see below). */
+struct smtp_client_transaction_mail *
+smtp_client_transaction_add_mail(struct smtp_client_transaction *trans,
+                                const struct smtp_address *mail_from,
+                                const struct smtp_params_mail *mail_params,
+                                smtp_client_command_callback_t *mail_callback,
+                                void *context)
+       ATTR_NOWARN_UNUSED_RESULT ATTR_NULL(3,5);
 #define smtp_client_transaction_add_mail(trans, \
                mail_from, mail_params, mail_callback, context) \
        smtp_client_transaction_add_mail(trans, mail_from + \
@@ -120,6 +123,10 @@ void smtp_client_transaction_add_mail(
                        const struct smtp_reply *reply, typeof(context))), \
                mail_params, \
                (smtp_client_command_callback_t *)mail_callback, context)
+/* Abort the MAIL command prematurely. This function must not be called after
+   the mail_callback from smtp_client_transaction_add_mail() is called. */
+void smtp_client_transaction_mail_abort(
+       struct smtp_client_transaction_mail **_mail);
 
 /* Add recipient to the transaction with a RCPT TO command. The
    rcpt_to_callback is called once the server replies to the RCPT TO command.