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