From 84d6a0db5e92d043dcf0914378e681579cabd682 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 7 Jun 2015 17:57:19 +0000 Subject: [PATCH] -return IP in dotted decimal if reverse lookup fails --- src/util/gnunet-service-resolver.c | 59 ++++++++++++++++++++++-------- src/util/resolver_api.c | 27 ++++++++++++-- 2 files changed, 66 insertions(+), 20 deletions(-) diff --git a/src/util/gnunet-service-resolver.c b/src/util/gnunet-service-resolver.c index 1ca37f8c8..067dfefc9 100644 --- a/src/util/gnunet-service-resolver.c +++ b/src/util/gnunet-service-resolver.c @@ -101,6 +101,7 @@ getnameinfo_resolve (struct IPCache *cache) struct sockaddr_in v4; struct sockaddr_in6 v6; size_t salen; + int ret; switch (cache->af) { @@ -131,13 +132,19 @@ getnameinfo_resolve (struct IPCache *cache) } if (0 == - getnameinfo (sa, salen, - hostname, sizeof (hostname), - NULL, - 0, 0)) + (ret = getnameinfo (sa, salen, + hostname, sizeof (hostname), + NULL, + 0, 0))) { cache->addr = GNUNET_strdup (hostname); } + else + { + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "getnameinfo failed: %s\n", + gai_strerror (ret)); + } } #endif @@ -160,6 +167,12 @@ gethostbyaddr_resolve (struct IPCache *cache) { cache->addr = GNUNET_strdup (ent->h_name); } + else + { + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "gethostbyaddr failed: %s\n", + hstrerror (h_errno)); + } } #endif @@ -269,6 +282,9 @@ get_ip_as_string (struct GNUNET_SERVER_Client *client, GNUNET_SERVER_transmit_context_append_data (tc, pos->addr, strlen (pos->addr) + 1, GNUNET_MESSAGE_TYPE_RESOLVER_RESPONSE); + else + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Reverse lookup failed\n"); GNUNET_SERVER_transmit_context_append_data (tc, NULL, 0, GNUNET_MESSAGE_TYPE_RESOLVER_RESPONSE); GNUNET_SERVER_transmit_context_run (tc, GNUNET_TIME_UNIT_FOREVER_REL); @@ -307,7 +323,8 @@ getaddrinfo_resolve (struct GNUNET_SERVER_TransmitContext *tc, if (0 != (s = getaddrinfo (hostname, NULL, &hints, &result))) { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, _("Could not resolve `%s' (%s): %s\n"), + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + _("Could not resolve `%s' (%s): %s\n"), hostname, (af == AF_INET) ? "IPv4" : ((af == AF_INET6) ? "IPv6" : "any"), @@ -354,7 +371,8 @@ getaddrinfo_resolve (struct GNUNET_SERVER_TransmitContext *tc, #if HAVE_GETHOSTBYNAME2 static int gethostbyname2_resolve (struct GNUNET_SERVER_TransmitContext *tc, - const char *hostname, int af) + const char *hostname, + int af) { struct hostent *hp; int ret1; @@ -417,10 +435,11 @@ gethostbyname_resolve (struct GNUNET_SERVER_TransmitContext *tc, struct hostent *hp; hp = GETHOSTBYNAME (hostname); - if (hp == NULL) + if (NULL == hp) { GNUNET_log (GNUNET_ERROR_TYPE_INFO, - _("Could not find IP of host `%s': %s\n"), hostname, + _("Could not find IP of host `%s': %s\n"), + hostname, hstrerror (h_errno)); return GNUNET_SYSERR; } @@ -497,14 +516,15 @@ handle_get (void *cls, if (msize < sizeof (struct GNUNET_RESOLVER_GetMessage)) { GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + GNUNET_SERVER_receive_done (client, + GNUNET_SYSERR); return; } msg = (const struct GNUNET_RESOLVER_GetMessage *) message; size = msize - sizeof (struct GNUNET_RESOLVER_GetMessage); direction = ntohl (msg->direction); af = ntohl (msg->af); - if (direction == GNUNET_NO) + if (GNUNET_NO == direction) { /* IP from hostname */ const char *hostname; @@ -513,10 +533,12 @@ handle_get (void *cls, if (hostname[size - 1] != '\0') { GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + GNUNET_SERVER_receive_done (client, + GNUNET_SYSERR); return; } - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Resolver asked to look up `%s'.\n", + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Resolver asked to look up `%s'.\n", hostname); get_ip_from_hostname (client, hostname, af); return; @@ -528,7 +550,8 @@ handle_get (void *cls, if (size != sizeof (struct in_addr)) { GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + GNUNET_SERVER_receive_done (client, + GNUNET_SYSERR); return; } break; @@ -536,13 +559,15 @@ handle_get (void *cls, if (size != sizeof (struct in6_addr)) { GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + GNUNET_SERVER_receive_done (client, + GNUNET_SYSERR); return; } break; default: GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + GNUNET_SERVER_receive_done (client, + GNUNET_SYSERR); return; } { @@ -590,7 +615,9 @@ main (int argc, char *const *argv) ret = (GNUNET_OK == - GNUNET_SERVICE_run (argc, argv, "resolver", GNUNET_SERVICE_OPTION_NONE, + GNUNET_SERVICE_run (argc, argv, + "resolver", + GNUNET_SERVICE_OPTION_NONE, &run, NULL)) ? 0 : 1; while (NULL != (pos = cache_head)) { diff --git a/src/util/resolver_api.c b/src/util/resolver_api.c index 493fe046e..3469739e1 100644 --- a/src/util/resolver_api.c +++ b/src/util/resolver_api.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - Copyright (C) 2009-2014 Christian Grothoff (and other contributing authors) + Copyright (C) 2009-2015 Christian Grothoff (and other contributing authors) GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -78,13 +78,13 @@ static struct GNUNET_TIME_Relative backoff; /** * Task for reconnecting. */ -static struct GNUNET_SCHEDULER_Task * r_task; +static struct GNUNET_SCHEDULER_Task *r_task; /** * Task ID of shutdown task; only present while we have a * connection to the resolver service. */ -static struct GNUNET_SCHEDULER_Task * s_task; +static struct GNUNET_SCHEDULER_Task *s_task; /** @@ -401,13 +401,27 @@ handle_response (void *cls, size = ntohs (msg->size); if (size == sizeof (struct GNUNET_MessageHeader)) { + LOG (GNUNET_ERROR_TYPE_DEBUG, + "Received empty response from DNS service\n"); /* message contains not data, just header; end of replies */ /* check if request was canceled */ if (GNUNET_SYSERR != rh->was_transmitted) { + /* no reverse lookup was successful, return IP as string */ if (NULL != rh->name_callback) + { + if (GNUNET_NO == rh->received_response) + { + nret = no_resolve (rh->af, + &rh[1], + rh->data_len); + rh->name_callback (rh->cls, nret); + GNUNET_free (nret); + } + /* finally, make termination call */ rh->name_callback (rh->cls, NULL); + } if (NULL != rh->addr_callback) rh->addr_callback (rh->cls, NULL, @@ -495,6 +509,8 @@ handle_response (void *cls, reconnect (); return; } + LOG (GNUNET_ERROR_TYPE_DEBUG, + "Received IP from DNS service\n"); if (GNUNET_SYSERR != rh->was_transmitted) rh->addr_callback (rh->cls, sa, @@ -810,7 +826,8 @@ handle_lookup_timeout (void *cls, * @return handle that can be used to cancel the request, NULL on error */ struct GNUNET_RESOLVER_RequestHandle * -GNUNET_RESOLVER_ip_get (const char *hostname, int af, +GNUNET_RESOLVER_ip_get (const char *hostname, + int af, struct GNUNET_TIME_Relative timeout, GNUNET_RESOLVER_AddressCallback callback, void *callback_cls) @@ -938,10 +955,12 @@ GNUNET_RESOLVER_hostname_get (const struct sockaddr *sa, switch (sa->sa_family) { case AF_INET: + GNUNET_assert (salen == sizeof (struct sockaddr_in)); ip_len = sizeof (struct in_addr); ip = &((const struct sockaddr_in*)sa)->sin_addr; break; case AF_INET6: + GNUNET_assert (salen == sizeof (struct sockaddr_in6)); ip_len = sizeof (struct in6_addr); ip = &((const struct sockaddr_in6*)sa)->sin6_addr; break; -- 2.25.1