/* * Copyright (c) 2003-2006 Niels Provos * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef WIN32 #include #include #endif #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #ifdef HAVE_SYS_TIME_H #include #endif #include #ifndef WIN32 #include #include #include #include #include #endif #ifdef HAVE_NETINET_IN6_H #include #endif #include #include #include #include #include #include #include "event.h" #include "evdns.h" #include "log.h" static int dns_ok = 0; void dns_gethostbyname_cb(int result, char type, int count, int ttl, void *addresses, void *arg) { dns_ok = 0; if (result != DNS_ERR_NONE) goto out; 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; /* a resolution that's not valid does not help */ if (ttl < 0) goto out; for (i = 0; i < count; ++i) fprintf(stderr, "%s ", inet_ntoa(in_addrs[i])); break; } case DNS_PTR: /* may get at most one PTR */ if (count != 1) goto out; fprintf(stderr, "%s ", *(char **)addresses); break; default: goto out; } dns_ok = type; out: event_loopexit(NULL); } void dns_gethostbyname() { fprintf(stdout, "Simple DNS resolve: "); dns_ok = 0; evdns_resolve_ipv4("www.monkey.org", 0, dns_gethostbyname_cb, NULL); event_dispatch(); 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"); exit(1); } } void dns_gethostbyaddr() { struct in_addr in; in.s_addr = htonl(0x7f000001ul); /* 127.0.0.1 */ fprintf(stdout, "Simple reverse DNS resolve: "); dns_ok = 0; evdns_resolve_reverse(&in, 0, dns_gethostbyname_cb, NULL); event_dispatch(); if (dns_ok == DNS_PTR) { fprintf(stdout, "OK\n"); } else { fprintf(stdout, "FAILED\n"); exit(1); } } void dns_suite(void) { evdns_init(); dns_gethostbyname(); dns_gethostbyname6(); dns_gethostbyaddr(); evdns_shutdown(0); }