changeset 13043:d1c2cc4c513d

login proxy: Show in disconnect reason who did the disconnection and possible error.
author Timo Sirainen <tss@iki.fi>
date Fri, 20 May 2011 19:54:57 +0300
parents f2874eef6b0b
children f8c378e8b461
files src/login-common/login-proxy.c
diffstat 1 files changed, 48 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- 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);