diff options
Diffstat (limited to 'src/util/resolver_api.c')
-rw-r--r-- | src/util/resolver_api.c | 43 |
1 files changed, 14 insertions, 29 deletions
diff --git a/src/util/resolver_api.c b/src/util/resolver_api.c index 371b2165a..ea9d55d54 100644 --- a/src/util/resolver_api.c +++ b/src/util/resolver_api.c | |||
@@ -277,45 +277,38 @@ GNUNET_RESOLVER_disconnect () | |||
277 | * @return address as a string, NULL on error | 277 | * @return address as a string, NULL on error |
278 | */ | 278 | */ |
279 | static char * | 279 | static char * |
280 | no_resolve (const struct sockaddr *sa, socklen_t salen) | 280 | no_resolve (int af, |
281 | const void *ip, socklen_t ip_len) | ||
281 | { | 282 | { |
282 | char *ret; | 283 | char buf[INET6_ADDRSTRLEN]; |
283 | char inet4[INET_ADDRSTRLEN]; | ||
284 | char inet6[INET6_ADDRSTRLEN]; | ||
285 | 284 | ||
286 | if (salen < sizeof (struct sockaddr)) | 285 | switch (af) |
287 | return NULL; | ||
288 | switch (sa->sa_family) | ||
289 | { | 286 | { |
290 | case AF_INET: | 287 | case AF_INET: |
291 | if (salen != sizeof (struct sockaddr_in)) | 288 | if (ip_len != sizeof (struct in_addr)) |
292 | return NULL; | 289 | return NULL; |
293 | if (NULL == | 290 | if (NULL == |
294 | inet_ntop (AF_INET, &((struct sockaddr_in *) sa)->sin_addr, inet4, | 291 | inet_ntop (AF_INET, ip, buf, sizeof (buf))) |
295 | INET_ADDRSTRLEN)) | ||
296 | { | 292 | { |
297 | LOG_STRERROR (GNUNET_ERROR_TYPE_WARNING, "inet_ntop"); | 293 | LOG_STRERROR (GNUNET_ERROR_TYPE_WARNING, "inet_ntop"); |
298 | return NULL; | 294 | return NULL; |
299 | } | 295 | } |
300 | ret = GNUNET_strdup (inet4); | ||
301 | break; | 296 | break; |
302 | case AF_INET6: | 297 | case AF_INET6: |
303 | if (salen != sizeof (struct sockaddr_in6)) | 298 | if (ip_len != sizeof (struct in6_addr)) |
304 | return NULL; | 299 | return NULL; |
305 | if (NULL == | 300 | if (NULL == |
306 | inet_ntop (AF_INET6, &((struct sockaddr_in6 *) sa)->sin6_addr, inet6, | 301 | inet_ntop (AF_INET6, ip, buf, sizeof (buf))) |
307 | INET6_ADDRSTRLEN)) | ||
308 | { | 302 | { |
309 | LOG_STRERROR (GNUNET_ERROR_TYPE_WARNING, "inet_ntop"); | 303 | LOG_STRERROR (GNUNET_ERROR_TYPE_WARNING, "inet_ntop"); |
310 | return NULL; | 304 | return NULL; |
311 | } | 305 | } |
312 | ret = GNUNET_strdup (inet6); | ||
313 | break; | 306 | break; |
314 | default: | 307 | default: |
315 | ret = NULL; | 308 | GNUNET_break (0); |
316 | break; | 309 | return NULL; |
317 | } | 310 | } |
318 | return ret; | 311 | return GNUNET_strdup (buf); |
319 | } | 312 | } |
320 | 313 | ||
321 | 314 | ||
@@ -368,7 +361,8 @@ handle_response (void *cls, const struct GNUNET_MessageHeader *msg) | |||
368 | /* no reverse lookup was successful, return ip as string */ | 361 | /* no reverse lookup was successful, return ip as string */ |
369 | if (rh->received_response == GNUNET_NO) | 362 | if (rh->received_response == GNUNET_NO) |
370 | rh->name_callback (rh->cls, | 363 | rh->name_callback (rh->cls, |
371 | no_resolve ((const struct sockaddr *) &rh[1], | 364 | no_resolve (rh->af, |
365 | &rh[1], | ||
372 | rh->data_len)); | 366 | rh->data_len)); |
373 | /* at least one reverse lookup was successful */ | 367 | /* at least one reverse lookup was successful */ |
374 | else | 368 | else |
@@ -483,15 +477,6 @@ handle_response (void *cls, const struct GNUNET_MessageHeader *msg) | |||
483 | reconnect (); | 477 | reconnect (); |
484 | return; | 478 | return; |
485 | } | 479 | } |
486 | #if DEBUG_RESOLVER | ||
487 | { | ||
488 | char *ips = no_resolve (sa, salen); | ||
489 | |||
490 | LOG (GNUNET_ERROR_TYPE_DEBUG, "Resolver returns `%s' for `%s'.\n", ips, | ||
491 | (const char *) &rh[1]); | ||
492 | GNUNET_free (ips); | ||
493 | } | ||
494 | #endif | ||
495 | rh->addr_callback (rh->cls, sa, salen); | 480 | rh->addr_callback (rh->cls, sa, salen); |
496 | GNUNET_CLIENT_receive (client, &handle_response, rh, | 481 | GNUNET_CLIENT_receive (client, &handle_response, rh, |
497 | GNUNET_TIME_absolute_get_remaining (rh->timeout)); | 482 | GNUNET_TIME_absolute_get_remaining (rh->timeout)); |
@@ -816,7 +801,7 @@ numeric_reverse (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
816 | struct GNUNET_RESOLVER_RequestHandle *rh = cls; | 801 | struct GNUNET_RESOLVER_RequestHandle *rh = cls; |
817 | char *result; | 802 | char *result; |
818 | 803 | ||
819 | result = no_resolve ((const struct sockaddr *) &rh[1], rh->data_len); | 804 | result = no_resolve (rh->af, &rh[1], rh->data_len); |
820 | #if DEBUG_RESOLVER | 805 | #if DEBUG_RESOLVER |
821 | LOG (GNUNET_ERROR_TYPE_DEBUG, _("Resolver returns `%s'.\n"), result); | 806 | LOG (GNUNET_ERROR_TYPE_DEBUG, _("Resolver returns `%s'.\n"), result); |
822 | #endif | 807 | #endif |