From: Timo Sirainen Date: Wed, 17 Mar 2021 16:44:09 +0000 (+0200) Subject: lib-smtp: Add reason_code=:cmd_* X-Git-Tag: 2.3.18~359 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=750f14dae01f271136ad7fa5558d719ddd13669c;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: Add reason_code=:cmd_* 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. --- diff --git a/src/lib-smtp/smtp-server-cmd-data.c b/src/lib-smtp/smtp-server-cmd-data.c index 9183eca4f7..65b52ec78e 100644 --- a/src/lib-smtp/smtp-server-cmd-data.c +++ b/src/lib-smtp/smtp-server-cmd-data.c @@ -275,8 +275,11 @@ static int cmd_data_do_handle_input(struct smtp_server_cmd_ctx *cmd) 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; @@ -396,8 +399,12 @@ cmd_data_next(struct smtp_server_cmd_ctx *cmd, 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); diff --git a/src/lib-smtp/smtp-server-cmd-mail.c b/src/lib-smtp/smtp-server-cmd-mail.c index 7fcebb1fa6..82b8e811a0 100644 --- a/src/lib-smtp/smtp-server-cmd-mail.c +++ b/src/lib-smtp/smtp-server-cmd-mail.c @@ -189,7 +189,10 @@ void smtp_server_cmd_mail(struct smtp_server_cmd_ctx *cmd, 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)); diff --git a/src/lib-smtp/smtp-server-cmd-rcpt.c b/src/lib-smtp/smtp-server-cmd-rcpt.c index a6af6e78ff..85e9a9396f 100644 --- a/src/lib-smtp/smtp-server-cmd-rcpt.c +++ b/src/lib-smtp/smtp-server-cmd-rcpt.c @@ -210,7 +210,11 @@ void smtp_server_cmd_rcpt(struct smtp_server_cmd_ctx *cmd, 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 */ diff --git a/src/lib-smtp/smtp-server-connection.c b/src/lib-smtp/smtp-server-connection.c index ea9c9e2935..0aeedaea46 100644 --- a/src/lib-smtp/smtp-server-connection.c +++ b/src/lib-smtp/smtp-server-connection.c @@ -1621,3 +1621,14 @@ void smtp_server_connection_switch_ioloop(struct smtp_server_connection *conn) 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); +} diff --git a/src/lib-smtp/smtp-server-private.h b/src/lib-smtp/smtp-server-private.h index 61183cf0e5..4d0cd4bc36 100644 --- a/src/lib-smtp/smtp-server-private.h +++ b/src/lib-smtp/smtp-server-private.h @@ -306,6 +306,10 @@ void smtp_server_connection_debug(struct smtp_server_connection *conn, 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( diff --git a/src/lib-smtp/smtp-server.c b/src/lib-smtp/smtp-server.c index f48b60a159..a47930edc9 100644 --- a/src/lib-smtp/smtp-server.c +++ b/src/lib-smtp/smtp-server.c @@ -33,6 +33,8 @@ struct smtp_server *smtp_server_init(const struct smtp_server_settings *set) 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) { diff --git a/src/lib-smtp/smtp-server.h b/src/lib-smtp/smtp-server.h index 3ab1ead6c3..5c8bb5ff56 100644 --- a/src/lib-smtp/smtp-server.h +++ b/src/lib-smtp/smtp-server.h @@ -324,6 +324,8 @@ struct smtp_server_settings { /* 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 */