From: Aki Tuomi Date: Fri, 17 Aug 2018 08:33:18 +0000 (+0300) Subject: dns, lib-dns: Move to protocol v1.0 X-Git-Tag: 2.3.4~126 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a18527cae7f7c1af02c286083b0a0f610e09aad5;p=thirdparty%2Fdovecot%2Fcore.git dns, lib-dns: Move to protocol v1.0 --- diff --git a/src/dns/dns-client.c b/src/dns/dns-client.c index af6a535bf5..c535f86bf6 100644 --- a/src/dns/dns-client.c +++ b/src/dns/dns-client.c @@ -61,17 +61,17 @@ static int dns_client_input_args(struct connection *client, const char *const *a } else { ARRAY_TYPE(const_string) tmp; t_array_init(&tmp, ips_count); - o_stream_nsend_str(client->output, - t_strdup_printf("0 %u\n", ips_count)); + o_stream_nsend_str(client->output, "0\t"); for (i = 0; i < ips_count; i++) { const char *ip = net_ip2addr(&ips[i]); array_append(&tmp, &ip, 1); - o_stream_nsend_str(client->output, t_strconcat( - net_ip2addr(&ips[i]), "\n", NULL)); } array_append_zero(&tmp); e_debug(e->event(), "Resolve success: %s", t_strarray_join(array_idx(&tmp, 0), ", ")); + o_stream_nsend_str(client->output, + t_strarray_join(array_idx(&tmp, 0), "\t")); + o_stream_nsend_str(client->output, "\n"); } event_unref(&event); } else if (strcmp(args[0], "NAME") == 0) { @@ -86,16 +86,16 @@ static int dns_client_input_args(struct connection *client, const char *const *a e->add_str("error", err); e_debug(e->event(), "Resolve failed: %s", err); o_stream_nsend_str(client->output, - t_strdup_printf("%d\n", ret)); + t_strdup_printf("%d\t%s\n", ret, err)); } else { e_debug(e->event(), "Resolve success: %s", name); o_stream_nsend_str(client->output, - t_strdup_printf("0 %s\n", name)); + t_strdup_printf("0\t%s\n", name)); } } else { e->add_str("error", "Unknown command"); e_error(e->event(), "Unknown command '%s'", args[0]); - o_stream_nsend_str(client->output, "Unknown command\n"); + o_stream_nsend_str(client->output, "-1\tUnknown command\n"); } event_unref(&event); @@ -117,7 +117,10 @@ static const struct connection_vfuncs dns_client_vfuncs = { }; static const struct connection_settings dns_client_set = { - .dont_send_version = TRUE, + .service_name_in = "dns-client", + .service_name_out = "dns", + .major_version = 1, + .minor_version = 0, .input_max_size = (size_t)-1, .output_max_size = (size_t)-1 }; diff --git a/src/lib-dns/dns-lookup.c b/src/lib-dns/dns-lookup.c index 19503d890b..a4c6108eff 100644 --- a/src/lib-dns/dns-lookup.c +++ b/src/lib-dns/dns-lookup.c @@ -3,6 +3,7 @@ #include "lib.h" #include "ioloop.h" #include "str.h" +#include "array.h" #include "ostream.h" #include "connection.h" #include "lib-event.h" @@ -124,41 +125,28 @@ static int dns_lookup_input_args(struct dns_lookup *lookup, const char *const *a { struct dns_lookup_result *result = &lookup->result; - /* temporary workaround until protocol change */ - args = t_strsplit_spaces(args[0], " "); - - if (result->ips_count == 0) { - /* first reply MUST start with number */ - if (str_to_int(args[0], &result->ret) < 0) - return -1; + if (str_to_int(args[0], &result->ret) < 0) + return -1; + if (result->ret != 0) { + result->error = args[1]; + return 1; + } - if (lookup->ptr_lookup) { - if (result->ret == 0) { - result->name = lookup->name = - i_strdup(args[1]); - } else { - result->error = net_gethosterror(result->ret); - } - return 1; - } + if (lookup->ptr_lookup) { + result->name = lookup->name = i_strdup(args[1]); + return 1; + } - if (str_to_uint(args[1], &result->ips_count) < 0) { + ARRAY(struct ip_addr) ips; + i_array_init(&ips, 2); + for(unsigned int i = 1; args[i] != NULL; i++) { + struct ip_addr *ip = array_append_space(&ips); + if (net_addr2ip(args[i], ip) < 0) return -1; - } else if (result->ret != 0) { - result->error = net_gethosterror(result->ret); - return 1; - } - result->ips = lookup->ips = - i_new(struct ip_addr, result->ips_count); - } else { - if (net_addr2ip(args[0], &lookup->ips[lookup->ip_idx]) < 0) - return -1; - if (++lookup->ip_idx == result->ips_count) { - result->ret = 0; - return 1; - } } - return 0; + result->ips = array_get(&ips, &result->ips_count); + + return 1; } static void dns_lookup_save_msecs(struct dns_lookup *lookup) @@ -307,7 +295,10 @@ static const struct connection_vfuncs dns_client_vfuncs = { }; static const struct connection_settings dns_client_set = { - .dont_send_version = TRUE, + .service_name_in = "dns", + .service_name_out = "dns-client", + .major_version = 1, + .minor_version = 0, .input_max_size = (size_t)-1, .output_max_size = (size_t)-1, .client = TRUE, diff --git a/src/lib-http/test-http-client-errors.c b/src/lib-http/test-http-client-errors.c index 2332ef7119..f3750d9e6c 100644 --- a/src/lib-http/test-http-client-errors.c +++ b/src/lib-http/test-http-client-errors.c @@ -27,6 +27,7 @@ struct server_connection { struct connection conn; pool_t pool; + bool version_sent:1; }; typedef void (*test_server_init_t)(unsigned int index); @@ -2380,8 +2381,13 @@ static void test_dns_timeout(void) static void test_dns_lookup_failure_input(struct server_connection *conn) { + if (!conn->version_sent) { + conn->version_sent = TRUE; + o_stream_nsend_str(conn->conn.output, "VERSION\tdns\t1\t0\n"); + } + o_stream_nsend_str(conn->conn.output, - t_strdup_printf("%d\n", EAI_FAIL)); + t_strdup_printf("%d\tFAIL\n", EAI_FAIL)); server_connection_deinit(&conn); } @@ -2469,16 +2475,21 @@ test_dns_lookup_ttl_input(struct server_connection *conn) static unsigned int count = 0; const char *line; + if (!conn->version_sent) { + conn->version_sent = TRUE; + o_stream_nsend_str(conn->conn.output, "VERSION\tdns\t1\t0\n"); + } + while ((line=i_stream_read_next_line(conn->conn.input)) != NULL) { if (debug) i_debug("DNS REQUEST %u: %s", count, line); if (count == 0) { o_stream_nsend_str(conn->conn.output, - "0 1\n127.0.0.1\n"); + "0\t127.0.0.1\n"); } else { o_stream_nsend_str(conn->conn.output, - t_strdup_printf("%d\n", EAI_FAIL)); + t_strdup_printf("%d\tFAIL\n", EAI_FAIL)); if (count > 4) { server_connection_deinit(&conn); return; @@ -2767,16 +2778,21 @@ test_dns_reconnect_failure_input(struct server_connection *conn) static unsigned int count = 0; const char *line; + if (!conn->version_sent) { + conn->version_sent = TRUE; + o_stream_nsend_str(conn->conn.output, "VERSION\tdns\t1\t0\n"); + } + while ((line=i_stream_read_next_line(conn->conn.input)) != NULL) { if (debug) i_debug("DNS REQUEST %u: %s", count, line); if (count == 0) { o_stream_nsend_str(conn->conn.output, - "0 1\n127.0.0.1\n"); + "0\t127.0.0.1\n"); } else { o_stream_nsend_str(conn->conn.output, - t_strdup_printf("%d\n", EAI_FAIL)); + t_strdup_printf("%d\tFAIL\n", EAI_FAIL)); if (count > 4) { server_connection_deinit(&conn); return; diff --git a/src/lib-smtp/test-smtp-client-errors.c b/src/lib-smtp/test-smtp-client-errors.c index 19912477ce..32f8eb8913 100644 --- a/src/lib-smtp/test-smtp-client-errors.c +++ b/src/lib-smtp/test-smtp-client-errors.c @@ -2194,7 +2194,7 @@ static void test_dns_lookup_failure_input(struct server_connection *conn) { o_stream_nsend_str(conn->conn.output, - t_strdup_printf("%d\n", EAI_FAIL)); + t_strdup_printf("VERSION\tdns\t1\t0\n%d\tFAIL\n", EAI_FAIL)); server_connection_deinit(&conn); }