return;
/* advance state */
- smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_AUTH);
+ smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_AUTH, NULL);
smtp_server_command_ref(command);
i_assert(callbacks != NULL && callbacks->conn_cmd_auth != NULL);
}
}
- smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_DATA);
+ smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_DATA, NULL);
/* chain data streams in the correct order */
if (conn->state.data_chain != NULL) {
return;
}
- smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_DATA);
+ smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_DATA, NULL);
/* confirm initial success to client */
smtp_server_connection_reply_immediate(conn, 354, "OK");
ret = smtp_helo_domain_parse(params, !old_smtp, &domain);
smtp_server_command_input_lock(cmd);
- if (conn->state.state == SMTP_SERVER_STATE_GREETING)
- smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_HELO);
+ if (conn->state.state == SMTP_SERVER_STATE_GREETING) {
+ smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_HELO,
+ NULL);
+ }
helo_data = p_new(cmd->pool, struct smtp_server_cmd_helo, 1);
helo_data->helo.domain = p_strdup(cmd->pool, domain);
static void
cmd_mail_recheck(struct smtp_server_cmd_ctx *cmd,
- struct smtp_server_cmd_mail *data ATTR_UNUSED)
+ struct smtp_server_cmd_mail *data)
{
struct smtp_server_connection *conn = cmd->conn;
return;
/* Advance state */
- smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_MAIL_FROM);
+ smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_MAIL_FROM,
+ smtp_address_encode(data->path));
}
void smtp_server_cmd_mail(struct smtp_server_cmd_ctx *cmd,
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);
+ smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_MAIL_FROM,
+ smtp_address_encode(mail_data->path));
conn->state.pending_mail_cmds++;
smtp_server_command_ref(command);
return;
/* Advance state */
- smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_RCPT_TO);
+ smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_RCPT_TO,
+ smtp_address_encode(data->rcpt->path));
}
void smtp_server_cmd_rcpt(struct smtp_server_cmd_ctx *cmd,
const struct smtp_server_callbacks *callbacks = conn->callbacks;
int ret;
- smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_STARTTLS);
+ smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_STARTTLS,
+ NULL);
smtp_server_command_ref(command);
if (callbacks != NULL && callbacks->conn_cmd_starttls != NULL)
clear. This provides the opportunity to re-check the protocol state */
if (!cmd_xclient_check_state(cmd))
return;
- smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_XCLIENT);
+ smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_XCLIENT, NULL);
/* succes; send greeting */
smtp_server_reply(cmd, 220, NULL, "%s %s",
smtp_server_command_add_hook(command, SMTP_SERVER_COMMAND_HOOK_COMPLETED,
cmd_xclient_completed, proxy_data);
- if (conn->state.state == SMTP_SERVER_STATE_GREETING)
- smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_XCLIENT);
+ if (conn->state.state == SMTP_SERVER_STATE_GREETING) {
+ smtp_server_connection_set_state(
+ conn, SMTP_SERVER_STATE_XCLIENT, NULL);
+ }
smtp_server_command_ref(command);
if (callbacks != NULL && callbacks->conn_cmd_xclient != NULL) {
}
enum smtp_server_state
-smtp_server_connection_get_state(struct smtp_server_connection *conn)
+smtp_server_connection_get_state(struct smtp_server_connection *conn,
+ const char **args_r)
{
+ if (args_r != NULL)
+ *args_r = conn->state.args;
return conn->state.state;
}
void smtp_server_connection_set_state(struct smtp_server_connection *conn,
- enum smtp_server_state state)
+ enum smtp_server_state state,
+ const char *args)
{
+ bool changed = FALSE;
+
if (conn->state.state != state) {
conn->state.state = state;
-
- if (conn->callbacks != NULL &&
- conn->callbacks->conn_state_changed != NULL) {
- conn->callbacks->conn_state_changed(conn->context, state);
- }
+ changed = TRUE;
}
+ if (null_strcmp(args, conn->state.args) != 0) {
+ i_free(conn->state.args);
+ conn->state.args = i_strdup(args);
+ changed = TRUE;
+ }
+
+ if (changed && conn->callbacks != NULL &&
+ conn->callbacks->conn_state_changed != NULL)
+ conn->callbacks->conn_state_changed(conn->context, state, args);
}
const char *
{
e_debug(conn->event, "Connection state reset");
+ i_free(conn->state.args);
+
if (conn->state.trans != NULL)
smtp_server_transaction_free(&conn->state.trans);
/* reset state */
i_zero(&conn->state);
- smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_READY);
+ smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_READY, NULL);
}
void smtp_server_connection_clear(struct smtp_server_connection *conn)
struct smtp_server_state_data {
enum smtp_server_state state;
+ char *args;
time_t timestamp;
unsigned int pending_mail_cmds;
void smtp_server_connection_reset_state(struct smtp_server_connection *conn);
void smtp_server_connection_set_state(struct smtp_server_connection *conn,
- enum smtp_server_state state);
+ enum smtp_server_state state,
+ const char *args) ATTR_NULL(3);
int smtp_server_connection_ssl_init(struct smtp_server_connection *conn);
/* Protocol state events */
void (*conn_state_changed)(void *context,
- enum smtp_server_state newstate);
+ enum smtp_server_state new_state,
+ const char *new_args) ATTR_NULL(3);
/* Proxy data */
void (*conn_proxy_data_updated)(void *conn_ctx,
bool client_input);
enum smtp_server_state
-smtp_server_connection_get_state(struct smtp_server_connection *conn);
+smtp_server_connection_get_state(struct smtp_server_connection *conn,
+ const char **args_r) ATTR_NULL(2);
const char *
smtp_server_connection_get_security_string(struct smtp_server_connection *conn);
struct smtp_server_transaction *
if (client->conn == NULL)
state = client->last_state;
else
- state = smtp_server_connection_get_state(client->conn);
+ state = smtp_server_connection_get_state(client->conn, NULL);
return smtp_server_state_names[state];
}
client_remote_id(client), reason, client_state_get_name(client));
if (conn != NULL) {
- client->last_state = smtp_server_connection_get_state(conn);
+ client->last_state =
+ smtp_server_connection_get_state(conn, NULL);
smtp_server_connection_terminate(&conn,
(enh_code == NULL ? "4.0.0" : enh_code), reason);
}
static void
client_connection_state_changed(void *context ATTR_UNUSED,
- enum smtp_server_state newstate ATTR_UNUSED)
+ enum smtp_server_state new_state ATTR_UNUSED,
+ const char *new_args ATTR_UNUSED)
{
if (clients_count == 1)
refresh_proctitle();
struct client *client = (struct client *)context;
struct smtp_server_connection *conn = client->conn;
- if (conn != NULL)
- client->last_state = smtp_server_connection_get_state(conn);
+ if (conn != NULL) {
+ client->last_state =
+ smtp_server_connection_get_state(conn, NULL);
+ }
client_disconnect(client, NULL, reason);
}
static void
client_connection_state_changed(void *context ATTR_UNUSED,
- enum smtp_server_state newstate ATTR_UNUSED)
+ enum smtp_server_state new_state ATTR_UNUSED,
+ const char *new_args ATTR_UNUSED)
{
if (submission_client_count == 1)
submission_refresh_proctitle();
if (conn != NULL) {
stats = smtp_server_connection_get_stats(conn);
client->stats = *stats;
- client->last_state = smtp_server_connection_get_state(conn);
+ client->last_state =
+ smtp_server_connection_get_state(conn, NULL);
}
client_disconnect(client, NULL, reason);
}
if (client->conn == NULL)
state = client->last_state;
else
- state = smtp_server_connection_get_state(client->conn);
+ state = smtp_server_connection_get_state(client->conn, NULL);
return smtp_server_state_names[state];
}
conn = client->conn;
client->conn = NULL;
if (conn != NULL) {
- client->last_state = smtp_server_connection_get_state(conn);
+ client->last_state =
+ smtp_server_connection_get_state(conn, NULL);
smtp_server_connection_terminate(&conn,
(enh_code == NULL ? "4.0.0" : enh_code), reason);
}
struct client *client = conn_ctx;
if (!data->first ||
- smtp_server_connection_get_state(client->conn)
+ smtp_server_connection_get_state(client->conn, NULL)
>= SMTP_SERVER_STATE_READY)
return client->v.cmd_helo(client, cmd, data);