i_stream_unref(&data_cmd->chunk_input);
}
+static void
+cmd_data_replied_one(struct smtp_server_cmd_ctx *cmd,
+ struct cmd_data_context *data_cmd ATTR_UNUSED)
+{
+ struct smtp_server_connection *conn = cmd->conn;
+ struct smtp_server_transaction *trans = conn->state.trans;
+ struct smtp_server_recipient **rcptp;
+
+ if (trans == NULL || !array_is_created(&trans->rcpt_to))
+ return;
+
+ array_foreach_modifiable(&trans->rcpt_to, rcptp)
+ smtp_server_recipient_data_replied(*rcptp);
+}
+
static void
cmd_data_replied(struct smtp_server_cmd_ctx *cmd,
struct cmd_data_context *data_cmd ATTR_UNUSED)
smtp_server_command_add_hook(command, SMTP_SERVER_COMMAND_HOOK_NEXT,
cmd_data_start, data_cmd);
+ smtp_server_command_add_hook(command, SMTP_SERVER_COMMAND_HOOK_REPLIED_ONE,
+ cmd_data_replied_one, data_cmd);
smtp_server_command_add_hook(command, SMTP_SERVER_COMMAND_HOOK_REPLIED,
cmd_data_replied, data_cmd);
smtp_server_command_add_hook(command, SMTP_SERVER_COMMAND_HOOK_DESTROY,
void smtp_server_recipient_last_data(struct smtp_server_recipient *rcpt,
struct smtp_server_cmd_ctx *cmd);
+void smtp_server_recipient_data_replied(struct smtp_server_recipient *rcpt);
void smtp_server_recipient_reset(struct smtp_server_recipient *rcpt);
void smtp_server_recipient_finished(struct smtp_server_recipient *rcpt,
rcpt->cmd = cmd;
}
+void smtp_server_recipient_data_replied(struct smtp_server_recipient *rcpt)
+{
+ unsigned int reply_index = 0;
+
+ if (rcpt->replied)
+ return;
+ if (HAS_ALL_BITS(rcpt->trans->flags,
+ SMTP_SERVER_TRANSACTION_FLAG_REPLY_PER_RCPT))
+ reply_index = rcpt->index;
+ if (smtp_server_command_get_reply(rcpt->cmd->cmd, reply_index) == NULL)
+ return;
+ rcpt->replied = TRUE;
+ if (!smtp_server_recipient_call_hooks(
+ &rcpt, SMTP_SERVER_RECIPIENT_HOOK_DATA_REPLIED)) {
+ /* nothing to do */
+ }
+}
+
bool smtp_server_recipient_is_replied(struct smtp_server_recipient *rcpt)
{
i_assert(rcpt->cmd != NULL);
/* approved: the server is about to approve this recipient by sending
a success reply to the RCPT command. */
SMTP_SERVER_RECIPIENT_HOOK_APPROVED,
+ /* data_replied: the DATA command is replied for this recipient */
+ SMTP_SERVER_RECIPIENT_HOOK_DATA_REPLIED,
/* destroy: recipient is about to be destroyed. */
SMTP_SERVER_RECIPIENT_HOOK_DESTROY
};
void *context;
+ bool replied:1;
bool finished:1;
};
ARRAY_DEFINE_TYPE(smtp_server_recipient, struct smtp_server_recipient *);