dovecot-2.0: login proxy: Show in disconnect reason who did the ...

dovecot at dovecot.org dovecot at dovecot.org
Fri May 20 19:55:03 EEST 2011


details:   http://hg.dovecot.org/dovecot-2.0/rev/d1c2cc4c513d
changeset: 12821:d1c2cc4c513d
user:      Timo Sirainen <tss at iki.fi>
date:      Fri May 20 19:54:57 2011 +0300
description:
login proxy: Show in disconnect reason who did the disconnection and possible error.

diffstat:

 src/login-common/login-proxy.c |  60 +++++++++++++++++++++++++++++++++--------
 1 files changed, 48 insertions(+), 12 deletions(-)

diffs (147 lines):

diff -r f2874eef6b0b -r d1c2cc4c513d src/login-common/login-proxy.c
--- a/src/login-common/login-proxy.c	Fri May 20 18:47:26 2011 +0300
+++ b/src/login-common/login-proxy.c	Fri May 20 19:54:57 2011 +0300
@@ -22,6 +22,7 @@
 #define LOGIN_PROXY_DNS_WARN_MSECS 500
 #define LOGIN_PROXY_IPC_PATH "ipc-proxy"
 #define LOGIN_PROXY_IPC_NAME "proxy"
+#define KILLED_BY_ADMIN_REASON "Killed by admin"
 
 struct login_proxy {
 	struct login_proxy *prev, *next;
@@ -58,6 +59,20 @@
 
 static void login_proxy_ipc_cmd(struct ipc_cmd *cmd, const char *line);
 
+static void
+login_proxy_free_reason(struct login_proxy **_proxy, const char *reason);
+
+static void login_proxy_free_errno(struct login_proxy **proxy,
+				   int err, const char *who)
+{
+	const char *reason;
+
+	reason = err == 0 || err == EPIPE ?
+		t_strdup_printf("Disconnected by %s", who) :
+		t_strdup_printf("Disconnected by %s: %s", who, strerror(errno));
+	login_proxy_free_reason(proxy, reason);
+}
+
 static void server_input(struct login_proxy *proxy)
 {
 	unsigned char buf[OUTBUF_THRESHOLD];
@@ -73,8 +88,13 @@
 	}
 
 	ret = net_receive(proxy->server_fd, buf, sizeof(buf));
-	if (ret < 0 || o_stream_send(proxy->client_output, buf, ret) != ret)
-                login_proxy_free(&proxy);
+	if (ret < 0)
+		login_proxy_free_errno(&proxy, errno, "server");
+	else if (o_stream_send(proxy->client_output, buf, ret) != ret) {
+		login_proxy_free_errno(&proxy,
+				       proxy->client_output->stream_errno,
+				       "client");
+	}
 }
 
 static void proxy_client_input(struct login_proxy *proxy)
@@ -92,15 +112,22 @@
 	}
 
 	ret = net_receive(proxy->client_fd, buf, sizeof(buf));
-	if (ret < 0 || o_stream_send(proxy->server_output, buf, ret) != ret)
-                login_proxy_free(&proxy);
+	if (ret < 0)
+		login_proxy_free_errno(&proxy, errno, "client");
+	else if (o_stream_send(proxy->server_output, buf, ret) != ret) {
+		login_proxy_free_errno(&proxy,
+				       proxy->server_output->stream_errno,
+				       "server");
+	}
 }
 
 static int server_output(struct login_proxy *proxy)
 {
 	proxy->last_io = ioloop_time;
 	if (o_stream_flush(proxy->server_output) < 0) {
-                login_proxy_free(&proxy);
+		login_proxy_free_errno(&proxy,
+				       proxy->server_output->stream_errno,
+				       "server");
 		return 1;
 	}
 
@@ -119,7 +146,9 @@
 {
 	proxy->last_io = ioloop_time;
 	if (o_stream_flush(proxy->client_output) < 0) {
-                login_proxy_free(&proxy);
+		login_proxy_free_errno(&proxy,
+				       proxy->client_output->stream_errno,
+				       "client");
 		return 1;
 	}
 
@@ -301,7 +330,8 @@
 	return 0;
 }
 
-void login_proxy_free(struct login_proxy **_proxy)
+static void
+login_proxy_free_reason(struct login_proxy **_proxy, const char *reason)
 {
 	struct login_proxy *proxy = *_proxy;
 	struct client *client = proxy->client;
@@ -335,9 +365,10 @@
 		DLLIST_REMOVE(&login_proxies, proxy);
 
 		ipstr = net_ip2addr(&proxy->client->ip);
-		i_info("proxy(%s): disconnecting %s",
+		i_info("proxy(%s): disconnecting %s%s",
 		       proxy->client->virtual_user,
-		       ipstr != NULL ? ipstr : "");
+		       ipstr != NULL ? ipstr : "",
+		       reason == NULL ? "" : t_strdup_printf(" (%s)", reason));
 
 		if (proxy->client_io != NULL)
 			io_remove(&proxy->client_io);
@@ -366,6 +397,11 @@
 	client_unref(&client);
 }
 
+void login_proxy_free(struct login_proxy **_proxy)
+{
+	login_proxy_free_reason(_proxy, NULL);
+}
+
 bool login_proxy_is_ourself(const struct client *client, const char *host,
 			    unsigned int port, const char *destuser)
 {
@@ -516,7 +552,7 @@
 
 static void proxy_kill_idle(struct login_proxy *proxy)
 {
-	login_proxy_free(&proxy);
+	login_proxy_free_reason(&proxy, KILLED_BY_ADMIN_REASON);
 }
 
 void login_proxy_kill_idle(void)
@@ -555,7 +591,7 @@
 		next = proxy->next;
 
 		if (strcmp(proxy->client->virtual_user, args[0]) == 0) {
-			login_proxy_free(&proxy);
+			login_proxy_free_reason(&proxy, KILLED_BY_ADMIN_REASON);
 			count++;
 		}
 	}
@@ -623,7 +659,7 @@
 
 	while (login_proxies != NULL) {
 		proxy = login_proxies;
-		login_proxy_free(&proxy);
+		login_proxy_free_reason(&proxy, KILLED_BY_ADMIN_REASON);
 	}
 	if (login_proxy_ipc_server != NULL)
 		ipc_server_deinit(&login_proxy_ipc_server);


More information about the dovecot-cvs mailing list