dovecot-2.2: lib-dns: If existing dns connection dies in write()...

dovecot at dovecot.org dovecot at dovecot.org
Sat Nov 23 18:35:27 EET 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/29e98eb92955
changeset: 17012:29e98eb92955
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Nov 23 18:35:08 2013 +0200
description:
lib-dns: If existing dns connection dies in write(), retry connect once.

diffstat:

 src/lib-dns/dns-lookup.c |  42 ++++++++++++++++++++++++++++++++----------
 1 files changed, 32 insertions(+), 10 deletions(-)

diffs (63 lines):

diff -r 8bd6c378afd2 -r 29e98eb92955 src/lib-dns/dns-lookup.c
--- a/src/lib-dns/dns-lookup.c	Sat Nov 23 12:19:49 2013 +0200
+++ b/src/lib-dns/dns-lookup.c	Sat Nov 23 18:35:08 2013 +0200
@@ -303,6 +303,28 @@
 }
 
 static int
+dns_client_send_request(struct dns_client *client, const char *cmd,
+			const char **error_r)
+{
+	int ret;
+
+	if (client->fd == -1) {
+		if (dns_client_connect(client, error_r) < 0)
+			return -1;
+		ret = -1;
+	} else {
+		/* already connected. if write() fails, retry connecting */
+		ret = 0;
+	}
+
+	if (write_full(client->fd, cmd, strlen(cmd)) < 0) {
+		*error_r = t_strdup_printf("write(%s) failed: %m", client->path);
+		return ret;
+	}
+	return 1;
+}
+
+static int
 dns_client_lookup_common(struct dns_client *client,
 			 const char *cmd, bool ptr_lookup,
 			 dns_lookup_callback_t *callback, void *context,
@@ -310,20 +332,20 @@
 {
 	struct dns_lookup *lookup;
 	struct dns_lookup_result result;
+	int ret;
 
 	memset(&result, 0, sizeof(result));
 	result.ret = EAI_FAIL;
 
-	if (dns_client_connect(client, &result.error) < 0) {
-		callback(&result, context);
-		return -1;
-	}
-	if (write_full(client->fd, cmd, strlen(cmd)) < 0) {
-		result.error = t_strdup_printf("write(%s) failed: %m",
-					       client->path);
-		dns_client_disconnect(client, result.error);
-		callback(&result, context);
-		return -1;
+	if ((ret = dns_client_send_request(client, cmd, &result.error)) <= 0) {
+		if (ret == 0) {
+			/* retry once */
+			ret = dns_client_send_request(client, cmd, &result.error);
+		}
+		if (ret <= 0) {
+			callback(&result, context);
+			return -1;
+		}
 	}
 
 	lookup = i_new(struct dns_lookup, 1);


More information about the dovecot-cvs mailing list