]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: client: transaction: Move initiation of command submission to a central...
authorStephan Bosch <stephan.bosch@dovecot.fi>
Sun, 30 Sep 2018 21:56:57 +0000 (23:56 +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

index 637ade8d0eaf84db4c897ae4b866bc7e7f26ff30..9babcc9908d0cb71655147780ac44ba31ef1fffe 100644 (file)
@@ -29,6 +29,10 @@ const char *const smtp_client_transaction_state_names[] = {
 
 static void
 smtp_client_transaction_submit_more(struct smtp_client_transaction *trans);
+static void
+smtp_client_transaction_submit(struct smtp_client_transaction *trans,
+                              bool start);
+
 static void
 smtp_client_transaction_try_complete(struct smtp_client_transaction *trans);
 
@@ -607,12 +611,7 @@ void smtp_client_transaction_add_rcpt(
        rcpt->data_callback = data_callback;
        rcpt->context = context;
 
-       if (trans->to_send == NULL &&
-               (trans->state > SMTP_CLIENT_TRANSACTION_STATE_PENDING ||
-                       trans->failure != NULL)) {
-               trans->to_send = timeout_add_short(0,
-                       smtp_client_transaction_submit_more, trans);
-       }
+       smtp_client_transaction_submit(trans, FALSE);
 }
 
 static void
@@ -722,10 +721,7 @@ void smtp_client_transaction_send(
                        smtp_client_transaction_timeout, trans);
        }
 
-       if (trans->to_send == NULL) {
-               trans->to_send = timeout_add_short(0,
-                       smtp_client_transaction_submit_more, trans);
-       }
+       smtp_client_transaction_submit(trans, TRUE);
 }
 
 static void
@@ -788,6 +784,24 @@ smtp_client_transaction_submit_more(struct smtp_client_transaction *trans)
                smtp_client_transaction_send_data(trans);
 }
 
+static void
+smtp_client_transaction_submit(struct smtp_client_transaction *trans,
+                              bool start)
+{
+       if (trans->failure == NULL && !start &&
+           trans->state <= SMTP_CLIENT_TRANSACTION_STATE_PENDING) {
+               /* Cannot submit commands at this time */
+               return;
+       }
+       if (trans->to_send != NULL) {
+               /* Already scheduled command submission */
+               return;
+       }
+
+       trans->to_send = timeout_add_short(0,
+               smtp_client_transaction_submit_more, trans);
+}
+
 static void
 smtp_client_transaction_try_complete(struct smtp_client_transaction *trans)
 {