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