15ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/***************************************************************************
25ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen *                                  _   _ ____  _
35ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen *  Project                     ___| | | |  _ \| |
45ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen *                             / __| | | | |_) | |
55ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen *                            | (__| |_| |  _ <| |___
65ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen *                             \___|\___/|_| \_\_____|
75ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen *
8d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
95ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen *
105ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * This software is licensed as described in the file COPYING, which
115ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * you should have received as part of this distribution. The terms
12d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo * are also available at https://curl.haxx.se/docs/copyright.html.
135ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen *
145ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * You may opt to use, copy, modify, merge, publish, distribute and/or sell
155ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * copies of the Software, and permit persons to whom the Software is
165ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * furnished to do so, under the terms of the COPYING file.
175ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen *
185ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
195ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * KIND, either express or implied.
205ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen *
215ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ***************************************************************************/
225ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen
23e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#include "curl_setup.h"
245ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen
255ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifdef HAVE_NETINET_IN_H
265ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include <netinet/in.h>
275ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif
285ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifdef HAVE_NETDB_H
295ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include <netdb.h>
305ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif
315ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifdef HAVE_ARPA_INET_H
325ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include <arpa/inet.h>
335ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif
345ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifdef __VMS
355ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include <in.h>
365ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include <inet.h>
375ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif
385ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen
395ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifdef HAVE_PROCESS_H
405ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include <process.h>
415ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif
425ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen
435ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include "urldata.h"
445ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include "sendf.h"
455ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include "hostip.h"
465ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include "hash.h"
475ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include "share.h"
485ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include "strerror.h"
495ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include "url.h"
505ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include "inet_pton.h"
515ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include "connect.h"
52d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo/* The last 3 #include files should be in this order */
53e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#include "curl_printf.h"
545ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include "curl_memory.h"
555ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include "memdebug.h"
565ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen
575ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/***********************************************************************
58e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * Only for IPv6-enabled builds
595ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen **********************************************************************/
605ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifdef CURLRES_IPV6
615ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen
625ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#if defined(CURLDEBUG) && defined(HAVE_GETNAMEINFO)
635ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/* These are strictly for memory tracing and are using the same style as the
645ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * family otherwise present in memdebug.c. I put these ones here since they
65e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * require a bunch of structs I didn't want to include in memdebug.c
665ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen */
675ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen
685ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/*
695ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * For CURLRES_ARS, this should be written using ares_gethostbyaddr()
705ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * (ignoring the fact c-ares doesn't return 'serv').
715ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen */
725ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen
735ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsenint curl_dogetnameinfo(GETNAMEINFO_QUAL_ARG1 GETNAMEINFO_TYPE_ARG1 sa,
745ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen                       GETNAMEINFO_TYPE_ARG2 salen,
755ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen                       char *host, GETNAMEINFO_TYPE_ARG46 hostlen,
765ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen                       char *serv, GETNAMEINFO_TYPE_ARG46 servlen,
775ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen                       GETNAMEINFO_TYPE_ARG7 flags,
785ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen                       int line, const char *source)
795ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen{
805ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  int res = (getnameinfo)(sa, salen,
815ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen                          host, hostlen,
825ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen                          serv, servlen,
835ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen                          flags);
845ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  if(0 == res)
855ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen    /* success */
865ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen    curl_memlog("GETNAME %s:%d getnameinfo()\n",
875ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen                source, line);
885ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  else
895ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen    curl_memlog("GETNAME %s:%d getnameinfo() failed = %d\n",
905ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen                source, line, res);
915ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  return res;
925ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen}
935ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif /* defined(CURLDEBUG) && defined(HAVE_GETNAMEINFO) */
945ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen
955ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/*
96e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * Curl_ipv6works() returns TRUE if IPv6 seems to work.
975ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen */
98e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETbool Curl_ipv6works(void)
995ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen{
100e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  /* the nature of most system is that IPv6 status doesn't come and go
101e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET     during a program's lifetime so we only probe the first time and then we
102e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET     have the info kept for fast re-use */
103e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  static int ipv6_works = -1;
104e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(-1 == ipv6_works) {
105e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    /* probe to see if we have a working IPv6 stack */
1065ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen    curl_socket_t s = socket(PF_INET6, SOCK_DGRAM, 0);
1075ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen    if(s == CURL_SOCKET_BAD)
108e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      /* an IPv6 address was requested but we can't get/use one */
109e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      ipv6_works = 0;
110e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    else {
111e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      ipv6_works = 1;
112e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      Curl_closesocket(NULL, s);
113e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    }
1145ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  }
115e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  return (ipv6_works>0)?TRUE:FALSE;
116e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET}
117e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
118e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/*
119e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * Curl_ipvalid() checks what CURL_IPRESOLVE_* requirements that might've
120e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * been set and returns TRUE if they are OK.
121e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET */
122e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETbool Curl_ipvalid(struct connectdata *conn)
123e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET{
124e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(conn->ip_version == CURL_IPRESOLVE_V6)
125e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    return Curl_ipv6works();
126d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo
1275ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  return TRUE;
1285ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen}
1295ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen
1305ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#if defined(CURLRES_SYNCH)
1315ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen
1325ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifdef DEBUG_ADDRINFO
1335ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsenstatic void dump_addrinfo(struct connectdata *conn, const Curl_addrinfo *ai)
1345ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen{
1355ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  printf("dump_addrinfo:\n");
136e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  for(; ai; ai = ai->ai_next) {
1375ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen    char  buf[INET6_ADDRSTRLEN];
1385ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen
1395ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen    printf("    fam %2d, CNAME %s, ",
1405ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen           ai->ai_family, ai->ai_canonname ? ai->ai_canonname : "<none>");
1415ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen    if(Curl_printable_address(ai, buf, sizeof(buf)))
1425ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen      printf("%s\n", buf);
1435ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen    else
1445ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen      printf("failed; %s\n", Curl_strerror(conn, SOCKERRNO));
1455ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  }
1465ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen}
1475ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#else
148e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define dump_addrinfo(x,y) Curl_nop_stmt
1495ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif
1505ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen
1515ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/*
152e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * Curl_getaddrinfo() when built IPv6-enabled (non-threading and
1535ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * non-ares version).
1545ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen *
1555ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * Returns name information about the given hostname and port number. If
1565ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * successful, the 'addrinfo' is returned and the forth argument will point to
1575ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * memory we need to free after use. That memory *MUST* be freed with
1585ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * Curl_freeaddrinfo(), nothing else.
1595ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen */
1605ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian MonsenCurl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
1615ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen                                const char *hostname,
1625ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen                                int port,
1635ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen                                int *waitp)
1645ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen{
1655ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  struct addrinfo hints;
1665ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  Curl_addrinfo *res;
1675ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  int error;
168e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  char sbuf[12];
1695ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  char *sbufptr = NULL;
170e3149cc1cf501b46caba8d47652ac90b95c78eacAlex Deymo#ifndef USE_RESOLVE_ON_IPS
1715ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  char addrbuf[128];
172e3149cc1cf501b46caba8d47652ac90b95c78eacAlex Deymo#endif
1735ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  int pf;
174d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo#if !defined(CURL_DISABLE_VERBOSE_STRINGS)
175e3149cc1cf501b46caba8d47652ac90b95c78eacAlex Deymo  struct Curl_easy *data = conn->data;
176d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo#endif
1775ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen
1785ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  *waitp = 0; /* synchronous response only */
1795ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen
180d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo  /* Check if a limited name resolve has been requested */
181e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  switch(conn->ip_version) {
1825ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  case CURL_IPRESOLVE_V4:
1835ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen    pf = PF_INET;
1845ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen    break;
1855ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  case CURL_IPRESOLVE_V6:
1865ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen    pf = PF_INET6;
1875ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen    break;
1885ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  default:
1895ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen    pf = PF_UNSPEC;
1905ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen    break;
1915ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  }
1925ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen
193e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if((pf != PF_INET) && !Curl_ipv6works())
194e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    /* The stack seems to be a non-IPv6 one */
195e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    pf = PF_INET;
1965ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen
1975ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  memset(&hints, 0, sizeof(hints));
1985ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  hints.ai_family = pf;
1995ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  hints.ai_socktype = conn->socktype;
2005ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen
201e3149cc1cf501b46caba8d47652ac90b95c78eacAlex Deymo#ifndef USE_RESOLVE_ON_IPS
202e3149cc1cf501b46caba8d47652ac90b95c78eacAlex Deymo  /*
203e3149cc1cf501b46caba8d47652ac90b95c78eacAlex Deymo   * The AI_NUMERICHOST must not be set to get synthesized IPv6 address from
204e3149cc1cf501b46caba8d47652ac90b95c78eacAlex Deymo   * an IPv4 address on iOS and Mac OS X.
205e3149cc1cf501b46caba8d47652ac90b95c78eacAlex Deymo   */
2065ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  if((1 == Curl_inet_pton(AF_INET, hostname, addrbuf)) ||
2075ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen     (1 == Curl_inet_pton(AF_INET6, hostname, addrbuf))) {
2085ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen    /* the given address is numerical only, prevent a reverse lookup */
2095ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen    hints.ai_flags = AI_NUMERICHOST;
2105ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  }
211e3149cc1cf501b46caba8d47652ac90b95c78eacAlex Deymo#endif
2125ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen
2135ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  if(port) {
2145ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen    snprintf(sbuf, sizeof(sbuf), "%d", port);
2155ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen    sbufptr=sbuf;
2165ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  }
217d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo
2185ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  error = Curl_getaddrinfo_ex(hostname, sbufptr, &hints, &res);
2195ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  if(error) {
2205ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen    infof(data, "getaddrinfo(3) failed for %s:%d\n", hostname, port);
2215ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen    return NULL;
2225ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  }
2235ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen
224e3149cc1cf501b46caba8d47652ac90b95c78eacAlex Deymo  if(port) {
225e3149cc1cf501b46caba8d47652ac90b95c78eacAlex Deymo    Curl_addrinfo_set_port(res, port);
226e3149cc1cf501b46caba8d47652ac90b95c78eacAlex Deymo  }
227e3149cc1cf501b46caba8d47652ac90b95c78eacAlex Deymo
2285ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  dump_addrinfo(conn, res);
2295ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen
2305ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen  return res;
2315ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen}
2325ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif /* CURLRES_SYNCH */
2335ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen
234d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo#endif /* CURLRES_IPV6 */
235