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