void login_server_deinit(struct login_server **_server)
{
struct login_server *server = *_server;
+ struct login_server_connection *conn, *next;
*_server = NULL;
login_server_stop_new_connections, server);
login_server_auth_deinit(&server->auth);
- while (server->conns != NULL) {
- struct login_server_connection *conn = server->conns;
-
- login_server_conn_close(conn);
- login_server_conn_unref(&conn);
+ for (conn = server->conns; conn != NULL; conn = next) {
+ next = conn->next;
+ if (!login_server_conn_is_closed(conn)) {
+ login_server_conn_close(conn);
+ login_server_conn_unref(&conn);
+ } else {
+ /* FIXME: auth request or post-login script is still
+ running - we don't currently support aborting them */
+ i_assert(conn->requests != NULL);
+ }
}
i_free(server->postlogin_socket_path);
i_free(server);
if (login_server_conn_is_closed(conn))
return;
- DLLIST_REMOVE(&conn->server->conns, conn);
-
io_remove(&conn->io);
o_stream_close(conn->output);
i_close_fd(&conn->fd);
login_server_conn_close(conn);
o_stream_unref(&conn->output);
+ DLLIST_REMOVE(&conn->server->conns, conn);
+
if (!conn->login_success)
master_service_client_connection_destroyed(conn->server->service);
event_unref(&conn->event);