]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: smtp-client-transaction - Handle RCPT reply in a separate _rcpt function.
authorStephan Bosch <stephan.bosch@dovecot.fi>
Sat, 9 Feb 2019 11:14:21 +0000 (12:14 +0100)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Fri, 28 Jun 2019 07:09:28 +0000 (10:09 +0300)
src/lib-smtp/smtp-client-transaction.c

index 37c0976edd3db7827260a1599ad439b742d84ef6..37f244cc1c9d8bf65c10de5e257bbba4b9327f3a 100644 (file)
@@ -255,6 +255,29 @@ smtp_client_transaction_rcpt_denied(
        smtp_client_transaction_rcpt_free(&prcpt);
 }
 
+static void
+smtp_client_transaction_rcpt_replied(
+       struct smtp_client_transaction_rcpt **_rcpt,
+       const struct smtp_reply *reply)
+{
+       struct smtp_client_transaction_rcpt *rcpt = *_rcpt;
+       bool success = smtp_reply_is_success(reply);
+       smtp_client_command_callback_t *rcpt_callback = rcpt->rcpt_callback;
+       void *context = rcpt->context;
+
+       rcpt->rcpt_callback = NULL;
+       rcpt->failed = !success;
+
+       if (success)
+               smtp_client_transaction_rcpt_approved(_rcpt);
+       else
+               smtp_client_transaction_rcpt_denied(_rcpt);
+
+       /* call the callback */
+       if (rcpt_callback != NULL)
+               rcpt_callback(reply, context);
+}
+
 void smtp_client_transaction_rcpt_abort(
        struct smtp_client_transaction_rcpt **_rcpt)
 {
@@ -807,15 +830,9 @@ smtp_client_transaction_rcpt_cb(const struct smtp_reply *reply,
                                struct smtp_client_transaction_rcpt *rcpt)
 {
        struct smtp_client_transaction *trans = rcpt->trans;
-       bool success = smtp_reply_is_success(reply);
-       smtp_client_command_callback_t *rcpt_callback = rcpt->rcpt_callback;
-       void *context = rcpt->context;
 
        e_debug(trans->event, "Got RCPT reply: %s", smtp_reply_log(reply));
 
-       rcpt->failed = !success;
-       rcpt->rcpt_callback = NULL;
-
        /* plug command line pipeline if DATA command is not yet issued */
        if (!trans->immediate && !trans->reset &&
            rcpt->cmd_rcpt_to == trans->cmd_last && trans->cmd_data == NULL) {
@@ -824,18 +841,14 @@ smtp_client_transaction_rcpt_cb(const struct smtp_reply *reply,
        }
        rcpt->cmd_rcpt_to = NULL;
 
-       if (success)
-               smtp_client_transaction_rcpt_approved(&rcpt);
-       else
-               smtp_client_transaction_rcpt_denied(&rcpt);
-
-       /* call the callback */
        {
                enum smtp_client_transaction_state state;
                struct smtp_client_transaction *tmp_trans = trans;
 
                smtp_client_transaction_ref(tmp_trans);
-               rcpt_callback(reply, context);
+
+               smtp_client_transaction_rcpt_replied(&rcpt, reply);
+
                state = trans->state;
                smtp_client_transaction_unref(&tmp_trans);
                if (state >= SMTP_CLIENT_TRANSACTION_STATE_FINISHED)