diff --git a/deps/cares/cares.gyp b/deps/cares/cares.gyp index 04b293433c6f94..8a5239b4129623 100644 --- a/deps/cares/cares.gyp +++ b/deps/cares/cares.gyp @@ -35,9 +35,6 @@ 'include/ares.h', 'include/ares_version.h', 'include/nameser.h', - 'src/acountry.c', - 'src/adig.c', - 'src/ahost.c', 'src/ares_cancel.c', 'src/ares__close_sockets.c', 'src/ares_create_query.c', diff --git a/deps/cares/include/ares_build.h b/deps/cares/include/ares_build.h index a507423c6d19bb..199eae8b8e9978 100644 --- a/deps/cares/include/ares_build.h +++ b/deps/cares/include/ares_build.h @@ -72,6 +72,14 @@ /* Configure process defines this to 1 when it finds out that system */ /* header file ws2tcpip.h must be included by the external interface. */ + +#ifdef WIN32 +# define CARES_PULL_WS2TCPIP_H 1 +#else +# define CARES_PULL_SYS_TYPES_H 1 +# define CARES_PULL_SYS_SOCKET_H 1 +#endif + /* #undef CARES_PULL_WS2TCPIP_H */ #ifdef CARES_PULL_WS2TCPIP_H # ifndef WIN32_LEAN_AND_MEAN @@ -84,14 +92,12 @@ /* Configure process defines this to 1 when it finds out that system */ /* header file sys/types.h must be included by the external interface. */ -#define CARES_PULL_SYS_TYPES_H 1 #ifdef CARES_PULL_SYS_TYPES_H # include #endif /* Configure process defines this to 1 when it finds out that system */ /* header file sys/socket.h must be included by the external interface. */ -#define CARES_PULL_SYS_SOCKET_H 1 #ifdef CARES_PULL_SYS_SOCKET_H # include #endif diff --git a/deps/cares/src/acountry.c b/deps/cares/src/acountry.c deleted file mode 100644 index e157702e608986..00000000000000 --- a/deps/cares/src/acountry.c +++ /dev/null @@ -1,621 +0,0 @@ -/* - * - * IP-address/hostname to country converter. - * - * Problem; you want to know where IP a.b.c.d is located. - * - * Use ares_gethostbyname ("d.c.b.a.zz.countries.nerd.dk") - * and get the CNAME (host->h_name). Result will be: - * CNAME = zz.countries.nerd.dk with address 127.0.x.y (ver 1) or - * CNAME = .zz.countries.nerd.dk with address 127.0.x.y (ver 2) - * - * The 2 letter country code is in and the ISO-3166 country - * number is in x.y (number = x*256 + y). Version 2 of the protocol is missing - * the number. - * - * Ref: http://countries.nerd.dk/more.html - * - * Written by G. Vanem 2006, 2007 - * - * NB! This program may not be big-endian aware. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of M.I.T. not be used in - * advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * M.I.T. makes no representations about the suitability of - * this software for any purpose. It is provided "as is" - * without express or implied warranty. - */ - -#include "ares_setup.h" - -#ifdef HAVE_STRINGS_H -#include -#endif - -#if defined(WIN32) && !defined(WATT32) - #include -#else - #include - #include - #include -#endif - -#include "ares.h" -#include "ares_getopt.h" -#include "ares_nowarn.h" - -#ifndef HAVE_STRDUP -# include "ares_strdup.h" -# define strdup(ptr) ares_strdup(ptr) -#endif - -#ifndef HAVE_STRCASECMP -# include "ares_strcasecmp.h" -# define strcasecmp(p1,p2) ares_strcasecmp(p1,p2) -#endif - -#ifndef HAVE_STRNCASECMP -# include "ares_strcasecmp.h" -# define strncasecmp(p1,p2,n) ares_strncasecmp(p1,p2,n) -#endif - -#ifndef INADDR_NONE -#define INADDR_NONE 0xffffffff -#endif - -static const char *usage = "acountry [-vh?] {host|addr} ...\n"; -static const char nerd_fmt[] = "%u.%u.%u.%u.zz.countries.nerd.dk"; -static const char *nerd_ver1 = nerd_fmt + 14; /* .countries.nerd.dk */ -static const char *nerd_ver2 = nerd_fmt + 11; /* .zz.countries.nerd.dk */ -static int verbose = 0; - -#define TRACE(fmt) do { \ - if (verbose > 0) \ - printf fmt ; \ - } WHILE_FALSE - -static void wait_ares(ares_channel channel); -static void callback(void *arg, int status, int timeouts, struct hostent *host); -static void callback2(void *arg, int status, int timeouts, struct hostent *host); -static void find_country_from_cname(const char *cname, struct in_addr addr); - -static void Abort(const char *fmt, ...) -{ - va_list args; - va_start(args, fmt); - vfprintf(stderr, fmt, args); - va_end(args); - exit(1); -} - -int main(int argc, char **argv) -{ - ares_channel channel; - int ch, status; - -#if defined(WIN32) && !defined(WATT32) - WORD wVersionRequested = MAKEWORD(USE_WINSOCK,USE_WINSOCK); - WSADATA wsaData; - WSAStartup(wVersionRequested, &wsaData); -#endif - - status = ares_library_init(ARES_LIB_INIT_ALL); - if (status != ARES_SUCCESS) - { - fprintf(stderr, "ares_library_init: %s\n", ares_strerror(status)); - return 1; - } - - while ((ch = ares_getopt(argc, argv, "dvh?")) != -1) - switch (ch) - { - case 'd': -#ifdef WATT32 - dbug_init(); -#endif - break; - case 'v': - verbose++; - break; - case 'h': - case '?': - default: - Abort(usage); - } - - argc -= optind; - argv += optind; - if (argc < 1) - Abort(usage); - - status = ares_init(&channel); - if (status != ARES_SUCCESS) - { - fprintf(stderr, "ares_init: %s\n", ares_strerror(status)); - return 1; - } - - /* Initiate the queries, one per command-line argument. */ - for ( ; *argv; argv++) - { - struct in_addr addr; - char buf[100]; - - /* If this fails, assume '*argv' is a host-name that - * must be resolved first - */ - if (ares_inet_pton(AF_INET, *argv, &addr) != 1) - { - ares_gethostbyname(channel, *argv, AF_INET, callback2, &addr); - wait_ares(channel); - if (addr.s_addr == INADDR_NONE) - { - printf("Failed to lookup %s\n", *argv); - continue; - } - } - - sprintf(buf, nerd_fmt, - (unsigned int)(addr.s_addr >> 24), - (unsigned int)((addr.s_addr >> 16) & 255), - (unsigned int)((addr.s_addr >> 8) & 255), - (unsigned int)(addr.s_addr & 255)); - TRACE(("Looking up %s...", buf)); - fflush(stdout); - ares_gethostbyname(channel, buf, AF_INET, callback, buf); - } - - wait_ares(channel); - ares_destroy(channel); - - ares_library_cleanup(); - -#if defined(WIN32) && !defined(WATT32) - WSACleanup(); -#endif - - return 0; -} - -/* - * Wait for the queries to complete. - */ -static void wait_ares(ares_channel channel) -{ - for (;;) - { - struct timeval *tvp, tv; - fd_set read_fds, write_fds; - int nfds; - - FD_ZERO(&read_fds); - FD_ZERO(&write_fds); - nfds = ares_fds(channel, &read_fds, &write_fds); - if (nfds == 0) - break; - tvp = ares_timeout(channel, NULL, &tv); - nfds = select(nfds, &read_fds, &write_fds, NULL, tvp); - if (nfds < 0) - continue; - ares_process(channel, &read_fds, &write_fds); - } -} - -/* - * This is the callback used when we have the IP-address of interest. - * Extract the CNAME and figure out the country-code from it. - */ -static void callback(void *arg, int status, int timeouts, struct hostent *host) -{ - const char *name = (const char*)arg; - const char *cname; - char buf[20]; - - (void)timeouts; - - if (!host || status != ARES_SUCCESS) - { - printf("Failed to lookup %s: %s\n", name, ares_strerror(status)); - return; - } - - TRACE(("\nFound address %s, name %s\n", - ares_inet_ntop(AF_INET,(const char*)host->h_addr,buf,sizeof(buf)), - host->h_name)); - - cname = host->h_name; /* CNAME gets put here */ - if (!cname) - printf("Failed to get CNAME for %s\n", name); - else - find_country_from_cname(cname, *(struct in_addr*)host->h_addr); -} - -/* - * This is the callback used to obtain the IP-address of the host of interest. - */ -static void callback2(void *arg, int status, int timeouts, struct hostent *host) -{ - struct in_addr *addr = (struct in_addr*) arg; - - (void)timeouts; - if (!host || status != ARES_SUCCESS) - memset(addr, INADDR_NONE, sizeof(*addr)); - else - memcpy(addr, host->h_addr, sizeof(*addr)); -} - -struct search_list { - int country_number; /* ISO-3166 country number */ - char short_name[3]; /* A2 short country code */ - const char *long_name; /* normal country name */ - }; - -static const struct search_list *list_lookup(int number, const struct search_list *list, int num) -{ - while (num > 0 && list->long_name) - { - if (list->country_number == number) - return (list); - num--; - list++; - } - return (NULL); -} - -/* - * Ref: ftp://ftp.ripe.net/iso3166-countrycodes.txt - */ -static const struct search_list country_list[] = { - { 4, "af", "Afghanistan" }, - { 248, "ax", "Åland Island" }, - { 8, "al", "Albania" }, - { 12, "dz", "Algeria" }, - { 16, "as", "American Samoa" }, - { 20, "ad", "Andorra" }, - { 24, "ao", "Angola" }, - { 660, "ai", "Anguilla" }, - { 10, "aq", "Antarctica" }, - { 28, "ag", "Antigua & Barbuda" }, - { 32, "ar", "Argentina" }, - { 51, "am", "Armenia" }, - { 533, "aw", "Aruba" }, - { 36, "au", "Australia" }, - { 40, "at", "Austria" }, - { 31, "az", "Azerbaijan" }, - { 44, "bs", "Bahamas" }, - { 48, "bh", "Bahrain" }, - { 50, "bd", "Bangladesh" }, - { 52, "bb", "Barbados" }, - { 112, "by", "Belarus" }, - { 56, "be", "Belgium" }, - { 84, "bz", "Belize" }, - { 204, "bj", "Benin" }, - { 60, "bm", "Bermuda" }, - { 64, "bt", "Bhutan" }, - { 68, "bo", "Bolivia" }, - { 70, "ba", "Bosnia & Herzegowina" }, - { 72, "bw", "Botswana" }, - { 74, "bv", "Bouvet Island" }, - { 76, "br", "Brazil" }, - { 86, "io", "British Indian Ocean Territory" }, - { 96, "bn", "Brunei Darussalam" }, - { 100, "bg", "Bulgaria" }, - { 854, "bf", "Burkina Faso" }, - { 108, "bi", "Burundi" }, - { 116, "kh", "Cambodia" }, - { 120, "cm", "Cameroon" }, - { 124, "ca", "Canada" }, - { 132, "cv", "Cape Verde" }, - { 136, "ky", "Cayman Islands" }, - { 140, "cf", "Central African Republic" }, - { 148, "td", "Chad" }, - { 152, "cl", "Chile" }, - { 156, "cn", "China" }, - { 162, "cx", "Christmas Island" }, - { 166, "cc", "Cocos Islands" }, - { 170, "co", "Colombia" }, - { 174, "km", "Comoros" }, - { 178, "cg", "Congo" }, - { 180, "cd", "Congo" }, - { 184, "ck", "Cook Islands" }, - { 188, "cr", "Costa Rica" }, - { 384, "ci", "Cote d'Ivoire" }, - { 191, "hr", "Croatia" }, - { 192, "cu", "Cuba" }, - { 196, "cy", "Cyprus" }, - { 203, "cz", "Czech Republic" }, - { 208, "dk", "Denmark" }, - { 262, "dj", "Djibouti" }, - { 212, "dm", "Dominica" }, - { 214, "do", "Dominican Republic" }, - { 218, "ec", "Ecuador" }, - { 818, "eg", "Egypt" }, - { 222, "sv", "El Salvador" }, - { 226, "gq", "Equatorial Guinea" }, - { 232, "er", "Eritrea" }, - { 233, "ee", "Estonia" }, - { 231, "et", "Ethiopia" }, - { 238, "fk", "Falkland Islands" }, - { 234, "fo", "Faroe Islands" }, - { 242, "fj", "Fiji" }, - { 246, "fi", "Finland" }, - { 250, "fr", "France" }, - { 249, "fx", "France, Metropolitan" }, - { 254, "gf", "French Guiana" }, - { 258, "pf", "French Polynesia" }, - { 260, "tf", "French Southern Territories" }, - { 266, "ga", "Gabon" }, - { 270, "gm", "Gambia" }, - { 268, "ge", "Georgia" }, - { 276, "de", "Germany" }, - { 288, "gh", "Ghana" }, - { 292, "gi", "Gibraltar" }, - { 300, "gr", "Greece" }, - { 304, "gl", "Greenland" }, - { 308, "gd", "Grenada" }, - { 312, "gp", "Guadeloupe" }, - { 316, "gu", "Guam" }, - { 320, "gt", "Guatemala" }, - { 324, "gn", "Guinea" }, - { 624, "gw", "Guinea-Bissau" }, - { 328, "gy", "Guyana" }, - { 332, "ht", "Haiti" }, - { 334, "hm", "Heard & Mc Donald Islands" }, - { 336, "va", "Vatican City" }, - { 340, "hn", "Honduras" }, - { 344, "hk", "Hong kong" }, - { 348, "hu", "Hungary" }, - { 352, "is", "Iceland" }, - { 356, "in", "India" }, - { 360, "id", "Indonesia" }, - { 364, "ir", "Iran" }, - { 368, "iq", "Iraq" }, - { 372, "ie", "Ireland" }, - { 376, "il", "Israel" }, - { 380, "it", "Italy" }, - { 388, "jm", "Jamaica" }, - { 392, "jp", "Japan" }, - { 400, "jo", "Jordan" }, - { 398, "kz", "Kazakhstan" }, - { 404, "ke", "Kenya" }, - { 296, "ki", "Kiribati" }, - { 408, "kp", "Korea (north)" }, - { 410, "kr", "Korea (south)" }, - { 414, "kw", "Kuwait" }, - { 417, "kg", "Kyrgyzstan" }, - { 418, "la", "Laos" }, - { 428, "lv", "Latvia" }, - { 422, "lb", "Lebanon" }, - { 426, "ls", "Lesotho" }, - { 430, "lr", "Liberia" }, - { 434, "ly", "Libya" }, - { 438, "li", "Liechtenstein" }, - { 440, "lt", "Lithuania" }, - { 442, "lu", "Luxembourg" }, - { 446, "mo", "Macao" }, - { 807, "mk", "Macedonia" }, - { 450, "mg", "Madagascar" }, - { 454, "mw", "Malawi" }, - { 458, "my", "Malaysia" }, - { 462, "mv", "Maldives" }, - { 466, "ml", "Mali" }, - { 470, "mt", "Malta" }, - { 584, "mh", "Marshall Islands" }, - { 474, "mq", "Martinique" }, - { 478, "mr", "Mauritania" }, - { 480, "mu", "Mauritius" }, - { 175, "yt", "Mayotte" }, - { 484, "mx", "Mexico" }, - { 583, "fm", "Micronesia" }, - { 498, "md", "Moldova" }, - { 492, "mc", "Monaco" }, - { 496, "mn", "Mongolia" }, - { 500, "ms", "Montserrat" }, - { 504, "ma", "Morocco" }, - { 508, "mz", "Mozambique" }, - { 104, "mm", "Myanmar" }, - { 516, "na", "Namibia" }, - { 520, "nr", "Nauru" }, - { 524, "np", "Nepal" }, - { 528, "nl", "Netherlands" }, - { 530, "an", "Netherlands Antilles" }, - { 540, "nc", "New Caledonia" }, - { 554, "nz", "New Zealand" }, - { 558, "ni", "Nicaragua" }, - { 562, "ne", "Niger" }, - { 566, "ng", "Nigeria" }, - { 570, "nu", "Niue" }, - { 574, "nf", "Norfolk Island" }, - { 580, "mp", "Northern Mariana Islands" }, - { 578, "no", "Norway" }, - { 512, "om", "Oman" }, - { 586, "pk", "Pakistan" }, - { 585, "pw", "Palau" }, - { 275, "ps", "Palestinian Territory" }, - { 591, "pa", "Panama" }, - { 598, "pg", "Papua New Guinea" }, - { 600, "py", "Paraguay" }, - { 604, "pe", "Peru" }, - { 608, "ph", "Philippines" }, - { 612, "pn", "Pitcairn" }, - { 616, "pl", "Poland" }, - { 620, "pt", "Portugal" }, - { 630, "pr", "Puerto Rico" }, - { 634, "qa", "Qatar" }, - { 638, "re", "Reunion" }, - { 642, "ro", "Romania" }, - { 643, "ru", "Russia" }, - { 646, "rw", "Rwanda" }, - { 659, "kn", "Saint Kitts & Nevis" }, - { 662, "lc", "Saint Lucia" }, - { 670, "vc", "Saint Vincent" }, - { 882, "ws", "Samoa" }, - { 674, "sm", "San Marino" }, - { 678, "st", "Sao Tome & Principe" }, - { 682, "sa", "Saudi Arabia" }, - { 686, "sn", "Senegal" }, - { 891, "cs", "Serbia and Montenegro" }, - { 690, "sc", "Seychelles" }, - { 694, "sl", "Sierra Leone" }, - { 702, "sg", "Singapore" }, - { 703, "sk", "Slovakia" }, - { 705, "si", "Slovenia" }, - { 90, "sb", "Solomon Islands" }, - { 706, "so", "Somalia" }, - { 710, "za", "South Africa" }, - { 239, "gs", "South Georgia" }, - { 724, "es", "Spain" }, - { 144, "lk", "Sri Lanka" }, - { 654, "sh", "St. Helena" }, - { 666, "pm", "St. Pierre & Miquelon" }, - { 736, "sd", "Sudan" }, - { 740, "sr", "Suriname" }, - { 744, "sj", "Svalbard & Jan Mayen Islands" }, - { 748, "sz", "Swaziland" }, - { 752, "se", "Sweden" }, - { 756, "ch", "Switzerland" }, - { 760, "sy", "Syrian Arab Republic" }, - { 626, "tl", "Timor-Leste" }, - { 158, "tw", "Taiwan" }, - { 762, "tj", "Tajikistan" }, - { 834, "tz", "Tanzania" }, - { 764, "th", "Thailand" }, - { 768, "tg", "Togo" }, - { 772, "tk", "Tokelau" }, - { 776, "to", "Tonga" }, - { 780, "tt", "Trinidad & Tobago" }, - { 788, "tn", "Tunisia" }, - { 792, "tr", "Turkey" }, - { 795, "tm", "Turkmenistan" }, - { 796, "tc", "Turks & Caicos Islands" }, - { 798, "tv", "Tuvalu" }, - { 800, "ug", "Uganda" }, - { 804, "ua", "Ukraine" }, - { 784, "ae", "United Arab Emirates" }, - { 826, "gb", "United Kingdom" }, - { 840, "us", "United States" }, - { 581, "um", "United States Minor Outlying Islands" }, - { 858, "uy", "Uruguay" }, - { 860, "uz", "Uzbekistan" }, - { 548, "vu", "Vanuatu" }, - { 862, "ve", "Venezuela" }, - { 704, "vn", "Vietnam" }, - { 92, "vg", "Virgin Islands (British)" }, - { 850, "vi", "Virgin Islands (US)" }, - { 876, "wf", "Wallis & Futuna Islands" }, - { 732, "eh", "Western Sahara" }, - { 887, "ye", "Yemen" }, - { 894, "zm", "Zambia" }, - { 716, "zw", "Zimbabwe" } - }; - -/* - * Check if start of 'str' is simply an IPv4 address. - */ -#define BYTE_OK(x) ((x) >= 0 && (x) <= 255) - -static int is_addr(char *str, char **end) -{ - int a0, a1, a2, a3, num, rc = 0, length = 0; - - num = sscanf(str,"%3d.%3d.%3d.%3d%n",&a0,&a1,&a2,&a3,&length); - if( (num == 4) && - BYTE_OK(a0) && BYTE_OK(a1) && BYTE_OK(a2) && BYTE_OK(a3) && - length >= (3+4)) - { - rc = 1; - *end = str + length; - } - return rc; -} - -/* - * Find the country-code and name from the CNAME. E.g.: - * version 1: CNAME = zzno.countries.nerd.dk with address 127.0.2.66 - * yields ccode_A" = "no" and cnumber 578 (2.66). - * version 2: CNAME = .zz.countries.nerd.dk with address 127.0.2.66 - * yields cnumber 578 (2.66). ccode_A is ""; - */ -static void find_country_from_cname(const char *cname, struct in_addr addr) -{ - const struct search_list *country; - char ccode_A2[3], *ccopy, *dot_4; - int cnumber, z0, z1, ver_1, ver_2; - unsigned long ip; - - ip = ntohl(addr.s_addr); - z0 = TOLOWER(cname[0]); - z1 = TOLOWER(cname[1]); - ccopy = strdup(cname); - dot_4 = NULL; - - ver_1 = (z0 == 'z' && z1 == 'z' && !strcasecmp(cname+4,nerd_ver1)); - ver_2 = (is_addr(ccopy,&dot_4) && !strcasecmp(dot_4,nerd_ver2)); - - if (ver_1) - { - const char *dot = strchr(cname, '.'); - if (dot != cname+4) - { - printf("Unexpected CNAME %s (ver_1)\n", cname); - free(ccopy); - return; - } - } - else if (ver_2) - { - z0 = TOLOWER(dot_4[1]); - z1 = TOLOWER(dot_4[2]); - if (z0 != 'z' && z1 != 'z') - { - printf("Unexpected CNAME %s (ver_2)\n", cname); - free(ccopy); - return; - } - } - else - { - printf("Unexpected CNAME %s (ver?)\n", cname); - free(ccopy); - return; - } - - if (ver_1) - { - ccode_A2[0] = (char)TOLOWER(cname[2]); - ccode_A2[1] = (char)TOLOWER(cname[3]); - ccode_A2[2] = '\0'; - } - else - ccode_A2[0] = '\0'; - - cnumber = ip & 0xFFFF; - - TRACE(("Found country-code `%s', number %d\n", - ver_1 ? ccode_A2 : "", cnumber)); - - country = list_lookup(cnumber, country_list, - sizeof(country_list) / sizeof(country_list[0])); - if (!country) - printf("Name for country-number %d not found.\n", cnumber); - else - { - if (ver_1) - { - if ((country->short_name[0] != ccode_A2[0]) || - (country->short_name[1] != ccode_A2[1]) || - (country->short_name[2] != ccode_A2[2])) - printf("short-name mismatch; %s vs %s\n", - country->short_name, ccode_A2); - } - printf("%s (%s), number %d.\n", - country->long_name, country->short_name, cnumber); - } - free(ccopy); -} diff --git a/deps/cares/src/adig.c b/deps/cares/src/adig.c deleted file mode 100644 index e112dc0444bc17..00000000000000 --- a/deps/cares/src/adig.c +++ /dev/null @@ -1,827 +0,0 @@ -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of M.I.T. not be used in - * advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * M.I.T. makes no representations about the suitability of - * this software for any purpose. It is provided "as is" - * without express or implied warranty. - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#endif -#ifdef HAVE_NETDB_H -# include -#endif -#ifdef HAVE_ARPA_NAMESER_H -# include -#else -# include "nameser.h" -#endif -#ifdef HAVE_ARPA_NAMESER_COMPAT_H -# include -#endif - -#ifdef HAVE_STRINGS_H -# include -#endif - -#include "ares.h" -#include "ares_dns.h" -#include "ares_getopt.h" -#include "ares_nowarn.h" - -#ifndef HAVE_STRDUP -# include "ares_strdup.h" -# define strdup(ptr) ares_strdup(ptr) -#endif - -#ifndef HAVE_STRCASECMP -# include "ares_strcasecmp.h" -# define strcasecmp(p1,p2) ares_strcasecmp(p1,p2) -#endif - -#ifndef HAVE_STRNCASECMP -# include "ares_strcasecmp.h" -# define strncasecmp(p1,p2,n) ares_strncasecmp(p1,p2,n) -#endif - -#ifdef WATT32 -#undef WIN32 /* Redefined in MingW headers */ -#endif - -#ifndef T_SRV -# define T_SRV 33 /* Server selection */ -#endif -#ifndef T_NAPTR -# define T_NAPTR 35 /* Naming authority pointer */ -#endif -#ifndef T_DS -# define T_DS 43 /* Delegation Signer (RFC4034) */ -#endif -#ifndef T_SSHFP -# define T_SSHFP 44 /* SSH Key Fingerprint (RFC4255) */ -#endif -#ifndef T_RRSIG -# define T_RRSIG 46 /* Resource Record Signature (RFC4034) */ -#endif -#ifndef T_NSEC -# define T_NSEC 47 /* Next Secure (RFC4034) */ -#endif -#ifndef T_DNSKEY -# define T_DNSKEY 48 /* DNS Public Key (RFC4034) */ -#endif - -struct nv { - const char *name; - int value; -}; - -static const struct nv flags[] = { - { "usevc", ARES_FLAG_USEVC }, - { "primary", ARES_FLAG_PRIMARY }, - { "igntc", ARES_FLAG_IGNTC }, - { "norecurse", ARES_FLAG_NORECURSE }, - { "stayopen", ARES_FLAG_STAYOPEN }, - { "noaliases", ARES_FLAG_NOALIASES } -}; -static const int nflags = sizeof(flags) / sizeof(flags[0]); - -static const struct nv classes[] = { - { "IN", C_IN }, - { "CHAOS", C_CHAOS }, - { "HS", C_HS }, - { "ANY", C_ANY } -}; -static const int nclasses = sizeof(classes) / sizeof(classes[0]); - -static const struct nv types[] = { - { "A", T_A }, - { "NS", T_NS }, - { "MD", T_MD }, - { "MF", T_MF }, - { "CNAME", T_CNAME }, - { "SOA", T_SOA }, - { "MB", T_MB }, - { "MG", T_MG }, - { "MR", T_MR }, - { "NULL", T_NULL }, - { "WKS", T_WKS }, - { "PTR", T_PTR }, - { "HINFO", T_HINFO }, - { "MINFO", T_MINFO }, - { "MX", T_MX }, - { "TXT", T_TXT }, - { "RP", T_RP }, - { "AFSDB", T_AFSDB }, - { "X25", T_X25 }, - { "ISDN", T_ISDN }, - { "RT", T_RT }, - { "NSAP", T_NSAP }, - { "NSAP_PTR", T_NSAP_PTR }, - { "SIG", T_SIG }, - { "KEY", T_KEY }, - { "PX", T_PX }, - { "GPOS", T_GPOS }, - { "AAAA", T_AAAA }, - { "LOC", T_LOC }, - { "SRV", T_SRV }, - { "AXFR", T_AXFR }, - { "MAILB", T_MAILB }, - { "MAILA", T_MAILA }, - { "NAPTR", T_NAPTR }, - { "DS", T_DS }, - { "SSHFP", T_SSHFP }, - { "RRSIG", T_RRSIG }, - { "NSEC", T_NSEC }, - { "DNSKEY", T_DNSKEY }, - { "ANY", T_ANY } -}; -static const int ntypes = sizeof(types) / sizeof(types[0]); - -static const char *opcodes[] = { - "QUERY", "IQUERY", "STATUS", "(reserved)", "NOTIFY", - "(unknown)", "(unknown)", "(unknown)", "(unknown)", - "UPDATEA", "UPDATED", "UPDATEDA", "UPDATEM", "UPDATEMA", - "ZONEINIT", "ZONEREF" -}; - -static const char *rcodes[] = { - "NOERROR", "FORMERR", "SERVFAIL", "NXDOMAIN", "NOTIMP", "REFUSED", - "(unknown)", "(unknown)", "(unknown)", "(unknown)", "(unknown)", - "(unknown)", "(unknown)", "(unknown)", "(unknown)", "NOCHANGE" -}; - -static void callback(void *arg, int status, int timeouts, - unsigned char *abuf, int alen); -static const unsigned char *display_question(const unsigned char *aptr, - const unsigned char *abuf, - int alen); -static const unsigned char *display_rr(const unsigned char *aptr, - const unsigned char *abuf, int alen); -static const char *type_name(int type); -static const char *class_name(int dnsclass); -static void usage(void); -static void destroy_addr_list(struct ares_addr_node *head); -static void append_addr_list(struct ares_addr_node **head, - struct ares_addr_node *node); - -int main(int argc, char **argv) -{ - ares_channel channel; - int c, i, optmask = ARES_OPT_FLAGS, dnsclass = C_IN, type = T_A; - int status, nfds, count; - struct ares_options options; - struct hostent *hostent; - fd_set read_fds, write_fds; - struct timeval *tvp, tv; - struct ares_addr_node *srvr, *servers = NULL; - -#ifdef USE_WINSOCK - WORD wVersionRequested = MAKEWORD(USE_WINSOCK,USE_WINSOCK); - WSADATA wsaData; - WSAStartup(wVersionRequested, &wsaData); -#endif - - status = ares_library_init(ARES_LIB_INIT_ALL); - if (status != ARES_SUCCESS) - { - fprintf(stderr, "ares_library_init: %s\n", ares_strerror(status)); - return 1; - } - - options.flags = ARES_FLAG_NOCHECKRESP; - options.servers = NULL; - options.nservers = 0; - while ((c = ares_getopt(argc, argv, "df:s:c:t:T:U:")) != -1) - { - switch (c) - { - case 'd': -#ifdef WATT32 - dbug_init(); -#endif - break; - - case 'f': - /* Add a flag. */ - for (i = 0; i < nflags; i++) - { - if (strcmp(flags[i].name, optarg) == 0) - break; - } - if (i < nflags) - options.flags |= flags[i].value; - else - usage(); - break; - - case 's': - /* User-specified name servers override default ones. */ - srvr = malloc(sizeof(struct ares_addr_node)); - if (!srvr) - { - fprintf(stderr, "Out of memory!\n"); - destroy_addr_list(servers); - return 1; - } - append_addr_list(&servers, srvr); - if (ares_inet_pton(AF_INET, optarg, &srvr->addr.addr4) > 0) - srvr->family = AF_INET; - else if (ares_inet_pton(AF_INET6, optarg, &srvr->addr.addr6) > 0) - srvr->family = AF_INET6; - else - { - hostent = gethostbyname(optarg); - if (!hostent) - { - fprintf(stderr, "adig: server %s not found.\n", optarg); - destroy_addr_list(servers); - return 1; - } - switch (hostent->h_addrtype) - { - case AF_INET: - srvr->family = AF_INET; - memcpy(&srvr->addr.addr4, hostent->h_addr, - sizeof(srvr->addr.addr4)); - break; - case AF_INET6: - srvr->family = AF_INET6; - memcpy(&srvr->addr.addr6, hostent->h_addr, - sizeof(srvr->addr.addr6)); - break; - default: - fprintf(stderr, - "adig: server %s unsupported address family.\n", optarg); - destroy_addr_list(servers); - return 1; - } - } - /* Notice that calling ares_init_options() without servers in the - * options struct and with ARES_OPT_SERVERS set simultaneously in - * the options mask, results in an initialization with no servers. - * When alternative name servers have been specified these are set - * later calling ares_set_servers() overriding any existing server - * configuration. To prevent initial configuration with default - * servers that will be discarded later, ARES_OPT_SERVERS is set. - * If this flag is not set here the result shall be the same but - * ares_init_options() will do needless work. */ - optmask |= ARES_OPT_SERVERS; - break; - - case 'c': - /* Set the query class. */ - for (i = 0; i < nclasses; i++) - { - if (strcasecmp(classes[i].name, optarg) == 0) - break; - } - if (i < nclasses) - dnsclass = classes[i].value; - else - usage(); - break; - - case 't': - /* Set the query type. */ - for (i = 0; i < ntypes; i++) - { - if (strcasecmp(types[i].name, optarg) == 0) - break; - } - if (i < ntypes) - type = types[i].value; - else - usage(); - break; - - case 'T': - /* Set the TCP port number. */ - if (!ISDIGIT(*optarg)) - usage(); - options.tcp_port = (unsigned short)strtol(optarg, NULL, 0); - optmask |= ARES_OPT_TCP_PORT; - break; - - case 'U': - /* Set the UDP port number. */ - if (!ISDIGIT(*optarg)) - usage(); - options.udp_port = (unsigned short)strtol(optarg, NULL, 0); - optmask |= ARES_OPT_UDP_PORT; - break; - } - } - argc -= optind; - argv += optind; - if (argc == 0) - usage(); - - status = ares_init_options(&channel, &options, optmask); - - if (status != ARES_SUCCESS) - { - fprintf(stderr, "ares_init_options: %s\n", - ares_strerror(status)); - return 1; - } - - if(servers) - { - status = ares_set_servers(channel, servers); - destroy_addr_list(servers); - if (status != ARES_SUCCESS) - { - fprintf(stderr, "ares_init_options: %s\n", - ares_strerror(status)); - return 1; - } - } - - /* Initiate the queries, one per command-line argument. If there is - * only one query to do, supply NULL as the callback argument; - * otherwise, supply the query name as an argument so we can - * distinguish responses for the user when printing them out. - */ - if (argc == 1) - ares_query(channel, *argv, dnsclass, type, callback, (char *) NULL); - else - { - for (; *argv; argv++) - ares_query(channel, *argv, dnsclass, type, callback, *argv); - } - - /* Wait for all queries to complete. */ - for (;;) - { - FD_ZERO(&read_fds); - FD_ZERO(&write_fds); - nfds = ares_fds(channel, &read_fds, &write_fds); - if (nfds == 0) - break; - tvp = ares_timeout(channel, NULL, &tv); - count = select(nfds, &read_fds, &write_fds, NULL, tvp); - if (count < 0 && (status = SOCKERRNO) != EINVAL) - { - printf("select fail: %d", status); - return 1; - } - ares_process(channel, &read_fds, &write_fds); - } - - ares_destroy(channel); - - ares_library_cleanup(); - -#ifdef USE_WINSOCK - WSACleanup(); -#endif - - return 0; -} - -static void callback(void *arg, int status, int timeouts, - unsigned char *abuf, int alen) -{ - char *name = (char *) arg; - int id, qr, opcode, aa, tc, rd, ra, rcode; - unsigned int qdcount, ancount, nscount, arcount, i; - const unsigned char *aptr; - - (void) timeouts; - - /* Display the query name if given. */ - if (name) - printf("Answer for query %s:\n", name); - - /* Display an error message if there was an error, but only stop if - * we actually didn't get an answer buffer. - */ - if (status != ARES_SUCCESS) - { - printf("%s\n", ares_strerror(status)); - if (!abuf) - return; - } - - /* Won't happen, but check anyway, for safety. */ - if (alen < HFIXEDSZ) - return; - - /* Parse the answer header. */ - id = DNS_HEADER_QID(abuf); - qr = DNS_HEADER_QR(abuf); - opcode = DNS_HEADER_OPCODE(abuf); - aa = DNS_HEADER_AA(abuf); - tc = DNS_HEADER_TC(abuf); - rd = DNS_HEADER_RD(abuf); - ra = DNS_HEADER_RA(abuf); - rcode = DNS_HEADER_RCODE(abuf); - qdcount = DNS_HEADER_QDCOUNT(abuf); - ancount = DNS_HEADER_ANCOUNT(abuf); - nscount = DNS_HEADER_NSCOUNT(abuf); - arcount = DNS_HEADER_ARCOUNT(abuf); - - /* Display the answer header. */ - printf("id: %d\n", id); - printf("flags: %s%s%s%s%s\n", - qr ? "qr " : "", - aa ? "aa " : "", - tc ? "tc " : "", - rd ? "rd " : "", - ra ? "ra " : ""); - printf("opcode: %s\n", opcodes[opcode]); - printf("rcode: %s\n", rcodes[rcode]); - - /* Display the questions. */ - printf("Questions:\n"); - aptr = abuf + HFIXEDSZ; - for (i = 0; i < qdcount; i++) - { - aptr = display_question(aptr, abuf, alen); - if (aptr == NULL) - return; - } - - /* Display the answers. */ - printf("Answers:\n"); - for (i = 0; i < ancount; i++) - { - aptr = display_rr(aptr, abuf, alen); - if (aptr == NULL) - return; - } - - /* Display the NS records. */ - printf("NS records:\n"); - for (i = 0; i < nscount; i++) - { - aptr = display_rr(aptr, abuf, alen); - if (aptr == NULL) - return; - } - - /* Display the additional records. */ - printf("Additional records:\n"); - for (i = 0; i < arcount; i++) - { - aptr = display_rr(aptr, abuf, alen); - if (aptr == NULL) - return; - } -} - -static const unsigned char *display_question(const unsigned char *aptr, - const unsigned char *abuf, - int alen) -{ - char *name; - int type, dnsclass, status; - long len; - - /* Parse the question name. */ - status = ares_expand_name(aptr, abuf, alen, &name, &len); - if (status != ARES_SUCCESS) - return NULL; - aptr += len; - - /* Make sure there's enough data after the name for the fixed part - * of the question. - */ - if (aptr + QFIXEDSZ > abuf + alen) - { - ares_free_string(name); - return NULL; - } - - /* Parse the question type and class. */ - type = DNS_QUESTION_TYPE(aptr); - dnsclass = DNS_QUESTION_CLASS(aptr); - aptr += QFIXEDSZ; - - /* Display the question, in a format sort of similar to how we will - * display RRs. - */ - printf("\t%-15s.\t", name); - if (dnsclass != C_IN) - printf("\t%s", class_name(dnsclass)); - printf("\t%s\n", type_name(type)); - ares_free_string(name); - return aptr; -} - -static const unsigned char *display_rr(const unsigned char *aptr, - const unsigned char *abuf, int alen) -{ - const unsigned char *p; - int type, dnsclass, ttl, dlen, status; - long len; - char addr[46]; - union { - unsigned char * as_uchar; - char * as_char; - } name; - - /* Parse the RR name. */ - status = ares_expand_name(aptr, abuf, alen, &name.as_char, &len); - if (status != ARES_SUCCESS) - return NULL; - aptr += len; - - /* Make sure there is enough data after the RR name for the fixed - * part of the RR. - */ - if (aptr + RRFIXEDSZ > abuf + alen) - { - ares_free_string(name.as_char); - return NULL; - } - - /* Parse the fixed part of the RR, and advance to the RR data - * field. */ - type = DNS_RR_TYPE(aptr); - dnsclass = DNS_RR_CLASS(aptr); - ttl = DNS_RR_TTL(aptr); - dlen = DNS_RR_LEN(aptr); - aptr += RRFIXEDSZ; - if (aptr + dlen > abuf + alen) - { - ares_free_string(name.as_char); - return NULL; - } - - /* Display the RR name, class, and type. */ - printf("\t%-15s.\t%d", name.as_char, ttl); - if (dnsclass != C_IN) - printf("\t%s", class_name(dnsclass)); - printf("\t%s", type_name(type)); - ares_free_string(name.as_char); - - /* Display the RR data. Don't touch aptr. */ - switch (type) - { - case T_CNAME: - case T_MB: - case T_MD: - case T_MF: - case T_MG: - case T_MR: - case T_NS: - case T_PTR: - /* For these types, the RR data is just a domain name. */ - status = ares_expand_name(aptr, abuf, alen, &name.as_char, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t%s.", name.as_char); - ares_free_string(name.as_char); - break; - - case T_HINFO: - /* The RR data is two length-counted character strings. */ - p = aptr; - len = *p; - if (p + len + 1 > aptr + dlen) - return NULL; - status = ares_expand_string(p, abuf, alen, &name.as_uchar, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t%s", name.as_char); - ares_free_string(name.as_char); - p += len; - len = *p; - if (p + len + 1 > aptr + dlen) - return NULL; - status = ares_expand_string(p, abuf, alen, &name.as_uchar, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t%s", name.as_char); - ares_free_string(name.as_char); - break; - - case T_MINFO: - /* The RR data is two domain names. */ - p = aptr; - status = ares_expand_name(p, abuf, alen, &name.as_char, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t%s.", name.as_char); - ares_free_string(name.as_char); - p += len; - status = ares_expand_name(p, abuf, alen, &name.as_char, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t%s.", name.as_char); - ares_free_string(name.as_char); - break; - - case T_MX: - /* The RR data is two bytes giving a preference ordering, and - * then a domain name. - */ - if (dlen < 2) - return NULL; - printf("\t%d", (int)DNS__16BIT(aptr)); - status = ares_expand_name(aptr + 2, abuf, alen, &name.as_char, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t%s.", name.as_char); - ares_free_string(name.as_char); - break; - - case T_SOA: - /* The RR data is two domain names and then five four-byte - * numbers giving the serial number and some timeouts. - */ - p = aptr; - status = ares_expand_name(p, abuf, alen, &name.as_char, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t%s.\n", name.as_char); - ares_free_string(name.as_char); - p += len; - status = ares_expand_name(p, abuf, alen, &name.as_char, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t\t\t\t\t\t%s.\n", name.as_char); - ares_free_string(name.as_char); - p += len; - if (p + 20 > aptr + dlen) - return NULL; - printf("\t\t\t\t\t\t( %u %u %u %u %u )", - DNS__32BIT(p), DNS__32BIT(p+4), - DNS__32BIT(p+8), DNS__32BIT(p+12), - DNS__32BIT(p+16)); - break; - - case T_TXT: - /* The RR data is one or more length-counted character - * strings. */ - p = aptr; - while (p < aptr + dlen) - { - len = *p; - if (p + len + 1 > aptr + dlen) - return NULL; - status = ares_expand_string(p, abuf, alen, &name.as_uchar, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t%s", name.as_char); - ares_free_string(name.as_char); - p += len; - } - break; - - case T_A: - /* The RR data is a four-byte Internet address. */ - if (dlen != 4) - return NULL; - printf("\t%s", ares_inet_ntop(AF_INET,aptr,addr,sizeof(addr))); - break; - - case T_AAAA: - /* The RR data is a 16-byte IPv6 address. */ - if (dlen != 16) - return NULL; - printf("\t%s", ares_inet_ntop(AF_INET6,aptr,addr,sizeof(addr))); - break; - - case T_WKS: - /* Not implemented yet */ - break; - - case T_SRV: - /* The RR data is three two-byte numbers representing the - * priority, weight, and port, followed by a domain name. - */ - - printf("\t%d", (int)DNS__16BIT(aptr)); - printf(" %d", (int)DNS__16BIT(aptr + 2)); - printf(" %d", (int)DNS__16BIT(aptr + 4)); - - status = ares_expand_name(aptr + 6, abuf, alen, &name.as_char, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t%s.", name.as_char); - ares_free_string(name.as_char); - break; - - case T_NAPTR: - - printf("\t%d", (int)DNS__16BIT(aptr)); /* order */ - printf(" %d\n", (int)DNS__16BIT(aptr + 2)); /* preference */ - - p = aptr + 4; - status = ares_expand_string(p, abuf, alen, &name.as_uchar, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t\t\t\t\t\t%s\n", name.as_char); - ares_free_string(name.as_char); - p += len; - - status = ares_expand_string(p, abuf, alen, &name.as_uchar, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t\t\t\t\t\t%s\n", name.as_char); - ares_free_string(name.as_char); - p += len; - - status = ares_expand_string(p, abuf, alen, &name.as_uchar, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t\t\t\t\t\t%s\n", name.as_char); - ares_free_string(name.as_char); - p += len; - - status = ares_expand_name(p, abuf, alen, &name.as_char, &len); - if (status != ARES_SUCCESS) - return NULL; - printf("\t\t\t\t\t\t%s", name.as_char); - ares_free_string(name.as_char); - break; - - case T_DS: - case T_SSHFP: - case T_RRSIG: - case T_NSEC: - case T_DNSKEY: - printf("\t[RR type parsing unavailable]"); - break; - - default: - printf("\t[Unknown RR; cannot parse]"); - break; - } - printf("\n"); - - return aptr + dlen; -} - -static const char *type_name(int type) -{ - int i; - - for (i = 0; i < ntypes; i++) - { - if (types[i].value == type) - return types[i].name; - } - return "(unknown)"; -} - -static const char *class_name(int dnsclass) -{ - int i; - - for (i = 0; i < nclasses; i++) - { - if (classes[i].value == dnsclass) - return classes[i].name; - } - return "(unknown)"; -} - -static void usage(void) -{ - fprintf(stderr, "usage: adig [-f flag] [-s server] [-c class] " - "[-t type] [-p port] name ...\n"); - exit(1); -} - -static void destroy_addr_list(struct ares_addr_node *head) -{ - while(head) - { - struct ares_addr_node *detached = head; - head = head->next; - free(detached); - } -} - -static void append_addr_list(struct ares_addr_node **head, - struct ares_addr_node *node) -{ - struct ares_addr_node *last; - node->next = NULL; - if(*head) - { - last = *head; - while(last->next) - last = last->next; - last->next = node; - } - else - *head = node; -} diff --git a/deps/cares/src/ahost.c b/deps/cares/src/ahost.c deleted file mode 100644 index dec66a9684d164..00000000000000 --- a/deps/cares/src/ahost.c +++ /dev/null @@ -1,206 +0,0 @@ -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of M.I.T. not be used in - * advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * M.I.T. makes no representations about the suitability of - * this software for any purpose. It is provided "as is" - * without express or implied warranty. - */ - -#include "ares_setup.h" - -#if !defined(WIN32) || defined(WATT32) -#include -#include -#include -#endif - -#ifdef HAVE_STRINGS_H -#include -#endif - -#include "ares.h" -#include "ares_dns.h" -#include "ares_getopt.h" -#include "ares_ipv6.h" -#include "ares_nowarn.h" - -#ifndef HAVE_STRDUP -# include "ares_strdup.h" -# define strdup(ptr) ares_strdup(ptr) -#endif - -#ifndef HAVE_STRCASECMP -# include "ares_strcasecmp.h" -# define strcasecmp(p1,p2) ares_strcasecmp(p1,p2) -#endif - -#ifndef HAVE_STRNCASECMP -# include "ares_strcasecmp.h" -# define strncasecmp(p1,p2,n) ares_strncasecmp(p1,p2,n) -#endif - -static void callback(void *arg, int status, int timeouts, struct hostent *host); -static void usage(void); - -int main(int argc, char **argv) -{ - struct ares_options options; - int optmask = 0; - ares_channel channel; - int status, nfds, c, addr_family = AF_INET; - fd_set read_fds, write_fds; - struct timeval *tvp, tv; - struct in_addr addr4; - struct ares_in6_addr addr6; - -#ifdef USE_WINSOCK - WORD wVersionRequested = MAKEWORD(USE_WINSOCK,USE_WINSOCK); - WSADATA wsaData; - WSAStartup(wVersionRequested, &wsaData); -#endif - - memset(&options, 0, sizeof(options)); - - status = ares_library_init(ARES_LIB_INIT_ALL); - if (status != ARES_SUCCESS) - { - fprintf(stderr, "ares_library_init: %s\n", ares_strerror(status)); - return 1; - } - - while ((c = ares_getopt(argc,argv,"dt:hs:")) != -1) - { - switch (c) - { - case 'd': -#ifdef WATT32 - dbug_init(); -#endif - break; - case 's': - optmask |= ARES_OPT_DOMAINS; - options.ndomains++; - options.domains = realloc(options.domains, - options.ndomains * sizeof(char *)); - options.domains[options.ndomains - 1] = strdup(optarg); - break; - case 't': - if (!strcasecmp(optarg,"a")) - addr_family = AF_INET; - else if (!strcasecmp(optarg,"aaaa")) - addr_family = AF_INET6; - else if (!strcasecmp(optarg,"u")) - addr_family = AF_UNSPEC; - else - usage(); - break; - case 'h': - default: - usage(); - break; - } - } - - argc -= optind; - argv += optind; - if (argc < 1) - usage(); - - status = ares_init_options(&channel, &options, optmask); - if (status != ARES_SUCCESS) - { - fprintf(stderr, "ares_init: %s\n", ares_strerror(status)); - return 1; - } - - /* Initiate the queries, one per command-line argument. */ - for ( ; *argv; argv++) - { - if (ares_inet_pton(AF_INET, *argv, &addr4) == 1) - { - ares_gethostbyaddr(channel, &addr4, sizeof(addr4), AF_INET, callback, - *argv); - } - else if (ares_inet_pton(AF_INET6, *argv, &addr6) == 1) - { - ares_gethostbyaddr(channel, &addr6, sizeof(addr6), AF_INET6, callback, - *argv); - } - else - { - ares_gethostbyname(channel, *argv, addr_family, callback, *argv); - } - } - - /* Wait for all queries to complete. */ - for (;;) - { - int res; - FD_ZERO(&read_fds); - FD_ZERO(&write_fds); - nfds = ares_fds(channel, &read_fds, &write_fds); - if (nfds == 0) - break; - tvp = ares_timeout(channel, NULL, &tv); - res = select(nfds, &read_fds, &write_fds, NULL, tvp); - if (-1 == res) - break; - ares_process(channel, &read_fds, &write_fds); - } - - ares_destroy(channel); - - ares_library_cleanup(); - -#ifdef USE_WINSOCK - WSACleanup(); -#endif - - return 0; -} - -static void callback(void *arg, int status, int timeouts, struct hostent *host) -{ - char **p; - - (void)timeouts; - - if (status != ARES_SUCCESS) - { - fprintf(stderr, "%s: %s\n", (char *) arg, ares_strerror(status)); - return; - } - - for (p = host->h_addr_list; *p; p++) - { - char addr_buf[46] = "??"; - - ares_inet_ntop(host->h_addrtype, *p, addr_buf, sizeof(addr_buf)); - printf("%-32s\t%s", host->h_name, addr_buf); -#if 0 - if (host->h_aliases[0]) - { - int i; - - printf (", Aliases: "); - for (i = 0; host->h_aliases[i]; i++) - printf("%s ", host->h_aliases[i]); - } -#endif - puts(""); - } -} - -static void usage(void) -{ - fprintf(stderr, "usage: ahost [-t {a|aaaa|u}] {host|addr} ...\n"); - exit(1); -}