* @brief code to do DNS resolution
* @author Christian Grothoff
*/
-
-#include <stdlib.h>
#include "platform.h"
#include "gnunet_disk_lib.h"
#include "gnunet_getopt_lib.h"
if (salen < sizeof (struct sockaddr))
{
GNUNET_break (0);
+ GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
return;
}
now = GNUNET_TIME_absolute_get ();
while ((cache != NULL) &&
((cache->salen != salen) || (0 != memcmp (cache->sa, sa, salen))))
{
- if (GNUNET_TIME_absolute_get_duration (cache->last_request).value <
+ if (GNUNET_TIME_absolute_get_duration (cache->last_request).rel_value <
60 * 60 * 1000)
{
if (prev != NULL)
if (cache != NULL)
{
cache->last_request = now;
- if (GNUNET_TIME_absolute_get_duration (cache->last_request).value <
+ if (GNUNET_TIME_absolute_get_duration (cache->last_request).rel_value <
60 * 60 * 1000)
{
GNUNET_free_non_null (cache->addr);
AF_INET) ? "IPv4" : ((domain ==
AF_INET6) ? "IPv6" : "any"),
gai_strerror (s));
- if ((s == EAI_BADFLAGS) || (s == EAI_MEMORY) ||
+ if ((s == EAI_BADFLAGS) || (s == EAI_MEMORY)
#ifndef MINGW
- (s == EAI_SYSTEM)
+ || (s == EAI_SYSTEM)
#else
// FIXME NILS
- 1
+ || 1
#endif
)
return GNUNET_NO; /* other function may still succeed */
while (pos != NULL)
{
GNUNET_SERVER_transmit_context_append_data (tc,
- result->ai_addr,
- result->ai_addrlen,
+ pos->ai_addr,
+ pos->ai_addrlen,
GNUNET_MESSAGE_TYPE_RESOLVER_RESPONSE);
pos = pos->ai_next;
}
GNUNET_assert (hp->h_length == sizeof (struct in_addr));
memset (&a4, 0, sizeof (a4));
a4.sin_family = AF_INET;
+#if HAVE_SOCKADDR_IN_SIN_LEN
+ a4.sin_len = (u_char) sizeof (struct sockaddr_in);
+#endif
memcpy (&a4.sin_addr, hp->h_addr_list[0], hp->h_length);
GNUNET_SERVER_transmit_context_append_data (tc,
&a4,
GNUNET_assert (hp->h_length == sizeof (struct in6_addr));
memset (&a6, 0, sizeof (a6));
a6.sin6_family = AF_INET6;
+#if HAVE_SOCKADDR_IN_SIN_LEN
+ a6.sin6_len = (u_char) sizeof (struct sockaddr_in6);
+#endif
memcpy (&a6.sin6_addr, hp->h_addr_list[0], hp->h_length);
GNUNET_SERVER_transmit_context_append_data (tc,
&a6,
GNUNET_assert (hp->h_length == sizeof (struct in_addr));
memset (&addr, 0, sizeof (addr));
addr.sin_family = AF_INET;
+#if HAVE_SOCKADDR_IN_SIN_LEN
+ addr.sin_len = (u_char) sizeof (struct sockaddr_in);
+#endif
memcpy (&addr.sin_addr, hp->h_addr_list[0], hp->h_length);
GNUNET_SERVER_transmit_context_append_data (tc,
&addr,
uint16_t msize;
const struct GNUNET_RESOLVER_GetMessage *msg;
const char *hostname;
+ const struct sockaddr *sa;
uint16_t size;
int direction;
int domain;
}
else
{
-#if DEBUG_RESOLVER
+#if DEBUG_RESOLVER
+ char buf[INET6_ADDRSTRLEN];
+#endif
+ if (size < sizeof (struct sockaddr))
+ {
+ GNUNET_break (0);
+ GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+ return;
+ }
+ sa = (const struct sockaddr*) &msg[1];
+ switch (sa->sa_family)
+ {
+ case AF_INET:
+ if (size != sizeof (struct sockaddr_in))
+ {
+ GNUNET_break (0);
+ GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+ return;
+ }
+#if DEBUG_RESOLVER
+ inet_ntop (AF_INET, sa, buf, size);
+#endif
+ break;
+ case AF_INET6:
+ if (size != sizeof (struct sockaddr_in6))
+ {
+ GNUNET_break (0);
+ GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+ return;
+ }
+#if DEBUG_RESOLVER
+ inet_ntop (AF_INET6, sa, buf, size);
+#endif
+ break;
+ default:
+ GNUNET_break (0);
+ GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+ return;
+ }
+#if DEBUG_RESOLVER
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- _("Resolver asked to look up IP address.\n"));
+ _("Resolver asked to look up IP address `%s'.\n"),
+ buf);
#endif
- get_ip_as_string (client, (const struct sockaddr *) &msg[1], size);
+ get_ip_as_string (client, sa, size);
}
}
* Process resolver requests.
*
* @param cls closure
- * @param sched scheduler to use
* @param server the initialized server
* @param cfg configuration to use
*/
static void
run (void *cls,
- struct GNUNET_SCHEDULER_Handle *sched,
struct GNUNET_SERVER_Handle *server,
const struct GNUNET_CONFIGURATION_Handle *cfg)
{