process_title_set(t_strdup_printf(
"[dsync - connecting to %s]", server->name));
}
- if (server_connection_create(server, &conn) < 0) {
- ctx->error = "Couldn't create server connection";
+ if (server_connection_create(server, &conn, &error) < 0) {
+ ctx->error = p_strdup_printf(ctx->ctx.pool,
+ "Couldn't create server connection: %s", error);
} else {
if (doveadm_verbose_proctitle) {
process_title_set(t_strdup_printf(
doveadm_mail_server_handle(conn, user);
else if (array_count(&server->connections) <
I_MAX(ctx->set->doveadm_worker_count, 1)) {
- if (server_connection_create(server, &conn) < 0)
+ if (server_connection_create(server, &conn, error_r) < 0) {
internal_failure = TRUE;
- else
+ return -1;
+ } else {
doveadm_mail_server_handle(conn, user);
+ }
} else {
if (array_count(&server->queue) >= DOVEADM_SERVER_QUEUE_MAX)
doveadm_server_flush_one(server);
i_unreached();
}
-static int server_connection_read_settings(struct server_connection *conn)
+static int server_connection_read_settings(struct server_connection *conn,
+ const char **error_r)
{
const struct setting_parser_info *set_roots[] = {
&doveadm_setting_parser_info,
if (master_service_settings_read(master_service, &input,
&output, &error) < 0) {
- i_error("Error reading configuration: %s", error);
+ *error_r = t_strdup_printf(
+ "Error reading configuration: %s", error);
return -1;
}
set = master_service_settings_get_others(master_service)[0];
return 0;
}
-static int server_connection_init_ssl(struct server_connection *conn)
+static int server_connection_init_ssl(struct server_connection *conn,
+ const char **error_r)
{
struct ssl_iostream_settings ssl_set;
const char *error;
conn->server->hostname, &ssl_set,
&conn->input, &conn->output,
&conn->ssl_iostream, &error) < 0) {
- i_error("Couldn't initialize SSL client: %s", error);
+ *error_r = t_strdup_printf(
+ "Couldn't initialize SSL client: %s", error);
return -1;
}
if (ssl_iostream_handshake(conn->ssl_iostream) < 0) {
- i_error("SSL handshake failed: %s",
+ *error_r = t_strdup_printf(
+ "SSL handshake failed: %s",
ssl_iostream_get_last_error(conn->ssl_iostream));
return -1;
}
}
int server_connection_create(struct doveadm_server *server,
- struct server_connection **conn_r)
+ struct server_connection **conn_r,
+ const char **error_r)
{
struct server_connection *conn;
pool_t pool;
array_push_back(&conn->server->connections, &conn);
- if (server_connection_read_settings(conn) < 0 ||
- server_connection_init_ssl(conn) < 0) {
+ if (server_connection_read_settings(conn, error_r) < 0 ||
+ server_connection_init_ssl(conn, error_r) < 0) {
server_connection_destroy(&conn);
return -1;
}