"SSL Initialization failed");
return;
}
+ if (conn->halted) {
+ smtp_server_connection_input_lock(conn);
+ return;
+ }
}
+ i_assert(!conn->halted);
+
if (conn->command_queue_count >
conn->server->set.max_pipelined_commands) {
conn->set.capabilities &= ~SMTP_CAPABILITY_STARTTLS;
/* halt input until started */
- smtp_server_connection_input_halt(conn);
+ smtp_server_connection_halt(conn);
smtp_server_connection_debug(conn, "Connection created");
conn->created_from_streams = TRUE;
/* halt input until started */
- smtp_server_connection_input_halt(conn);
+ smtp_server_connection_halt(conn);
smtp_server_connection_debug(conn, "Connection created");
}
}
-void smtp_server_connection_start(struct smtp_server_connection *conn)
+void smtp_server_connection_start_pending(struct smtp_server_connection *conn)
{
i_assert(!conn->started);
conn->started = TRUE;
if (!conn->ssl_start)
smtp_server_connection_ready(conn);
+ else if (conn->ssl_iostream == NULL)
+ smtp_server_connection_input_unlock(conn);
+}
- smtp_server_connection_timeout_start(conn);
- smtp_server_connection_input_resume(conn);
+void smtp_server_connection_start(struct smtp_server_connection *conn)
+{
+ smtp_server_connection_start_pending(conn);
+ smtp_server_connection_resume(conn);
+}
+
+void smtp_server_connection_halt(struct smtp_server_connection *conn)
+{
+ conn->halted = TRUE;
+ smtp_server_connection_timeout_stop(conn);
+ if (!conn->started || !conn->ssl_start || conn->ssl_iostream != NULL)
+ smtp_server_connection_input_lock(conn);
+}
+
+void smtp_server_connection_resume(struct smtp_server_connection *conn)
+{
+ smtp_server_connection_input_unlock(conn);
+ smtp_server_connection_timeout_update(conn);
+ conn->halted = FALSE;
}
void smtp_server_connection_close(struct smtp_server_connection **_conn,
/* Start the connection. Establishes SSL layer immediately if instructed,
and sends the greeting once the connection is ready for commands. */
void smtp_server_connection_start(struct smtp_server_connection *conn);
+/* Start the connection, but only establish SSL layer and send greeting;
+ handling command input is held off until smtp_server_connection_resume() is
+ called. */
+void smtp_server_connection_start_pending(struct smtp_server_connection *conn);
+
+/* Halt connection command input and idle timeout entirely. */
+void smtp_server_connection_halt(struct smtp_server_connection *conn);
+/* Resume connection command input and idle timeout. */
+void smtp_server_connection_resume(struct smtp_server_connection *conn);
void smtp_server_connection_input_lock(struct smtp_server_connection *conn);
void smtp_server_connection_input_unlock(struct smtp_server_connection *conn);