smtp_server_connection_trigger_output(cmd->context.conn);
}
-void smtp_server_command_next_to_reply(struct smtp_server_command *cmd)
+bool smtp_server_command_next_to_reply(struct smtp_server_command **_cmd)
{
+ struct smtp_server_command *cmd = *_cmd;
+
smtp_server_command_debug(&cmd->context, "Next to reply");
- smtp_server_command_call_hooks(&cmd, SMTP_SERVER_COMMAND_HOOK_NEXT);
+ return smtp_server_command_call_hooks(
+ _cmd, SMTP_SERVER_COMMAND_HOOK_NEXT);
}
-static void
-smtp_server_command_replied(struct smtp_server_command *cmd)
+static bool
+smtp_server_command_replied(struct smtp_server_command **_cmd)
{
+ struct smtp_server_command *cmd = *_cmd;
+
if (cmd->replies_submitted < cmd->replies_expected)
- return;
+ return TRUE;
smtp_server_command_debug(&cmd->context, "Replied");
- smtp_server_command_call_hooks(&cmd, SMTP_SERVER_COMMAND_HOOK_REPLIED);
+ return smtp_server_command_call_hooks(
+ _cmd, SMTP_SERVER_COMMAND_HOOK_REPLIED);
}
-void smtp_server_command_completed(struct smtp_server_command *cmd)
+bool smtp_server_command_completed(struct smtp_server_command **_cmd)
{
+ struct smtp_server_command *cmd = *_cmd;
+
if (cmd->replies_submitted < cmd->replies_expected)
- return;
+ return TRUE;
smtp_server_command_debug(&cmd->context, "Completed");
- smtp_server_command_call_hooks(&cmd, SMTP_SERVER_COMMAND_HOOK_COMPLETED);
+ return smtp_server_command_call_hooks(
+ _cmd, SMTP_SERVER_COMMAND_HOOK_COMPLETED);
}
static bool
smtp_server_connection_ref(conn);
- smtp_server_command_replied(cmd);
+ if (!smtp_server_command_replied(&cmd))
+ return smtp_server_connection_unref(&conn);
/* submit reply */
switch (cmd->state) {
}
if (cmd != NULL && conn->command_queue_head == cmd)
- smtp_server_command_next_to_reply(cmd);
+ (void)smtp_server_command_next_to_reply(&cmd);
smtp_server_connection_timeout_update(conn);
return (cmd == NULL || !cmd->input_locked);
}
if (cmd->state < SMTP_SERVER_COMMAND_STATE_READY_TO_REPLY) {
- smtp_server_command_next_to_reply(cmd);
+ (void)smtp_server_command_next_to_reply(&cmd);
return FALSE;
}
i_assert(cmd->state == SMTP_SERVER_COMMAND_STATE_READY_TO_REPLY &&
array_is_created(&cmd->replies));
- smtp_server_command_completed(cmd);
+ if (!smtp_server_command_completed(&cmd))
+ return TRUE;
/* send command replies */
// FIXME: handle LMTP DATA command with enormous number of recipients;
int smtp_server_connection_flush(struct smtp_server_connection *conn);
void smtp_server_command_ready_to_reply(struct smtp_server_command *cmd);
-void smtp_server_command_next_to_reply(struct smtp_server_command *cmd);
-void smtp_server_command_completed(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);
+bool smtp_server_command_completed(struct smtp_server_command **_cmd);
+
static inline bool
smtp_server_command_is_complete(struct smtp_server_command *cmd)
{