]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm: If we get disconnected from server, log the reason.
authorTimo Sirainen <tss@iki.fi>
Tue, 6 Aug 2013 12:11:14 +0000 (15:11 +0300)
committerTimo Sirainen <tss@iki.fi>
Tue, 6 Aug 2013 12:11:14 +0000 (15:11 +0300)
src/doveadm/doveadm-mail-server.c
src/doveadm/dsync/doveadm-dsync.c
src/doveadm/server-connection.c
src/doveadm/server-connection.h

index 41e7edc1dd5e9cc349ed219fdbd31dad3b229ce9..dab66666b3b938470ff09babad391faffdba96c8 100644 (file)
@@ -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;
index d1e2a4f92b17cb2620f80b74f1397f1dd579315a..f70620eb896b8e9da084285f030744eb9f0adb47 100644 (file)
@@ -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";
index 06f476781a10434efd7391865fe6c54e964ccef5..280abf861953391717b82df6bdb4e5ea00bcf208 100644 (file)
@@ -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();
 
index 8cf7f86b8ae45bdb207861a631b38e6da4f8b7f5..b30acc0750442952b43a2b7b2361c9fe00db1c4c 100644 (file)
@@ -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);