resolve.c revision 9bd90e6e25f1e55f50201c87a1b5837de7e5b64a
19bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/*************************************************************************** 29bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * _ _ ____ _ 39bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * Project ___| | | | _ \| | 49bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * / __| | | | |_) | | 59bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * | (__| |_| | _ <| |___ 69bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * \___|\___/|_| \_\_____| 79bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 89bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al. 99bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 109bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * This software is licensed as described in the file COPYING, which 119bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * you should have received as part of this distribution. The terms 129bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * are also available at http://curl.haxx.se/docs/copyright.html. 139bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 149bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * You may opt to use, copy, modify, merge, publish, distribute and/or sell 159bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * copies of the Software, and permit persons to whom the Software is 169bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * furnished to do so, under the terms of the COPYING file. 179bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 189bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 199bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * KIND, either express or implied. 209bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 219bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels ***************************************************************************/ 229bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 239bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/* Purpose 249bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 259bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * Resolve the given name, using system name resolve functions (NOT any 269bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * function provided by libcurl). Used to see if the name exists and thus if 279bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * we can allow a test case to use it for testing. 289bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 299bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * Like if 'localhost' actual exists etc. 309bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 319bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels */ 329bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 339bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#define CURL_NO_OLDIES 349bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 359bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include "setup.h" /* portability help from the lib directory */ 369bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 379bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef HAVE_SIGNAL_H 389bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <signal.h> 399bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 409bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef HAVE_UNISTD_H 419bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <unistd.h> 429bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 439bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef HAVE_SYS_TYPES_H 449bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <sys/types.h> 459bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 469bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef HAVE_SYS_SOCKET_H 479bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <sys/socket.h> 489bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 499bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef HAVE_NETINET_IN_H 509bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <netinet/in.h> 519bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 529bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef _XOPEN_SOURCE_EXTENDED 539bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/* This define is "almost" required to build on HPUX 11 */ 549bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <arpa/inet.h> 559bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 569bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef HAVE_NETDB_H 579bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <netdb.h> 589bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 599bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 609bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#define ENABLE_CURLX_PRINTF 619bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/* make the curlx header define all printf() functions to use the curlx_* 629bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels versions instead */ 639bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include "curlx.h" /* from the private lib dir */ 649bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include "util.h" 659bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 669bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/* include memdebug.h last */ 679bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include "memdebug.h" 689bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 699bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsstatic bool use_ipv6 = FALSE; 709bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsstatic const char *ipv_inuse = "IPv4"; 719bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 729bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsconst char *serverlogfile=""; /* for a util.c function we don't use */ 739bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 749bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsint main(int argc, char *argv[]) 759bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels{ 769bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels int arg=1; 779bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels const char *host = NULL; 789bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels int rc = 0; 799bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 809bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels while(argc>arg) { 819bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(!strcmp("--version", argv[arg])) { 829bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels printf("resolve IPv4%s\n", 839bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef ENABLE_IPV6 849bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels "/IPv6" 859bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#else 869bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels "" 879bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 889bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels ); 899bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return 0; 909bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 919bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels else if(!strcmp("--ipv6", argv[arg])) { 929bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels ipv_inuse = "IPv6"; 939bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels use_ipv6 = TRUE; 949bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels arg++; 959bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 969bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels else if(!strcmp("--ipv4", argv[arg])) { 979bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* for completeness, we support this option as well */ 989bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels ipv_inuse = "IPv4"; 999bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels use_ipv6 = FALSE; 1009bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels arg++; 1019bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1029bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels else { 1039bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels host = argv[arg++]; 1049bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1059bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1069bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(!host) { 1079bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels puts("Usage: resolve [option] <host>\n" 1089bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels " --version\n" 1099bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels " --ipv4" 1109bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef ENABLE_IPV6 1119bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels "\n --ipv6" 1129bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 1139bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels ); 1149bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return 1; 1159bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1169bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1179bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef WIN32 1189bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels win32_init(); 1199bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels atexit(win32_cleanup); 1209bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 1219bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1229bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(!use_ipv6) { 1239bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* gethostbyname() resolve */ 1249bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels struct hostent *he; 1259bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1269bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels he = gethostbyname(host); 1279bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1289bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels rc = !he; 1299bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1309bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels else { 1319bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef ENABLE_IPV6 1329bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* Check that the system has IPv6 enabled before checking the resolver */ 1339bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_socket_t s = socket(PF_INET6, SOCK_DGRAM, 0); 1349bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(s == CURL_SOCKET_BAD) 1359bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* an ipv6 address was requested and we can't get/use one */ 1369bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels rc = -1; 1379bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels else { 1389bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels sclose(s); 1399bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1409bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1419bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if (rc == 0) { 1429bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* getaddrinfo() resolve */ 1439bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels struct addrinfo *ai; 1449bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels struct addrinfo hints; 1459bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1469bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels memset(&hints, 0, sizeof(hints)); 1479bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels hints.ai_family = PF_INET6; 1489bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels hints.ai_socktype = SOCK_STREAM; 1499bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels hints.ai_flags = AI_CANONNAME; 1509bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* Use parenthesis around function to stop it from being replaced by 1519bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels the macro in memdebug.h */ 1529bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels rc = (getaddrinfo)(host, "80", &hints, &ai); 1539bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1549bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1559bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#else 1569bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels puts("IPv6 support has been disabled in this program"); 1579bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return 1; 1589bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 1599bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1609bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(rc) 1619bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels printf("Resolving %s '%s' didn't work\n", ipv_inuse, host); 1629bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1639bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return !!rc; 1649bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels} 165