};
+/**
+ * Handle to the stub resolver.
+ */
struct GNUNET_DNSSTUB_Context
{
* Get a socket of the specified address family to send out a
* UDP DNS request to the Internet.
*
+ * @param ctx the DNSSTUB context
* @param af desired address family
* @return NULL on error (given AF not "supported")
*/
* 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
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;
}
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;
#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))
#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
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;
/* 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;
&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;
}
}
+/**
+ * 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.
{
unsigned int i;
- for (i=0;i<=UINT16_MAX;i++)
+ for (i=0;i<DNS_SOCKET_MAX;i++)
cleanup_rs (&ctx->sockets[i]);
if (NULL != ctx->dns_exit)
{