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