dovecot-2.2: doveadm: If we get disconnected from server, log th...

dovecot at dovecot.org dovecot at dovecot.org
Tue Aug 6 15:11:24 EEST 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/07557a9c59b1
changeset: 16667:07557a9c59b1
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Aug 06 15:11:14 2013 +0300
description:
doveadm: If we get disconnected from server, log the reason.

diffstat:

 src/doveadm/doveadm-mail-server.c |   6 ++++--
 src/doveadm/dsync/doveadm-dsync.c |   6 ++++--
 src/doveadm/server-connection.c   |  22 ++++++++++++++++------
 src/doveadm/server-connection.h   |   3 ++-
 4 files changed, 26 insertions(+), 11 deletions(-)

diffs (123 lines):

diff -r 58be84a381e5 -r 07557a9c59b1 src/doveadm/doveadm-mail-server.c
--- a/src/doveadm/doveadm-mail-server.c	Tue Aug 06 14:53:23 2013 +0300
+++ b/src/doveadm/doveadm-mail-server.c	Tue Aug 06 15:11:14 2013 +0300
@@ -81,7 +81,8 @@
 	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 @@
 	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 -r 58be84a381e5 -r 07557a9c59b1 src/doveadm/dsync/doveadm-dsync.c
--- a/src/doveadm/dsync/doveadm-dsync.c	Tue Aug 06 14:53:23 2013 +0300
+++ b/src/doveadm/dsync/doveadm-dsync.c	Tue Aug 06 15:11:14 2013 +0300
@@ -621,7 +621,8 @@
 	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 @@
 					  &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 -r 58be84a381e5 -r 07557a9c59b1 src/doveadm/server-connection.c
--- a/src/doveadm/server-connection.c	Tue Aug 06 14:53:23 2013 +0300
+++ b/src/doveadm/server-connection.c	Tue Aug 06 15:11:14 2013 +0300
@@ -79,12 +79,13 @@
 }
 
 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 @@
 		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 @@
 				/* 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 @@
 {
 	struct server_connection *conn = *_conn;
 	struct server_connection *const *conns;
+	const char *error;
 	unsigned int i, count;
 
 	*_conn = NULL;
@@ -417,8 +419,16 @@
 		}
 	}
 
-	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 -r 58be84a381e5 -r 07557a9c59b1 src/doveadm/server-connection.h
--- a/src/doveadm/server-connection.h	Tue Aug 06 14:53:23 2013 +0300
+++ b/src/doveadm/server-connection.h	Tue Aug 06 15:11:14 2013 +0300
@@ -7,7 +7,8 @@
 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);


More information about the dovecot-cvs mailing list