]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
dns, lib-dns: Move to protocol v1.0
authorAki Tuomi <aki.tuomi@dovecot.fi>
Fri, 17 Aug 2018 08:33:18 +0000 (11:33 +0300)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Tue, 13 Nov 2018 13:09:32 +0000 (15:09 +0200)
src/dns/dns-client.c
src/lib-dns/dns-lookup.c
src/lib-http/test-http-client-errors.c
src/lib-smtp/test-smtp-client-errors.c

index af6a535bf5d7f09cc43d3deb401d17e9fbfd1bd8..c535f86bf6fb65587133d2ce9907c30619bc2f44 100644 (file)
@@ -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
 };
index 19503d890be0ab1a2cb4aec4377c3d2a6eb6ed0b..a4c6108eff470c654b70053fe2991bd7a4cba68a 100644 (file)
@@ -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,
index 2332ef7119be745d836d3a37902482dd22180eb2..f3750d9e6c790f0623322f43a1629ac995d99460 100644 (file)
@@ -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;
index 19912477ce832fc3fb807bd2c81b66ae6715a9e1..32f8eb89139fade12adf1d32041792b22145f8da 100644 (file)
@@ -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);
 }