Mercurial > dovecot > core-2.2
changeset 10194:40d8df2b4111 HEAD
imap, pop3: Connection counting fixes.
Multiple real connections can come from "login connections". For now don't
even try to count login connections.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 26 Oct 2009 20:11:48 -0400 |
parents | 02e852b2c2c3 |
children | c94ca1acd623 |
files | src/imap/main.c 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 src/pop3/main.c |
diffstat | 6 files changed, 39 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/src/imap/main.c Mon Oct 26 19:53:48 2009 -0400 +++ b/src/imap/main.c Mon Oct 26 20:11:48 2009 -0400 @@ -269,6 +269,7 @@ service_flags |= MASTER_SERVICE_FLAG_STANDALONE | MASTER_SERVICE_FLAG_STD_CLIENT; } else { + service_flags |= MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN; storage_service_flags |= MAIL_STORAGE_SERVICE_FLAG_DISALLOW_ROOT; } @@ -297,7 +298,7 @@ main_stdio_run(); } T_END; } else { - master_login = master_login_init("auth-master", + master_login = master_login_init(master_service, "auth-master", login_client_connected); io_loop_set_running(current_ioloop); }
--- a/src/lib-master/master-login.c Mon Oct 26 19:53:48 2009 -0400 +++ b/src/lib-master/master-login.c Mon Oct 26 20:11:48 2009 -0400 @@ -6,6 +6,7 @@ #include "fdpass.h" #include "fd-close-on-exec.h" #include "llist.h" +#include "master-service-private.h" #include "master-login.h" #include "master-login-auth.h" @@ -22,6 +23,7 @@ }; struct master_login { + struct master_service *service; master_login_callback_t *callback; struct master_login_connection *conns; struct master_login_auth *auth; @@ -30,14 +32,16 @@ static void master_login_conn_deinit(struct master_login_connection **_conn); struct master_login * -master_login_init(const char *auth_socket_path, +master_login_init(struct master_service *service, const char *auth_socket_path, master_login_callback_t *callback) { struct master_login *login; login = i_new(struct master_login, 1); + login->service = service; login->callback = callback; login->auth = master_login_auth_init(auth_socket_path); + service->login_connections = TRUE; return login; } @@ -127,6 +131,8 @@ { struct master_login_client *client = context; struct master_auth_reply reply; + struct master_service *service = client->conn->login->service; + bool close_config; memset(&reply, 0, sizeof(reply)); reply.tag = client->auth_req.tag; @@ -142,8 +148,18 @@ return; } + service->master_status.available_count--; + master_status_update(service); + close_config = service->master_status.available_count == 0 && + service->service_count_left == 1; + client->conn->login->callback(client, auth_args[0], auth_args+1); i_free(client); + + if (close_config) { + /* we're dying as soon as this connection closes. */ + master_service_close_config_fd(service); + } } static void master_login_conn_input(struct master_login_connection *conn)
--- a/src/lib-master/master-login.h Mon Oct 26 19:53:48 2009 -0400 +++ b/src/lib-master/master-login.h Mon Oct 26 20:11:48 2009 -0400 @@ -16,7 +16,7 @@ const char *username, const char *const *extra_fields); struct master_login * -master_login_init(const char *auth_socket_path, +master_login_init(struct master_service *service, const char *auth_socket_path, master_login_callback_t *callback); void master_login_deinit(struct master_login **login);
--- a/src/lib-master/master-service-private.h Mon Oct 26 19:53:48 2009 -0400 +++ b/src/lib-master/master-service-private.h Mon Oct 26 20:11:48 2009 -0400 @@ -53,8 +53,13 @@ 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); +void master_status_update(struct master_service *service); +void master_service_close_config_fd(struct master_service *service); #endif
--- a/src/lib-master/master-service.c Mon Oct 26 19:53:48 2009 -0400 +++ b/src/lib-master/master-service.c Mon Oct 26 20:11:48 2009 -0400 @@ -40,7 +40,6 @@ static void master_service_refresh_login_state(struct master_service *service); static void io_listeners_remove(struct master_service *service); -static void master_status_update(struct master_service *service); const char *master_service_getopt_string(void) { @@ -571,7 +570,7 @@ master_service_set_login_state(service, ret); } -static void master_service_close_config_fd(struct master_service *service) +void master_service_close_config_fd(struct master_service *service) { if (service->config_fd != -1) { if (close(service->config_fd) < 0) @@ -619,6 +618,7 @@ { struct master_service *service = l->service; struct master_service_connection conn; + bool close_config; if (service->master_status.available_count == 0) { /* we are full. stop listening for now, unless overflow @@ -660,13 +660,18 @@ conn.ssl = l->ssl; net_set_nonblock(conn.fd, TRUE); - service->master_status.available_count--; - master_status_update(service); + if (service->login_connections) + close_config = FALSE; + else { + service->master_status.available_count--; + master_status_update(service); + close_config = service->master_status.available_count == 0 && + service->service_count_left == 1; + } service->callback(&conn); - if (service->master_status.available_count == 0 && - service->service_count_left == 1) { + if (close_config) { /* we're dying as soon as this connection closes. */ master_service_close_config_fd(service); } @@ -731,7 +736,7 @@ return FALSE; } -static void master_status_update(struct master_service *service) +void master_status_update(struct master_service *service) { ssize_t ret;
--- a/src/pop3/main.c Mon Oct 26 19:53:48 2009 -0400 +++ b/src/pop3/main.c Mon Oct 26 20:11:48 2009 -0400 @@ -195,6 +195,7 @@ service_flags |= MASTER_SERVICE_FLAG_STANDALONE | MASTER_SERVICE_FLAG_STD_CLIENT; } else { + service_flags |= MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN; storage_service_flags |= MAIL_STORAGE_SERVICE_FLAG_DISALLOW_ROOT; } @@ -219,7 +220,7 @@ main_stdio_run(); } T_END; } else { - master_login = master_login_init("auth-master", + master_login = master_login_init(master_service, "auth-master", login_client_connected); io_loop_set_running(current_ioloop); }