changeset 20479:0fd0da4a3cfb

dict-client: When skipping connect() due to earlier failure, preserve the original error.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Fri, 01 Jul 2016 11:56:46 +0300
parents 84191902a866
children 4909fa3325e8
files src/lib-dict/dict-client.c
diffstat 1 files changed, 11 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-dict/dict-client.c	Fri Jul 01 11:41:51 2016 +0300
+++ b/src/lib-dict/dict-client.c	Fri Jul 01 11:56:46 2016 +0300
@@ -61,6 +61,8 @@
 	enum dict_data_type value_type;
 
 	time_t last_failed_connect;
+	char *last_connect_error;
+
 	struct ioloop *ioloop, *prev_ioloop;
 	struct timeout *to_requests;
 	struct timeout *to_idle;
@@ -374,25 +376,28 @@
 
 static int client_dict_connect(struct client_dict *dict, const char **error_r)
 {
-	const char *query;
+	const char *query, *error;
 
 	if (dict->conn.conn.fd_in != -1)
 		return 0;
 	if (dict->last_failed_connect == ioloop_time) {
 		/* Try again later */
-		*error_r = "Waiting until the next connect attempt";
+		*error_r = dict->last_connect_error;
 		return -1;
 	}
 
 	if (connection_client_connect(&dict->conn.conn) < 0) {
 		dict->last_failed_connect = ioloop_time;
 		if (errno == EACCES) {
-			*error_r = eacces_error_get("net_connect_unix",
-						    dict->conn.conn.name);
+			error = eacces_error_get("net_connect_unix",
+						 dict->conn.conn.name);
 		} else {
-			*error_r = t_strdup_printf(
+			error = t_strdup_printf(
 				"net_connect_unix(%s) failed: %m", dict->conn.conn.name);
 		}
+		i_free(dict->last_connect_error);
+		dict->last_connect_error = i_strdup(error);
+		*error_r = error;
 		return -1;
 	}
 
@@ -540,6 +545,7 @@
 	io_loop_set_current(old_ioloop);
 
 	array_free(&dict->cmds);
+	i_free(dict->last_connect_error);
 	i_free(dict->username);
 	i_free(dict->uri);
 	i_free(dict);