]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
dns: Add event support
authorAki Tuomi <aki.tuomi@dovecot.fi>
Tue, 31 Jul 2018 09:51:54 +0000 (12:51 +0300)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Tue, 13 Nov 2018 13:09:32 +0000 (15:09 +0200)
src/dns/dns-client.c

index 8c3a6bd47abeb7082f1c28146ff94df9a90e49fc..af6a535bf5d7f09cc43d3deb401d17e9fbfd1bd8 100644 (file)
 
 #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) {
@@ -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;