]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: smtp-server-command - Split off smtp_server_command_send_more_replies().
authorStephan Bosch <stephan.bosch@open-xchange.com>
Fri, 5 Nov 2021 15:53:48 +0000 (16:53 +0100)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Wed, 10 Nov 2021 08:44:08 +0000 (08:44 +0000)
src/lib-smtp/smtp-server-command.c

index a7bf47dd353b9fe028da0bca8afa5af11d418834..d2e75a6832cdf6c93a2bf910771557b0df74e4bd 100644 (file)
@@ -692,22 +692,11 @@ bool smtp_server_command_replied_success(struct smtp_server_command *cmd)
        return success;
 }
 
-bool smtp_server_command_send_replies(struct smtp_server_command *cmd)
+static int
+smtp_server_command_send_more_replies(struct smtp_server_command *cmd)
 {
        unsigned int i;
 
-       if (!smtp_server_command_next_to_reply(&cmd))
-               return FALSE;
-       if (cmd->state < SMTP_SERVER_COMMAND_STATE_READY_TO_REPLY)
-               return FALSE;
-
-       i_assert(cmd->state == SMTP_SERVER_COMMAND_STATE_READY_TO_REPLY &&
-                array_is_created(&cmd->replies));
-
-       if (!smtp_server_command_completed(&cmd))
-               return TRUE;
-
-       /* Send command replies */
        // FIXME: handle LMTP DATA command with enormous number of recipients;
        // i.e. don't keep filling output stream with replies indefinitely.
        for (i = 0; i < cmd->replies_expected; i++) {
@@ -717,14 +706,38 @@ bool smtp_server_command_send_replies(struct smtp_server_command *cmd)
 
                if (!reply->submitted) {
                        i_assert(!reply->sent);
-                       cmd->state = SMTP_SERVER_COMMAND_STATE_PROCESSING;
-                       break;
+                       return 0;
                }
                if (smtp_server_reply_send(reply) < 0)
-                       return FALSE;
+                       return -1;
        }
-       if (cmd->state == SMTP_SERVER_COMMAND_STATE_PROCESSING)
+
+       return 1;
+}
+
+bool smtp_server_command_send_replies(struct smtp_server_command *cmd)
+{
+       int ret;
+
+       if (!smtp_server_command_next_to_reply(&cmd))
+               return FALSE;
+       if (cmd->state < SMTP_SERVER_COMMAND_STATE_READY_TO_REPLY)
+               return FALSE;
+
+       i_assert(cmd->state == SMTP_SERVER_COMMAND_STATE_READY_TO_REPLY &&
+                array_is_created(&cmd->replies));
+
+       if (!smtp_server_command_completed(&cmd))
+               return TRUE;
+
+       /* Send command replies */
+       ret = smtp_server_command_send_more_replies(cmd);
+       if (ret < 0)
                return FALSE;
+       if (ret == 0) {
+               cmd->state = SMTP_SERVER_COMMAND_STATE_PROCESSING;
+               return FALSE;
+       }
 
        smtp_server_command_finished(cmd);
        return TRUE;