From: Stephan Bosch Date: Fri, 5 Nov 2021 15:46:15 +0000 (+0100) Subject: lib-smtp: smtp-server-command - Split off smtp_server_command_send_replies(). X-Git-Tag: 2.3.18~146 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9ae95cb88417fa8d817aae714ceaea4b46bd4a39;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: smtp-server-command - Split off smtp_server_command_send_replies(). --- diff --git a/src/lib-smtp/smtp-server-command.c b/src/lib-smtp/smtp-server-command.c index ed4b0258be..a7bf47dd35 100644 --- a/src/lib-smtp/smtp-server-command.c +++ b/src/lib-smtp/smtp-server-command.c @@ -692,6 +692,44 @@ bool smtp_server_command_replied_success(struct smtp_server_command *cmd) return success; } +bool smtp_server_command_send_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++) { + struct smtp_server_reply *reply; + + reply = array_idx_modifiable(&cmd->replies, i); + + if (!reply->submitted) { + i_assert(!reply->sent); + cmd->state = SMTP_SERVER_COMMAND_STATE_PROCESSING; + break; + } + if (smtp_server_reply_send(reply) < 0) + return FALSE; + } + if (cmd->state == SMTP_SERVER_COMMAND_STATE_PROCESSING) + return FALSE; + + smtp_server_command_finished(cmd); + return TRUE; +} + void smtp_server_command_finished(struct smtp_server_command *cmd) { struct smtp_server_connection *conn = cmd->context.conn; diff --git a/src/lib-smtp/smtp-server-connection.c b/src/lib-smtp/smtp-server-connection.c index 43abb24f74..092cc0c332 100644 --- a/src/lib-smtp/smtp-server-connection.c +++ b/src/lib-smtp/smtp-server-connection.c @@ -626,7 +626,6 @@ static bool smtp_server_connection_next_reply(struct smtp_server_connection *conn) { struct smtp_server_command *cmd; - unsigned int i; cmd = conn->command_queue_head; if (cmd == NULL) { @@ -635,38 +634,7 @@ smtp_server_connection_next_reply(struct smtp_server_connection *conn) return FALSE; } - 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++) { - struct smtp_server_reply *reply; - - reply = array_idx_modifiable(&cmd->replies, i); - - if (!reply->submitted) { - i_assert(!reply->sent); - cmd->state = SMTP_SERVER_COMMAND_STATE_PROCESSING; - break; - } - if (smtp_server_reply_send(reply) < 0) - return FALSE; - } - if (cmd->state == SMTP_SERVER_COMMAND_STATE_PROCESSING) - return FALSE; - - smtp_server_command_finished(cmd); - return TRUE; + return smtp_server_command_send_replies(cmd); } void smtp_server_connection_cork(struct smtp_server_connection *conn) diff --git a/src/lib-smtp/smtp-server-private.h b/src/lib-smtp/smtp-server-private.h index e4fe4f4ada..136256a092 100644 --- a/src/lib-smtp/smtp-server-private.h +++ b/src/lib-smtp/smtp-server-private.h @@ -264,6 +264,7 @@ void smtp_server_command_submit_reply(struct smtp_server_command *cmd); int smtp_server_connection_flush(struct smtp_server_connection *conn); void smtp_server_command_ready_to_reply(struct smtp_server_command *cmd); +bool smtp_server_command_send_replies(struct smtp_server_command *cmd); void smtp_server_command_finished(struct smtp_server_command *cmd); bool smtp_server_command_next_to_reply(struct smtp_server_command **_cmd);