dovecot-2.2: login proxy: If writing to ostream fails, log the o...
dovecot at dovecot.org
dovecot at dovecot.org
Wed Nov 11 15:40:56 UTC 2015
details: http://hg.dovecot.org/dovecot-2.2/rev/e7f71caad9c5
changeset: 19352:e7f71caad9c5
user: Timo Sirainen <tss at iki.fi>
date: Wed Nov 11 17:40:23 2015 +0200
description:
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.
diffstat:
src/login-common/login-proxy.c | 46 +++++++++++++++++++++++++++--------------
1 files changed, 30 insertions(+), 16 deletions(-)
diffs (96 lines):
diff -r 9dd14c376418 -r e7f71caad9c5 src/login-common/login-proxy.c
--- 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;
}
More information about the dovecot-cvs
mailing list