From: Aki Tuomi Date: Tue, 31 Jul 2018 09:51:54 +0000 (+0300) Subject: dns: Add event support X-Git-Tag: 2.3.9~1523 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=442800357c3ba0e7bd3cbd3e8804bcd8bd9d2b9e;p=thirdparty%2Fdovecot%2Fcore.git dns: Add event support --- diff --git a/src/dns/dns-client.c b/src/dns/dns-client.c index 8c3a6bd47a..af6a535bf5 100644 --- a/src/dns/dns-client.c +++ b/src/dns/dns-client.c @@ -11,22 +11,40 @@ #include +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) { @@ -34,37 +52,61 @@ static int dns_client_input_args(struct connection *client, const char *const *a 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); } @@ -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;