|
- /*
- * Copyright (c) 2003-2006 Niels Provos <provos@citi.umich.edu>
- * 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 <winsock2.h>
- #include <windows.h>
- #endif
-
- #ifdef HAVE_CONFIG_H
- #include "config.h"
- #endif
-
- #include <sys/types.h>
- #include <sys/stat.h>
- #ifdef HAVE_SYS_TIME_H
- #include <sys/time.h>
- #endif
- #include <sys/queue.h>
- #ifndef WIN32
- #include <sys/socket.h>
- #include <sys/signal.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <unistd.h>
- #endif
- #include <netdb.h>
- #include <fcntl.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <errno.h>
-
- #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_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[0]));
- 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 = 1;
-
- 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) {
- 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) {
- fprintf(stdout, "OK\n");
- } else {
- fprintf(stdout, "FAILED\n");
- exit(1);
- }
- }
-
- void
- dns_suite(void)
- {
- evdns_init();
- dns_gethostbyname();
- dns_gethostbyaddr();
-
- evdns_shutdown(0);
- }
|