X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fdns%2Fdnsstub.c;h=c755aff16032b0d4e45b36bbafa4d86de7b294a5;hb=70466ec3c34f9a920e9e798e3169f886e9486a59;hp=273160e8a2cea5cb93161e389ec44b4873132356;hpb=608105fe25c5f647b92933d46ba8b9074a46b16d;p=oweals%2Fgnunet.git diff --git a/src/dns/dnsstub.c b/src/dns/dnsstub.c index 273160e8a..c755aff16 100644 --- a/src/dns/dnsstub.c +++ b/src/dns/dnsstub.c @@ -250,7 +250,8 @@ get_request_socket (struct GNUNET_DNSSTUB_Context *ctx, * Perform DNS resolution. * * @param ctx stub resolver to use - * @param af address family to use + * @param sa the socket address + * @param sa_len the socket length * @param request DNS request to transmit * @param request_len number of bytes in msg * @param rc function to call with result @@ -278,13 +279,25 @@ GNUNET_DNSSTUB_resolve (struct GNUNET_DNSSTUB_Context *ctx, else ret = rs->dnsout6; GNUNET_assert (NULL != ret); + memcpy (&rs->addr, + sa, + sa_len); + rs->addrlen = sa_len; rs->rc = rc; rs->rc_cls = rc_cls; - GNUNET_NETWORK_socket_sendto (ret, - request, - request_len, - sa, - sa_len); + if (GNUNET_SYSERR == + GNUNET_NETWORK_socket_sendto (ret, + request, + request_len, + sa, + sa_len)) + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + _("Failed to send DNS request to %s\n"), + GNUNET_a2s (sa, sa_len)); + else + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + _("Sent DNS request to %s\n"), + GNUNET_a2s (sa, sa_len)); return rs; } @@ -309,7 +322,7 @@ GNUNET_DNSSTUB_resolve2 (struct GNUNET_DNSSTUB_Context *ctx, int af; struct sockaddr_in v4; struct sockaddr_in6 v6; - struct sockaddr *so; + struct sockaddr *sa; socklen_t salen; struct GNUNET_NETWORK_Handle *dnsout; struct GNUNET_DNSSTUB_RequestSocket *rs; @@ -324,7 +337,7 @@ GNUNET_DNSSTUB_resolve2 (struct GNUNET_DNSSTUB_Context *ctx, #if HAVE_SOCKADDR_IN_SIN_LEN v4.sin_len = (u_char) salen; #endif - so = (struct sockaddr *) &v4; + sa = (struct sockaddr *) &v4; af = AF_INET; } else if (1 == inet_pton (AF_INET6, ctx->dns_exit, &v6.sin6_addr)) @@ -335,7 +348,7 @@ GNUNET_DNSSTUB_resolve2 (struct GNUNET_DNSSTUB_Context *ctx, #if HAVE_SOCKADDR_IN_SIN_LEN v6.sin6_len = (u_char) salen; #endif - so = (struct sockaddr *) &v6; + sa = (struct sockaddr *) &v6; af = AF_INET6; } else @@ -357,14 +370,18 @@ GNUNET_DNSSTUB_resolve2 (struct GNUNET_DNSSTUB_Context *ctx, return NULL; } memcpy (&rs->addr, - so, + sa, salen); rs->addrlen = salen; rs->rc = rc; rs->rc_cls = rc_cls; - GNUNET_NETWORK_socket_sendto (dnsout, - request, - request_len, so, salen); + if (GNUNET_SYSERR == + GNUNET_NETWORK_socket_sendto (dnsout, + request, + request_len, sa, salen)) + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + _("Failed to send DNS request to %s\n"), + GNUNET_a2s (sa, salen)); rs->timeout = GNUNET_TIME_relative_to_absolute (REQUEST_TIMEOUT); return rs; @@ -400,7 +417,9 @@ do_dns_read (struct GNUNET_DNSSTUB_RequestSocket *rs, /* port the code above? */ len = UINT16_MAX; #endif - + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Receiving %d byte DNS reply\n", + len); { unsigned char buf[len] GNUNET_ALIGN; @@ -428,11 +447,16 @@ do_dns_read (struct GNUNET_DNSSTUB_RequestSocket *rs, &addr, addrlen)) || (0 == GNUNET_TIME_absolute_get_remaining (rs->timeout).rel_value) ) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Request timeout or invalid sender address; ignoring reply\n"); return GNUNET_NO; - rs->rc (rs->rc_cls, - rs, - dns, - r); + } + if (NULL != rs->rc) + rs->rc (rs->rc_cls, + rs, + dns, + r); } return GNUNET_OK; } @@ -483,6 +507,17 @@ read_response (void *cls, } +/** + * Cancel DNS resolution. + * + * @param rs resolution to cancel + */ +void +GNUNET_DNSSTUB_resolve_cancel (struct GNUNET_DNSSTUB_RequestSocket *rs) +{ + rs->rc = NULL; +} + /** * Start a DNS stub resolver.