changeset 19352:e7f71caad9c5

login proxy: If writing to ostream fails, log the ostream's error string. Although for now it's always just based on the errno anyway.
author Timo Sirainen <tss@iki.fi>
date Wed, 11 Nov 2015 17:40:23 +0200
parents 9dd14c376418
children 53f4464235b3
files src/login-common/login-proxy.c
diffstat 1 files changed, 30 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/src/login-common/login-proxy.c	Wed Nov 11 17:35:10 2015 +0200
+++ b/src/login-common/login-proxy.c	Wed Nov 11 17:40:23 2015 +0200
@@ -79,15 +79,15 @@
 login_proxy_free_delayed(struct login_proxy **_proxy, const char *reason)
 	ATTR_NULL(2);
 
-static void login_proxy_free_errno(struct login_proxy **_proxy,
-				   int err, bool server)
+static void login_proxy_free_errstr(struct login_proxy **_proxy,
+				    const char *errstr, bool server)
 {
 	struct login_proxy *proxy = *_proxy;
 	string_t *reason = t_str_new(128);
 
 	str_printfa(reason, "Disconnected by %s", server ? "server" : "client");
-	if (err != 0 && err != EPIPE)
-		str_printfa(reason, ": %s", strerror(errno));
+	if (errstr[0] != '\0')
+		str_printfa(reason, ": %s", errstr);
 
 	str_printfa(reason, "(%ds idle, in=%"PRIuUOFF_T", out=%"PRIuUOFF_T,
 		    (int)(ioloop_time - proxy->last_io),
@@ -107,6 +107,26 @@
 		login_proxy_free_reason(_proxy, str_c(reason));
 }
 
+static void login_proxy_free_errno(struct login_proxy **_proxy,
+				   int err, bool server)
+{
+	const char *errstr;
+
+	errstr = err == 0 || err == EPIPE ? "" : strerror(err);
+	login_proxy_free_errstr(_proxy, errstr, server);
+}
+
+static void login_proxy_free_ostream(struct login_proxy **_proxy,
+				     struct ostream *output, bool server)
+{
+	const char *errstr;
+
+	errstr = output->stream_errno == 0 ||
+		output->stream_errno == EPIPE ? "" :
+		o_stream_get_error(output);
+	login_proxy_free_errstr(_proxy, errstr, server);
+}
+
 static void server_input(struct login_proxy *proxy)
 {
 	unsigned char buf[OUTBUF_THRESHOLD];
@@ -129,10 +149,8 @@
 	o_stream_cork(proxy->client_output);
 	ret2 = o_stream_send(proxy->client_output, buf, ret);
 	o_stream_uncork(proxy->client_output);
-	if (ret2 != ret) {
-		login_proxy_free_errno(&proxy,
-			proxy->client_output->stream_errno, FALSE);
-	}
+	if (ret2 != ret)
+		login_proxy_free_ostream(&proxy, proxy->client_output, FALSE);
 }
 
 static void proxy_client_input(struct login_proxy *proxy)
@@ -157,10 +175,8 @@
 	o_stream_cork(proxy->server_output);
 	ret2 = o_stream_send(proxy->server_output, buf, ret);
 	o_stream_uncork(proxy->server_output);
-	if (ret2 != ret) {
-		login_proxy_free_errno(&proxy,
-			proxy->server_output->stream_errno, TRUE);
-	}
+	if (ret2 != ret)
+		login_proxy_free_ostream(&proxy, proxy->server_output, TRUE);
 }
 
 static void proxy_client_disconnected_input(struct login_proxy *proxy)
@@ -177,8 +193,7 @@
 {
 	proxy->last_io = ioloop_time;
 	if (o_stream_flush(proxy->server_output) < 0) {
-		login_proxy_free_errno(&proxy,
-			proxy->server_output->stream_errno, TRUE);
+		login_proxy_free_ostream(&proxy, proxy->server_output, TRUE);
 		return 1;
 	}
 
@@ -197,8 +212,7 @@
 {
 	proxy->last_io = ioloop_time;
 	if (o_stream_flush(proxy->client_output) < 0) {
-		login_proxy_free_errno(&proxy,
-			proxy->client_output->stream_errno, FALSE);
+		login_proxy_free_ostream(&proxy, proxy->client_output, FALSE);
 		return 1;
 	}