]> granicus.if.org Git - libevent/commitdiff
small bug fixes to AAAA resolution and regression test; from Nick Mathewson!
authorNiels Provos <provos@gmail.com>
Sat, 27 Jan 2007 08:38:51 +0000 (08:38 +0000)
committerNiels Provos <provos@gmail.com>
Sat, 27 Jan 2007 08:38:51 +0000 (08:38 +0000)
we love regresson tests.

svn:r319

configure.in
evdns.c
test/regress_dns.c

index 6ada6d7d98f0e50d294f32cca3e57714fb5ada77..3a9d97d405fdf6424e50f2b62498b3891f65f50c 100644 (file)
@@ -132,7 +132,7 @@ AC_C_INLINE
 AC_HEADER_TIME
 
 dnl Checks for library functions.
-AC_CHECK_FUNCS(gettimeofday vasprintf fcntl clock_gettime strtok_r strsep getaddrinfo getnameinfo strlcpy)
+AC_CHECK_FUNCS(gettimeofday vasprintf fcntl clock_gettime strtok_r strsep getaddrinfo getnameinfo strlcpy inet_ntop)
 
 if test "x$ac_cv_func_clock_gettime" = "xyes"; then
    AC_DEFINE(DNS_USE_CPU_CLOCK_FOR_ID, 1, [Define if clock_gettime is available in libc])
diff --git a/evdns.c b/evdns.c
index 8679f0450b26b969728a27165577ca44897b07a9..99a9249515bcf19b5fb5c48a7ccd9de45f4383a4 100644 (file)
--- a/evdns.c
+++ b/evdns.c
@@ -596,6 +596,7 @@ reply_callback(struct request *const req, u32 ttl, u32 err, struct reply *reply)
                                                           req->user_pointer);
                else
                        req->user_callback(err, 0, 0, 0, NULL, req->user_pointer);
+                return;
        }
        assert(0);
 }
@@ -1783,7 +1784,7 @@ search_make_new(const struct search_state *const state, int n, const char *const
 
 static int
 search_request_new(int type, const char *const name, int flags, evdns_callback_type user_callback, void *user_arg) {
-       assert(type == TYPE_A);
+       assert(type == TYPE_A || type == TYPE_AAAA);
        if ( ((flags & DNS_QUERY_NO_SEARCH) == 0) &&
             global_search_state &&
                 global_search_state->num_domains) {
index ce9418781e67c5223310b069e974f4a0f06b586d..b7de440e07eff3f27e26a1005a484efc8b4a7ae6 100644 (file)
@@ -47,6 +47,9 @@
 #include <arpa/inet.h>
 #include <unistd.h>
 #endif
+#ifdef HAVE_NETINET_IN6_H
+#include <netinet/in6.h>
+#endif
 #include <netdb.h>
 #include <fcntl.h>
 #include <stdlib.h>
@@ -72,6 +75,24 @@ dns_gethostbyname_cb(int result, char type, int count, int ttl,
        fprintf(stderr, "type: %d, count: %d, ttl: %d: ", type, count, ttl);
 
        switch (type) {
+       case DNS_IPv6_AAAA: {
+#if defined(HAVE_STRUCT_IN6_ADDR) && defined(HAVE_INET_NTOP)
+               struct in6_addr *in6_addrs = addresses;
+               char buf[INET6_ADDRSTRLEN+1];
+               int i;
+               /* a resolution that's not valid does not help */
+               if (ttl < 0)
+                       goto out;
+               for (i = 0; i < count; ++i) {
+                       const char *b = inet_ntop(AF_INET6, &in6_addrs[i], buf,sizeof(buf));
+                       if (b)
+                               fprintf(stderr, "%s ", b);
+                       else
+                               fprintf(stderr, "%s ", strerror(errno));
+               }
+#endif
+               break;
+       }
        case DNS_IPv4_A: {
                struct in_addr *in_addrs = addresses;
                int i;
@@ -79,7 +100,7 @@ dns_gethostbyname_cb(int result, char type, int count, int ttl,
                if (ttl < 0)
                        goto out;
                for (i = 0; i < count; ++i)
-                       fprintf(stderr, "%s ", inet_ntoa(in_addrs[0]));
+                       fprintf(stderr, "%s ", inet_ntoa(in_addrs[i]));
                break;
        }
        case DNS_PTR:
@@ -93,7 +114,7 @@ dns_gethostbyname_cb(int result, char type, int count, int ttl,
                goto out;
        }
 
-       dns_ok = 1;
+       dns_ok = type;
 
 out:
        event_loopexit(NULL);
@@ -107,7 +128,23 @@ dns_gethostbyname()
        evdns_resolve_ipv4("www.monkey.org", 0, dns_gethostbyname_cb, NULL);
        event_dispatch();
 
-       if (dns_ok) {
+       if (dns_ok == DNS_IPv4_A) {
+               fprintf(stdout, "OK\n");
+       } else {
+               fprintf(stdout, "FAILED\n");
+               exit(1);
+       }
+}
+
+void
+dns_gethostbyname6()
+{
+       fprintf(stdout, "IPv6 DNS resolve: ");
+       dns_ok = 0;
+       evdns_resolve_ipv6("www.ietf.org", 0, dns_gethostbyname_cb, NULL);
+       event_dispatch();
+
+       if (dns_ok == DNS_IPv6_AAAA) {
                fprintf(stdout, "OK\n");
        } else {
                fprintf(stdout, "FAILED\n");
@@ -125,7 +162,7 @@ dns_gethostbyaddr()
        evdns_resolve_reverse(&in, 0, dns_gethostbyname_cb, NULL);
        event_dispatch();
 
-       if (dns_ok) {
+       if (dns_ok == DNS_PTR) {
                fprintf(stdout, "OK\n");
        } else {
                fprintf(stdout, "FAILED\n");
@@ -138,6 +175,7 @@ dns_suite(void)
 {
        evdns_init();
        dns_gethostbyname();
+       dns_gethostbyname6();
        dns_gethostbyaddr();
 
        evdns_shutdown(0);