Skip to content

Commit

Permalink
dns: Add event support
Browse files Browse the repository at this point in the history
  • Loading branch information
cmouse committed Aug 24, 2018
1 parent 7e5f30e commit 4428003
Showing 1 changed file with 49 additions and 5 deletions.
54 changes: 49 additions & 5 deletions src/dns/dns-client.c
Expand Up @@ -11,60 +11,102 @@

#include <unistd.h>

static struct event_category event_category_dns = {
.name = "dns-worker"
};

static struct connection_list *dns_clients = NULL;

static int dns_client_input_args(struct connection *client, const char *const *args)
{
struct ip_addr *ips, ip;
const char *name;
struct event *event;
unsigned int i, ips_count;
int ret;
struct event_passthrough *e;

if (strcmp(args[0], "QUIT") == 0) {
return -1;
} else if (args[1] == NULL) {
i_error("Got empty request");
e_error(client->event, "Got empty request");
return -1;
}

event = event_create(client->event);
event_set_append_log_prefix(event, t_strconcat(args[1], ": ", NULL));

e = event_create_passthrough(event)->
set_name("dns_worker_request_started")->
add_str("name", args[1]);
e_debug(e->event(), "Resolving");

e = event_create_passthrough(event)->
set_name("dns_worker_request_finished")->
add_str("name", args[1]);

if (strcmp(args[0], "IP") == 0) {
ret = net_gethostbyname(args[1], &ips, &ips_count);
if (ret == 0 && ips_count == 0) {
/* shouldn't happen, but fix it anyway.. */
ret = EAI_NONAME;
}
if (ret != 0) {
const char *err = net_gethosterror(ret);
e->add_int("error_code", ret);
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));
} 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));
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), ", "));
}
event_unref(&event);
} else if (strcmp(args[0], "NAME") == 0) {
if (net_addr2ip(args[1], &ip) < 0)
o_stream_nsend_str(client->output, "-1\n");
else if ((ret = net_gethostbyaddr(&ip, &name)) != 0) {
if (net_addr2ip(args[1], &ip) < 0) {
e->add_int("error_code", EAI_FAIL);
e->add_str("error", "Not an IP");
e_debug(e->event(), "Resolve failed: Not an IP");
o_stream_nsend_str(client->output, "-1\tNot an IP\n");
} else if ((ret = net_gethostbyaddr(&ip, &name)) != 0) {
const char *err = net_gethosterror(ret);
e->add_int("error_code", ret);
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));
} else {
e_debug(e->event(), "Resolve success: %s", name);
o_stream_nsend_str(client->output,
t_strdup_printf("0 %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");
}

event_unref(&event);

return 1;
}

static void dns_client_destroy(struct connection *client)
{
connection_deinit(client);
event_unref(&client->event);
i_free(client);
master_service_client_connection_destroyed(master_service);
}
Expand All @@ -86,11 +128,13 @@ static void client_connected(struct master_service_connection *master_conn)
master_service_client_connection_accept(master_conn);
connection_init_server(dns_clients, conn, master_conn->name,
master_conn->fd, master_conn->fd);
event_add_category(conn->event, &event_category_dns);
}

int main(int argc, char *argv[])
{
master_service = master_service_init("dns-client", 0, &argc, &argv, "");
master_service = master_service_init("dns-client", MASTER_SERVICE_FLAG_SEND_STATS,
&argc, &argv, "");
if (master_getopt(master_service) > 0)
return FATAL_DEFAULT;

Expand Down

0 comments on commit 4428003

Please sign in to comment.