smtp_server_connection_disconnect(struct smtp_server_connection *conn,
const char *reason)
{
+ struct smtp_server_command *cmd, *cmd_next;
+
if (conn->disconnected)
return;
conn->disconnected = TRUE;
/* preserve statistics */
smtp_server_connection_update_stats(conn);
+ /* drop transaction */
+ smtp_server_connection_reset_state(conn);
+
+ /* clear command queue */
+ cmd = conn->command_queue_head;
+ while (cmd != NULL) {
+ cmd_next = cmd->next;
+ smtp_server_command_abort(&cmd);
+ cmd = cmd_next;
+ }
+
smtp_server_connection_timeout_stop(conn);
if (conn->conn.output != NULL)
o_stream_uncork(conn->conn.output);
bool smtp_server_connection_unref(struct smtp_server_connection **_conn)
{
struct smtp_server_connection *conn = *_conn;
- struct smtp_server_command *cmd, *cmd_next;
*_conn = NULL;
smtp_server_connection_debug(conn, "Connection destroy");
- /* drop transaction */
- smtp_server_connection_reset_state(conn);
-
- /* clear command queue */
- cmd = conn->command_queue_head;
- while (cmd != NULL) {
- cmd_next = cmd->next;
- smtp_server_command_abort(&cmd);
- cmd = cmd_next;
- }
-
if (conn->callbacks != NULL &&
conn->callbacks->conn_destroy != NULL)
conn->callbacks->conn_destroy(conn->context);