From c38455c65f9968ccf7e870c3cce30fa19f319376 Mon Sep 17 00:00:00 2001 From: lurchi Date: Sun, 24 Jun 2018 23:31:07 +0200 Subject: use the asynchronous DNS resolution API (getaddrinfo_a) in the resolver module --- src/util/resolver_api.c | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) (limited to 'src/util/resolver_api.c') diff --git a/src/util/resolver_api.c b/src/util/resolver_api.c index afebabf08..b94819f06 100644 --- a/src/util/resolver_api.c +++ b/src/util/resolver_api.c @@ -68,6 +68,11 @@ static struct GNUNET_RESOLVER_RequestHandle *req_head; */ static struct GNUNET_RESOLVER_RequestHandle *req_tail; +/** + * ID of the last request we sent to the service + */ +static uint32_t last_request_id; + /** * How long should we wait to reconnect? */ @@ -136,6 +141,11 @@ struct GNUNET_RESOLVER_RequestHandle */ int af; + /** + * Identifies the request. The response will contain this id. + */ + uint32_t id; + /** * Has this request been transmitted to the service? * #GNUNET_YES if transmitted @@ -435,11 +445,13 @@ process_requests () GNUNET_MESSAGE_TYPE_RESOLVER_REQUEST); msg->direction = htonl (rh->direction); msg->af = htonl (rh->af); + msg->id = htonl (rh->id); GNUNET_memcpy (&msg[1], &rh[1], rh->data_len); LOG (GNUNET_ERROR_TYPE_DEBUG, - "Transmitting DNS resolution request to DNS service\n"); + "Transmitting DNS resolution request (ID %u) to DNS service\n", + rh->id); GNUNET_MQ_send (mq, env); rh->was_transmitted = GNUNET_YES; @@ -454,7 +466,7 @@ process_requests () */ static int check_response (void *cls, - const struct GNUNET_MessageHeader *msg) + const struct GNUNET_RESOLVER_ResponseMessage *msg) { (void) cls; (void) msg; @@ -474,11 +486,18 @@ check_response (void *cls, */ static void handle_response (void *cls, - const struct GNUNET_MessageHeader *msg) + const struct GNUNET_RESOLVER_ResponseMessage *msg) { struct GNUNET_RESOLVER_RequestHandle *rh = req_head; uint16_t size; char *nret; + uint32_t request_id = msg->id; + + for (; rh != NULL; rh = rh->next) + { + if (rh->id == request_id) + break; + } (void) cls; if (NULL == rh) @@ -490,8 +509,8 @@ handle_response (void *cls, reconnect (); return; } - size = ntohs (msg->size); - if (size == sizeof (struct GNUNET_MessageHeader)) + size = ntohs (msg->header.size); + if (size == sizeof (struct GNUNET_RESOLVER_ResponseMessage)) { LOG (GNUNET_ERROR_TYPE_DEBUG, "Received empty response from DNS service\n"); @@ -532,7 +551,7 @@ handle_response (void *cls, const char *hostname; hostname = (const char *) &msg[1]; - if (hostname[size - sizeof (struct GNUNET_MessageHeader) - 1] != '\0') + if (hostname[size - sizeof (struct GNUNET_RESOLVER_ResponseMessage) - 1] != '\0') { GNUNET_break (0); if (GNUNET_SYSERR != rh->was_transmitted) @@ -566,7 +585,7 @@ handle_response (void *cls, size_t ip_len; ip = &msg[1]; - ip_len = size - sizeof (struct GNUNET_MessageHeader); + ip_len = size - sizeof (struct GNUNET_RESOLVER_ResponseMessage); if (ip_len == sizeof (struct in_addr)) { memset (&v4, 0, sizeof (v4)); @@ -763,7 +782,7 @@ reconnect_task (void *cls) struct GNUNET_MQ_MessageHandler handlers[] = { GNUNET_MQ_hd_var_size (response, GNUNET_MESSAGE_TYPE_RESOLVER_RESPONSE, - struct GNUNET_MessageHeader, + struct GNUNET_RESOLVER_ResponseMessage, NULL), GNUNET_MQ_handler_end () }; @@ -926,6 +945,7 @@ GNUNET_RESOLVER_ip_get (const char *hostname, hostname); rh = GNUNET_malloc (sizeof (struct GNUNET_RESOLVER_RequestHandle) + slen); rh->af = af; + rh->id = ++last_request_id; rh->addr_callback = callback; rh->cls = callback_cls; GNUNET_memcpy (&rh[1], @@ -1072,6 +1092,7 @@ GNUNET_RESOLVER_hostname_get (const struct sockaddr *sa, rh->name_callback = callback; rh->cls = cls; rh->af = sa->sa_family; + rh->id = ++last_request_id; rh->timeout = GNUNET_TIME_relative_to_absolute (timeout); GNUNET_memcpy (&rh[1], ip, -- cgit v1.2.3