Skip to content

Commit

Permalink
dns, lib-dns: Move to protocol v1.0
Browse files Browse the repository at this point in the history
  • Loading branch information
cmouse authored and villesavolainen committed Nov 13, 2018
1 parent 546417a commit a18527c
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 46 deletions.
19 changes: 11 additions & 8 deletions src/dns/dns-client.c
Expand Up @@ -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) {
Expand All @@ -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);
Expand All @@ -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
};
Expand Down
55 changes: 23 additions & 32 deletions src/lib-dns/dns-lookup.c
Expand Up @@ -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"
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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,
Expand Down
26 changes: 21 additions & 5 deletions src/lib-http/test-http-client-errors.c
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
}

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion src/lib-smtp/test-smtp-client-errors.c
Expand Up @@ -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);
}

Expand Down

0 comments on commit a18527c

Please sign in to comment.