} 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) {
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);
};
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
};
#include "lib.h"
#include "ioloop.h"
#include "str.h"
+#include "array.h"
#include "ostream.h"
#include "connection.h"
#include "lib-event.h"
{
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)
};
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,
struct connection conn;
pool_t pool;
+ bool version_sent:1;
};
typedef void (*test_server_init_t)(unsigned int index);
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);
}
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;
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;
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);
}