Mercurial > dovecot > core-2.2
changeset 10473:a0d99b374aa4 HEAD
imap, pop3: Close auth/config connections when we stop accepting more connections.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 13 Dec 2009 21:08:41 -0500 |
parents | 32949365f28d |
children | d4c645713656 |
files | src/lib-master/master-login-auth.c src/lib-master/master-login-auth.h src/lib-master/master-login.c src/lib-master/master-login.h src/lib-master/master-service-private.h src/lib-master/master-service.c |
diffstat | 6 files changed, 41 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-master/master-login-auth.c Sun Dec 13 20:48:43 2009 -0500 +++ b/src/lib-master/master-login-auth.c Sun Dec 13 21:08:41 2009 -0500 @@ -51,7 +51,7 @@ return auth; } -static void master_login_auth_disconnect(struct master_login_auth *auth) +void master_login_auth_disconnect(struct master_login_auth *auth) { struct hash_iterate_context *iter; void *key, *value;
--- a/src/lib-master/master-login-auth.h Sun Dec 13 20:48:43 2009 -0500 +++ b/src/lib-master/master-login-auth.h Sun Dec 13 21:08:41 2009 -0500 @@ -9,6 +9,7 @@ struct master_login_auth *master_login_auth_init(const char *auth_socket_path); void master_login_auth_deinit(struct master_login_auth **auth); +void master_login_auth_disconnect(struct master_login_auth *auth); void master_login_auth_request(struct master_login_auth *auth, const struct master_auth_request *req,
--- a/src/lib-master/master-login.c Sun Dec 13 20:48:43 2009 -0500 +++ b/src/lib-master/master-login.c Sun Dec 13 21:08:41 2009 -0500 @@ -41,6 +41,8 @@ struct master_login_connection *conns; struct master_login_auth *auth; char *postlogin_socket_path; + + unsigned int stopping:1; }; static void master_login_conn_deinit(struct master_login_connection **_conn); @@ -57,7 +59,9 @@ login->callback = callback; login->auth = master_login_auth_init(auth_socket_path); login->postlogin_socket_path = i_strdup(postlogin_socket_path); - service->login_connections = TRUE; + + i_assert(service->login == NULL); + service->login = login; return login; } @@ -67,6 +71,9 @@ *_login = NULL; + i_assert(login->service->login == login); + login->service->login = NULL; + master_login_auth_deinit(&login->auth); while (login->conns != NULL) { struct master_login_connection *conn = login->conns; @@ -147,19 +154,26 @@ const char *const *auth_args) { struct master_login_connection *conn = client->conn; - struct master_service *service = conn->login->service; - bool close_config; + struct master_login *login = conn->login; + struct master_service *service = login->service; + bool close_sockets; - close_config = service->master_status.available_count == 0 && + close_sockets = service->master_status.available_count == 0 && service->service_count_left == 1; - conn->login->callback(client, auth_args[0], auth_args+1); + login->callback(client, auth_args[0], auth_args+1); i_free(client); - if (close_config) { + if (close_sockets) { /* we're dying as soon as this connection closes. */ + i_assert(master_login_auth_request_count(login->auth) == 0); + master_login_auth_disconnect(login->auth); + master_service_close_config_fd(service); master_login_conn_deinit(&conn); + } else if (login->stopping) { + /* try stopping again */ + master_login_stop(login); } } @@ -393,3 +407,12 @@ master_service_io_listeners_add(conn->login->service); i_free(conn); } + +void master_login_stop(struct master_login *login) +{ + login->stopping = TRUE; + if (master_login_auth_request_count(login->auth) == 0) { + master_login_auth_disconnect(login->auth); + master_service_close_config_fd(login->service); + } +}
--- a/src/lib-master/master-login.h Sun Dec 13 20:48:43 2009 -0500 +++ b/src/lib-master/master-login.h Sun Dec 13 21:08:41 2009 -0500 @@ -22,5 +22,6 @@ void master_login_deinit(struct master_login **login); void master_login_add(struct master_login *login, int fd); +void master_login_stop(struct master_login *login); #endif
--- a/src/lib-master/master-service-private.h Sun Dec 13 20:48:43 2009 -0500 +++ b/src/lib-master/master-service-private.h Sun Dec 13 21:08:41 2009 -0500 @@ -41,6 +41,8 @@ void (*avail_overflow_callback)(void); struct timeout *to_overflow_state; + struct master_login *login; + master_service_connection_callback_t *callback; pool_t set_pool; @@ -54,9 +56,6 @@ unsigned int die_with_master:1; unsigned int call_avail_overflow:1; unsigned int delay_status_updates:1; - /* incoming connections are going to master-login and they're not - counted as real connections */ - unsigned int login_connections:1; }; void master_service_io_listeners_add(struct master_service *service);
--- a/src/lib-master/master-service.c Sun Dec 13 20:48:43 2009 -0500 +++ b/src/lib-master/master-service.c Sun Dec 13 21:08:41 2009 -0500 @@ -11,6 +11,7 @@ #include "fd-close-on-exec.h" #include "settings-parser.h" #include "syslog-util.h" +#include "master-login.h" #include "master-service-private.h" #include "master-service-settings.h" @@ -503,6 +504,8 @@ service->master_status.available_count = 0; master_status_update(service); } + if (service->login != NULL) + master_login_stop(service->login); } void master_service_anvil_send(struct master_service *service, const char *cmd) @@ -693,7 +696,10 @@ conn.ssl = l->ssl; net_set_nonblock(conn.fd, TRUE); - if (!service->login_connections) { + if (service->login != NULL) { + /* incoming connections are going to master-login and they're + not counted as real connections */ + } else { i_assert(service->master_status.available_count > 0); service->master_status.available_count--; master_status_update(service);