dovecot-2.0: *-login: Disconnect from auth server after idling f...

dovecot at dovecot.org dovecot at dovecot.org
Fri Feb 19 05:11:00 EET 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/fc77d1cd1201
changeset: 10760:fc77d1cd1201
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Feb 19 05:10:48 2010 +0200
description:
*-login: Disconnect from auth server after idling for a minute.

diffstat:

 src/login-common/client-common.c |   4 ++--
 src/login-common/login-common.h  |   2 ++
 src/login-common/main.c          |  28 +++++++++++++++++++++++++---
 3 files changed, 29 insertions(+), 5 deletions(-)

diffs (103 lines):

diff -r 7a7b2cbc6f91 -r fc77d1cd1201 src/login-common/client-common.c
--- a/src/login-common/client-common.c	Fri Feb 19 05:10:06 2010 +0200
+++ b/src/login-common/client-common.c	Fri Feb 19 05:10:48 2010 +0200
@@ -156,9 +156,9 @@
 		/* as soon as this connection is done with proxying
 		   (or whatever), the process will die. there's no need for
 		   authentication anymore, so close the connection. */
-		if (auth_client != NULL)
-			auth_client_deinit(&auth_client);
+		auth_client_disconnect(auth_client);
 	}
+	login_client_destroyed();
 	login_refresh_proctitle();
 }
 
diff -r 7a7b2cbc6f91 -r fc77d1cd1201 src/login-common/login-common.h
--- a/src/login-common/login-common.h	Fri Feb 19 05:10:06 2010 +0200
+++ b/src/login-common/login-common.h	Fri Feb 19 05:10:48 2010 +0200
@@ -24,6 +24,8 @@
 extern void **global_other_settings;
 
 void login_refresh_proctitle(void);
+void login_client_destroyed(void);
+
 void login_process_preinit(void);
 
 #endif
diff -r 7a7b2cbc6f91 -r fc77d1cd1201 src/login-common/main.c
--- a/src/login-common/main.c	Fri Feb 19 05:10:06 2010 +0200
+++ b/src/login-common/main.c	Fri Feb 19 05:10:48 2010 +0200
@@ -20,6 +20,8 @@
 #include <unistd.h>
 #include <syslog.h>
 
+#define AUTH_CLIENT_IDLE_TIMEOUT_MSECS (1000*60)
+
 struct login_access_lookup {
 	struct master_service_connection conn;
 	struct io *io;
@@ -36,6 +38,7 @@
 const struct login_settings *global_login_settings;
 void **global_other_settings;
 
+static struct timeout *auth_client_to;
 static bool shutting_down = FALSE;
 static bool ssl_connections = FALSE;
 
@@ -62,12 +65,27 @@
 	}
 }
 
+static void auth_client_idle_timeout(struct auth_client *auth_client)
+{
+	auth_client_disconnect(auth_client);
+	timeout_remove(&auth_client_to);
+}
+
+void login_client_destroyed(void)
+{
+	if (clients == NULL && auth_client_to == NULL) {
+		auth_client_to = timeout_add(AUTH_CLIENT_IDLE_TIMEOUT_MSECS,
+					     auth_client_idle_timeout,
+					     auth_client);
+	}
+}
+
 static void login_die(void)
 {
 	shutting_down = TRUE;
 	login_proxy_kill_idle();
 
-	if (auth_client == NULL || !auth_client_is_connected(auth_client)) {
+	if (!auth_client_is_connected(auth_client)) {
 		/* we don't have auth client, and we might never get one */
 		clients_destroy_all();
 	}
@@ -116,6 +134,9 @@
 
 	client->remote_port = conn->remote_port;
 	client->local_port = local_port;
+
+	if (auth_client_to != NULL)
+		timeout_remove(&auth_client_to);
 }
 
 static void login_access_lookup_free(struct login_access_lookup *lookup)
@@ -286,13 +307,14 @@
 	ssl_proxy_deinit();
 	login_proxy_deinit();
 
-	if (auth_client != NULL)
-		auth_client_deinit(&auth_client);
+	auth_client_deinit(&auth_client);
 	clients_deinit();
 	master_auth_deinit(&master_auth);
 
 	if (anvil != NULL)
 		anvil_client_deinit(&anvil);
+	if (auth_client_to != NULL)
+		timeout_remove(&auth_client_to);
 }
 
 int main(int argc, char *argv[])


More information about the dovecot-cvs mailing list