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 =
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;
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;
&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";
}
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)
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)
/* 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);
{
struct server_connection *conn = *_conn;
struct server_connection *const *conns;
+ const char *error;
unsigned int i, count;
*_conn = NULL;
}
}
- 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();
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);