* @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"
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);
}
}