From: Timo Sirainen Date: Tue, 6 Aug 2013 12:11:14 +0000 (+0300) Subject: doveadm: If we get disconnected from server, log the reason. X-Git-Tag: 2.2.6~157 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=956b8eea7ae479a38b25175447fc8eac2df30480;p=thirdparty%2Fdovecot%2Fcore.git doveadm: If we get disconnected from server, log the reason. --- diff --git a/src/doveadm/doveadm-mail-server.c b/src/doveadm/doveadm-mail-server.c index 41e7edc1dd..dab66666b3 100644 --- a/src/doveadm/doveadm-mail-server.c +++ b/src/doveadm/doveadm-mail-server.c @@ -81,7 +81,8 @@ static bool doveadm_server_have_used_connections(struct doveadm_server *server) return FALSE; } -static void doveadm_cmd_callback(int exit_code, void *context) +static void doveadm_cmd_callback(int exit_code, const char *error, + void *context) { struct doveadm_mail_server_cmd *servercmd = context; struct doveadm_server *server = @@ -95,7 +96,8 @@ static void doveadm_cmd_callback(int exit_code, void *context) case 0: break; case SERVER_EXIT_CODE_DISCONNECTED: - i_error("%s: Internal failure for %s", server->name, username); + i_error("%s: Internal failure for %s: %s", + server->name, username, error); internal_failure = TRUE; master_service_stop(master_service); return; diff --git a/src/doveadm/dsync/doveadm-dsync.c b/src/doveadm/dsync/doveadm-dsync.c index d1e2a4f92b..f70620eb89 100644 --- a/src/doveadm/dsync/doveadm-dsync.c +++ b/src/doveadm/dsync/doveadm-dsync.c @@ -621,7 +621,8 @@ cmd_dsync_run(struct doveadm_mail_cmd_context *_ctx, struct mail_user *user) return ret; } -static void dsync_connected_callback(int exit_code, void *context) +static void dsync_connected_callback(int exit_code, const char *error, + void *context) { struct dsync_cmd_context *ctx = context; @@ -632,7 +633,8 @@ static void dsync_connected_callback(int exit_code, void *context) &ctx->output, &ctx->ssl_iostream); break; case SERVER_EXIT_CODE_DISCONNECTED: - ctx->error = "Disconnected from remote"; + ctx->error = p_strdup_printf(ctx->ctx.pool, + "Disconnected from remote: %s", error); break; case EX_NOUSER: ctx->error = "Unknown user in remote"; diff --git a/src/doveadm/server-connection.c b/src/doveadm/server-connection.c index 06f476781a..280abf8619 100644 --- a/src/doveadm/server-connection.c +++ b/src/doveadm/server-connection.c @@ -79,12 +79,13 @@ static void print_connection_released(void) } static void -server_connection_callback(struct server_connection *conn, int exit_code) +server_connection_callback(struct server_connection *conn, + int exit_code, const char *error) { server_cmd_callback_t *callback = conn->callback; conn->callback = NULL; - callback(exit_code, conn->context); + callback(exit_code, error, conn->context); } static void stream_data(string_t *str, const unsigned char *data, size_t size) @@ -266,7 +267,7 @@ static void server_connection_input(struct server_connection *conn) if (line == NULL) return; if (line[0] == '+') - server_connection_callback(conn, 0); + server_connection_callback(conn, 0, ""); else if (line[0] == '-') { line++; if (strcmp(line, "NOUSER") == 0) @@ -275,7 +276,7 @@ static void server_connection_input(struct server_connection *conn) /* old doveadm-server */ exit_code = EX_TEMPFAIL; } - server_connection_callback(conn, exit_code); + server_connection_callback(conn, exit_code, line); } else { i_error("doveadm server sent broken input " "(expected cmd reply): %s", line); @@ -405,6 +406,7 @@ void server_connection_destroy(struct server_connection **_conn) { struct server_connection *conn = *_conn; struct server_connection *const *conns; + const char *error; unsigned int i, count; *_conn = NULL; @@ -417,8 +419,16 @@ void server_connection_destroy(struct server_connection **_conn) } } - if (conn->callback != NULL) - server_connection_callback(conn, SERVER_EXIT_CODE_DISCONNECTED); + if (conn->callback != NULL) { + error = conn->ssl_iostream == NULL ? NULL : + ssl_iostream_get_last_error(conn->ssl_iostream); + if (error == NULL) { + error = conn->input->stream_errno == 0 ? "EOF" : + strerror(conn->input->stream_errno); + } + server_connection_callback(conn, SERVER_EXIT_CODE_DISCONNECTED, + error); + } if (printing_conn == conn) print_connection_released(); diff --git a/src/doveadm/server-connection.h b/src/doveadm/server-connection.h index 8cf7f86b8a..b30acc0750 100644 --- a/src/doveadm/server-connection.h +++ b/src/doveadm/server-connection.h @@ -7,7 +7,8 @@ struct doveadm_server; struct server_connection; struct ssl_iostream; -typedef void server_cmd_callback_t(int exit_code, void *context); +typedef void server_cmd_callback_t(int exit_code, const char *error, + void *context); int server_connection_create(struct doveadm_server *server, struct server_connection **conn_r);