X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fadns.c;h=758c08088bd5f6fbbe97b23afae94f1143fbbed5;hb=e38737be28c742b241a6b0ffdbad541c3c0b13b2;hp=2776a4c5494bfa562ecb4163812c89740d925957;hpb=5b72f55e11cf44d788a788e7231927bc2a3fbe2d;p=meshlink diff --git a/src/adns.c b/src/adns.c index 2776a4c5..758c0808 100644 --- a/src/adns.c +++ b/src/adns.c @@ -20,9 +20,9 @@ #include "system.h" #include -#include #include "adns.h" +#include "devtools.h" #include "logger.h" #include "xalloc.h" @@ -48,6 +48,7 @@ static void *adns_loop(void *data) { if(time(NULL) < item->deadline) { logger(mesh, MESHLINK_DEBUG, "Resolving %s port %s", item->host, item->serv); + devtool_adns_resolve_probe(); int result = getaddrinfo(item->host, item->serv, NULL, &item->ai); if(result) { @@ -83,8 +84,9 @@ static void adns_cb_handler(event_loop_t *loop, void *data) { } void init_adns(meshlink_handle_t *mesh) { - signal_add(&mesh->loop, &mesh->adns_signal, adns_cb_handler, mesh, 1); meshlink_queue_init(&mesh->adns_queue); + meshlink_queue_init(&mesh->adns_done_queue); + signal_add(&mesh->loop, &mesh->adns_signal, adns_cb_handler, mesh, 1); pthread_create(&mesh->adns_thread, NULL, adns_loop, mesh); } @@ -136,19 +138,28 @@ struct adns_blocking_info { char *host; char *serv; struct addrinfo *ai; + int socktype; bool done; }; -void *adns_blocking_handler(void *data) { +static void *adns_blocking_handler(void *data) { struct adns_blocking_info *info = data; logger(info->mesh, MESHLINK_DEBUG, "Resolving %s port %s", info->host, info->serv); + devtool_adns_resolve_probe(); - if(getaddrinfo(info->host, info->serv, NULL, &info->ai)) { + struct addrinfo hint = { + .ai_family = AF_UNSPEC, + .ai_socktype = info->socktype, + }; + + if(getaddrinfo(info->host, info->serv, &hint, &info->ai)) { info->ai = NULL; } - pthread_mutex_lock(&info->mutex); + if(pthread_mutex_lock(&info->mutex) != 0) { + abort(); + } bool cleanup = info->done; @@ -168,12 +179,15 @@ void *adns_blocking_handler(void *data) { return NULL; } -struct addrinfo *adns_blocking_request(meshlink_handle_t *mesh, char *host, char *serv, int timeout) { +struct addrinfo *adns_blocking_request(meshlink_handle_t *mesh, char *host, char *serv, int socktype, int timeout) { struct adns_blocking_info *info = xzalloc(sizeof(*info)); info->mesh = mesh; info->host = host; info->serv = serv; + info->socktype = socktype; + pthread_mutex_init(&info->mutex, NULL); + pthread_cond_init(&info->cond, NULL); struct timespec deadline; clock_gettime(CLOCK_REALTIME, &deadline); @@ -190,7 +204,10 @@ struct addrinfo *adns_blocking_request(meshlink_handle_t *mesh, char *host, char pthread_detach(thread); } - pthread_mutex_lock(&info->mutex); + if(pthread_mutex_lock(&info->mutex) != 0) { + abort(); + } + pthread_cond_timedwait(&info->cond, &info->mutex, &deadline); struct addrinfo *result = NULL;