]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
login proxy: Include some extra information in disconnect log lines.
authorTimo Sirainen <tss@iki.fi>
Wed, 11 Nov 2015 15:35:10 +0000 (17:35 +0200)
committerTimo Sirainen <tss@iki.fi>
Wed, 11 Nov 2015 15:35:10 +0000 (17:35 +0200)
src/login-common/login-proxy.c

index ebac09a1bfedfe0289fb349bc617dc16a9dee7d3..1a1354ed96ece9cee2156db2ab55e07a6147053a 100644 (file)
@@ -79,18 +79,32 @@ static void
 login_proxy_free_delayed(struct login_proxy **_proxy, const char *reason)
        ATTR_NULL(2);
 
-static void login_proxy_free_errno(struct login_proxy **proxy,
+static void login_proxy_free_errno(struct login_proxy **_proxy,
                                   int err, bool server)
 {
-       const char *reason, *who = server ? "server" : "client";
-
-       reason = err == 0 || err == EPIPE ?
-               t_strdup_printf("Disconnected by %s", who) :
-               t_strdup_printf("Disconnected by %s: %s", who, strerror(errno));
+       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));
+
+       str_printfa(reason, "(%ds idle, in=%"PRIuUOFF_T", out=%"PRIuUOFF_T,
+                   (int)(ioloop_time - proxy->last_io),
+                   proxy->server_output->offset, proxy->client_output->offset);
+       if (o_stream_get_buffer_used_size(proxy->client_output) > 0) {
+               str_printfa(reason, "+%"PRIuSIZE_T,
+                           o_stream_get_buffer_used_size(proxy->client_output));
+       }
+       if (proxy->server_io == NULL)
+               str_append(reason, ", client output blocked");
+       if (proxy->client_io == NULL)
+               str_append(reason, ", server output blocked");
+       str_append_c(reason, ')');
        if (server)
-               login_proxy_free_delayed(proxy, reason);
+               login_proxy_free_delayed(_proxy, str_c(reason));
        else
-               login_proxy_free_reason(proxy, reason);
+               login_proxy_free_reason(_proxy, str_c(reason));
 }
 
 static void server_input(struct login_proxy *proxy)