This requires caller to set smtp_server_settings.reason_code_module.
For now only cmd_mail, cmd_rcpt and cmd_data are implemented. The other
commands are likely not very useful.
i_assert(callbacks != NULL &&
callbacks->conn_cmd_data_continue != NULL);
+ struct event_reason *reason =
+ smtp_server_connection_reason_begin(conn, "cmd_data");
ret = callbacks->conn_cmd_data_continue(conn->context,
cmd, conn->state.trans);
+ event_reason_end(&reason);
if (ret >= 0) {
if (!smtp_server_cmd_data_check_size(cmd)) {
return -1;
i_assert(callbacks != NULL &&
callbacks->conn_cmd_data_begin != NULL);
i_assert(conn->state.data_input != NULL);
- if (callbacks->conn_cmd_data_begin(conn->context,
- cmd, conn->state.trans, conn->state.data_input) < 0) {
+ struct event_reason *reason =
+ smtp_server_connection_reason_begin(conn, "cmd_data");
+ int ret = callbacks->conn_cmd_data_begin(conn->context,
+ cmd, conn->state.trans, conn->state.data_input);
+ event_reason_end(&reason);
+ if (ret < 0) {
i_assert(smtp_server_command_is_replied(cmd_temp));
/* command failed */
smtp_server_command_unref(&cmd_temp);
smtp_server_command_ref(command);
if (callbacks != NULL && callbacks->conn_cmd_mail != NULL) {
/* Specific implementation of MAIL command */
+ struct event_reason *reason =
+ smtp_server_connection_reason_begin(conn, "cmd_mail");
ret = callbacks->conn_cmd_mail(conn->context, cmd, mail_data);
+ event_reason_end(&reason);
if (ret <= 0) {
i_assert(ret == 0 ||
smtp_server_command_is_replied(command));
smtp_server_command_ref(command);
i_assert(callbacks != NULL && callbacks->conn_cmd_rcpt != NULL);
+
+ struct event_reason *reason =
+ smtp_server_connection_reason_begin(conn, "cmd_rcpt");
ret = callbacks->conn_cmd_rcpt(conn->context, cmd, rcpt);
+ event_reason_end(&reason);
if (ret <= 0) {
i_assert(ret == 0 || smtp_server_command_is_replied(command));
/* Command is waiting for external event or it failed */
conn->to_idle = io_loop_move_timeout(&conn->to_idle);
connection_switch_ioloop(&conn->conn);
}
+
+struct event_reason *
+smtp_server_connection_reason_begin(struct smtp_server_connection *conn,
+ const char *name)
+{
+ if (conn->set.reason_code_module == NULL)
+ return NULL;
+ const char *reason_code =
+ event_reason_code(conn->set.reason_code_module, name);
+ return event_reason_begin(reason_code);
+}
struct connection_list *smtp_server_connection_list_init(void);
+struct event_reason *
+smtp_server_connection_reason_begin(struct smtp_server_connection *conn,
+ const char *name);
+
void smtp_server_connection_switch_ioloop(struct smtp_server_connection *conn);
void smtp_server_connection_handle_output_error(
server = p_new(pool, struct smtp_server, 1);
server->pool = pool;
server->set.protocol = set->protocol;
+ server->set.reason_code_module =
+ p_strdup(pool, set->reason_code_module);
server->set.rawlog_dir = p_strdup_empty(pool, set->rawlog_dir);
if (set->ssl != NULL) {
/* Enabled workarounds for client protocol deviations */
enum smtp_server_workarounds workarounds;
+ /* Module name for event reason codes. */
+ const char *reason_code_module;
/* Our hostname as presented to the client */
const char *hostname;
/* The message sent in the SMTP server greeting */