cmd_mail_check_state(struct smtp_server_cmd_ctx *cmd)
{
struct smtp_server_connection *conn = cmd->conn;
- struct smtp_server_command *command = cmd->cmd;
if (conn->state.trans != NULL) {
- if (!smtp_server_command_is_replied(command)) {
- conn->state.pending_mail_cmds--;
- smtp_server_command_remove_hook(
- command, SMTP_SERVER_COMMAND_HOOK_REPLIED,
- cmd_mail_replied);
- }
smtp_server_reply(cmd, 503, "5.5.0", "MAIL already given");
return FALSE;
}
}
static void
-cmd_mail_replied(struct smtp_server_cmd_ctx *cmd,
- struct smtp_server_cmd_mail *data)
+cmd_mail_completed(struct smtp_server_cmd_ctx *cmd,
+ struct smtp_server_cmd_mail *data)
{
struct smtp_server_connection *conn = cmd->conn;
struct smtp_server_command *command = cmd->cmd;
conn->state.pending_mail_cmds--;
i_assert(smtp_server_command_is_replied(command));
- if (!smtp_server_command_replied_success(command)) {
- /* failure; substitute our own error if predictable */
- (void)cmd_mail_check_state(cmd);
+ if (!smtp_server_command_replied_success(command))
return;
- }
/* success */
conn->state.trans = smtp_server_transaction_create(conn,
}
}
+static void
+cmd_mail_replied(struct smtp_server_cmd_ctx *cmd,
+ struct smtp_server_cmd_mail *data ATTR_UNUSED)
+{
+ struct smtp_server_command *command = cmd->cmd;
+
+ i_assert(smtp_server_command_is_replied(command));
+ if (!smtp_server_command_replied_success(command)) {
+ /* failure; substitute our own error if predictable */
+ (void)cmd_mail_check_state(cmd);
+ return;
+ }
+}
+
static void
cmd_mail_recheck(struct smtp_server_cmd_ctx *cmd,
struct smtp_server_cmd_mail *data ATTR_UNUSED)
cmd_mail_recheck, mail_data);
smtp_server_command_add_hook(command, SMTP_SERVER_COMMAND_HOOK_REPLIED,
cmd_mail_replied, mail_data);
+ smtp_server_command_add_hook(command, SMTP_SERVER_COMMAND_HOOK_COMPLETED,
+ cmd_mail_completed, mail_data);
smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_MAIL_FROM);
conn->state.pending_mail_cmds++;