19bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/*************************************************************************** 29bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * _ _ ____ _ 39bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * Project ___| | | | _ \| | 49bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * / __| | | | |_) | | 59bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * | (__| |_| | _ <| |___ 69bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * \___|\___/|_| \_\_____| 79bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 88f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo * Copyright (C) 1998 - 2016, 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 128f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo * are also available at https://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 ***************************************************************************/ 22e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#include "server_setup.h" 239bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 249bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/* Purpose 259bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 269bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * Resolve the given name, using system name resolve functions (NOT any 279bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * function provided by libcurl). Used to see if the name exists and thus if 289bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * we can allow a test case to use it for testing. 299bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 309bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * Like if 'localhost' actual exists etc. 319bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 329bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels */ 339bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 349bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef HAVE_SIGNAL_H 359bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <signal.h> 369bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 379bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef HAVE_NETINET_IN_H 389bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <netinet/in.h> 399bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 409bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef _XOPEN_SOURCE_EXTENDED 419bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/* This define is "almost" required to build on HPUX 11 */ 429bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <arpa/inet.h> 439bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 449bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef HAVE_NETDB_H 459bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <netdb.h> 469bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 479bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 489bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#define ENABLE_CURLX_PRINTF 499bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/* make the curlx header define all printf() functions to use the curlx_* 509bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels versions instead */ 519bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include "curlx.h" /* from the private lib dir */ 529bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include "util.h" 539bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 549bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/* include memdebug.h last */ 559bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include "memdebug.h" 569bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 579bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsstatic bool use_ipv6 = FALSE; 589bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsstatic const char *ipv_inuse = "IPv4"; 599bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 609bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsconst char *serverlogfile=""; /* for a util.c function we don't use */ 619bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 629bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsint main(int argc, char *argv[]) 639bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels{ 649bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels int arg=1; 659bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels const char *host = NULL; 669bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels int rc = 0; 679bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 689bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels while(argc>arg) { 699bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(!strcmp("--version", argv[arg])) { 709bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels printf("resolve IPv4%s\n", 719bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef ENABLE_IPV6 729bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels "/IPv6" 739bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#else 749bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels "" 759bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 769bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels ); 779bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return 0; 789bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 799bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels else if(!strcmp("--ipv6", argv[arg])) { 809bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels ipv_inuse = "IPv6"; 819bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels use_ipv6 = TRUE; 829bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels arg++; 839bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 849bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels else if(!strcmp("--ipv4", argv[arg])) { 859bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* for completeness, we support this option as well */ 869bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels ipv_inuse = "IPv4"; 879bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels use_ipv6 = FALSE; 889bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels arg++; 899bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 909bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels else { 919bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels host = argv[arg++]; 929bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 939bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 949bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(!host) { 959bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels puts("Usage: resolve [option] <host>\n" 969bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels " --version\n" 979bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels " --ipv4" 989bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef ENABLE_IPV6 999bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels "\n --ipv6" 1009bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 1019bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels ); 1029bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return 1; 1039bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1049bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1059bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef WIN32 1069bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels win32_init(); 1079bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels atexit(win32_cleanup); 1089bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 1099bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1109bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(!use_ipv6) { 1119bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* gethostbyname() resolve */ 1129bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels struct hostent *he; 1139bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1149bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels he = gethostbyname(host); 1159bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1169bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels rc = !he; 1179bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1189bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels else { 1199bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef ENABLE_IPV6 1209bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* Check that the system has IPv6 enabled before checking the resolver */ 1219bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_socket_t s = socket(PF_INET6, SOCK_DGRAM, 0); 1229bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(s == CURL_SOCKET_BAD) 123e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET /* an IPv6 address was requested and we can't get/use one */ 1249bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels rc = -1; 1259bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels else { 1269bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels sclose(s); 1279bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1289bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1298f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo if(rc == 0) { 1309bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* getaddrinfo() resolve */ 1319bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels struct addrinfo *ai; 1329bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels struct addrinfo hints; 1339bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1349bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels memset(&hints, 0, sizeof(hints)); 1359bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels hints.ai_family = PF_INET6; 1369bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels hints.ai_socktype = SOCK_STREAM; 1379bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels hints.ai_flags = AI_CANONNAME; 138e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET /* Use parenthesis around functions to stop them from being replaced by 139e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET the macro in memdebug.h */ 1409bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels rc = (getaddrinfo)(host, "80", &hints, &ai); 1418f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo if(rc == 0) 142e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET (freeaddrinfo)(ai); 1439bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1449bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1459bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#else 1469bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels puts("IPv6 support has been disabled in this program"); 1479bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return 1; 1489bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 1499bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1509bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(rc) 1519bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels printf("Resolving %s '%s' didn't work\n", ipv_inuse, host); 1529bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1539bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return !!rc; 1549bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels} 155