Mercurial > hgrepos > Python2 > PyMuPDF
comparison mupdf-source/thirdparty/curl/lib/hostip6.c @ 2:b50eed0cc0ef upstream
ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4.
The directory name has changed: no version number in the expanded directory now.
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Mon, 15 Sep 2025 11:43:07 +0200 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 1:1d09e1dec1d9 | 2:b50eed0cc0ef |
|---|---|
| 1 /*************************************************************************** | |
| 2 * _ _ ____ _ | |
| 3 * Project ___| | | | _ \| | | |
| 4 * / __| | | | |_) | | | |
| 5 * | (__| |_| | _ <| |___ | |
| 6 * \___|\___/|_| \_\_____| | |
| 7 * | |
| 8 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al. | |
| 9 * | |
| 10 * This software is licensed as described in the file COPYING, which | |
| 11 * you should have received as part of this distribution. The terms | |
| 12 * are also available at https://curl.haxx.se/docs/copyright.html. | |
| 13 * | |
| 14 * You may opt to use, copy, modify, merge, publish, distribute and/or sell | |
| 15 * copies of the Software, and permit persons to whom the Software is | |
| 16 * furnished to do so, under the terms of the COPYING file. | |
| 17 * | |
| 18 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | |
| 19 * KIND, either express or implied. | |
| 20 * | |
| 21 ***************************************************************************/ | |
| 22 | |
| 23 #include "curl_setup.h" | |
| 24 | |
| 25 /*********************************************************************** | |
| 26 * Only for IPv6-enabled builds | |
| 27 **********************************************************************/ | |
| 28 #ifdef CURLRES_IPV6 | |
| 29 | |
| 30 #ifdef HAVE_NETINET_IN_H | |
| 31 #include <netinet/in.h> | |
| 32 #endif | |
| 33 #ifdef HAVE_NETDB_H | |
| 34 #include <netdb.h> | |
| 35 #endif | |
| 36 #ifdef HAVE_ARPA_INET_H | |
| 37 #include <arpa/inet.h> | |
| 38 #endif | |
| 39 #ifdef __VMS | |
| 40 #include <in.h> | |
| 41 #include <inet.h> | |
| 42 #endif | |
| 43 | |
| 44 #ifdef HAVE_PROCESS_H | |
| 45 #include <process.h> | |
| 46 #endif | |
| 47 | |
| 48 #include "urldata.h" | |
| 49 #include "sendf.h" | |
| 50 #include "hostip.h" | |
| 51 #include "hash.h" | |
| 52 #include "share.h" | |
| 53 #include "strerror.h" | |
| 54 #include "url.h" | |
| 55 #include "inet_pton.h" | |
| 56 #include "connect.h" | |
| 57 /* The last 3 #include files should be in this order */ | |
| 58 #include "curl_printf.h" | |
| 59 #include "curl_memory.h" | |
| 60 #include "memdebug.h" | |
| 61 | |
| 62 /* | |
| 63 * Curl_ipv6works() returns TRUE if IPv6 seems to work. | |
| 64 */ | |
| 65 bool Curl_ipv6works(void) | |
| 66 { | |
| 67 /* the nature of most system is that IPv6 status doesn't come and go | |
| 68 during a program's lifetime so we only probe the first time and then we | |
| 69 have the info kept for fast re-use */ | |
| 70 static int ipv6_works = -1; | |
| 71 if(-1 == ipv6_works) { | |
| 72 /* probe to see if we have a working IPv6 stack */ | |
| 73 curl_socket_t s = socket(PF_INET6, SOCK_DGRAM, 0); | |
| 74 if(s == CURL_SOCKET_BAD) | |
| 75 /* an IPv6 address was requested but we can't get/use one */ | |
| 76 ipv6_works = 0; | |
| 77 else { | |
| 78 ipv6_works = 1; | |
| 79 Curl_closesocket(NULL, s); | |
| 80 } | |
| 81 } | |
| 82 return (ipv6_works>0)?TRUE:FALSE; | |
| 83 } | |
| 84 | |
| 85 /* | |
| 86 * Curl_ipvalid() checks what CURL_IPRESOLVE_* requirements that might've | |
| 87 * been set and returns TRUE if they are OK. | |
| 88 */ | |
| 89 bool Curl_ipvalid(struct connectdata *conn) | |
| 90 { | |
| 91 if(conn->ip_version == CURL_IPRESOLVE_V6) | |
| 92 return Curl_ipv6works(); | |
| 93 | |
| 94 return TRUE; | |
| 95 } | |
| 96 | |
| 97 #if defined(CURLRES_SYNCH) | |
| 98 | |
| 99 #ifdef DEBUG_ADDRINFO | |
| 100 static void dump_addrinfo(struct connectdata *conn, const Curl_addrinfo *ai) | |
| 101 { | |
| 102 printf("dump_addrinfo:\n"); | |
| 103 for(; ai; ai = ai->ai_next) { | |
| 104 char buf[INET6_ADDRSTRLEN]; | |
| 105 printf(" fam %2d, CNAME %s, ", | |
| 106 ai->ai_family, ai->ai_canonname ? ai->ai_canonname : "<none>"); | |
| 107 if(Curl_printable_address(ai, buf, sizeof(buf))) | |
| 108 printf("%s\n", buf); | |
| 109 else { | |
| 110 char buffer[STRERROR_LEN]; | |
| 111 printf("failed; %s\n", | |
| 112 Curl_strerror(SOCKERRNO, buffer, sizeof(buffer))); | |
| 113 } | |
| 114 } | |
| 115 } | |
| 116 #else | |
| 117 #define dump_addrinfo(x,y) Curl_nop_stmt | |
| 118 #endif | |
| 119 | |
| 120 /* | |
| 121 * Curl_getaddrinfo() when built IPv6-enabled (non-threading and | |
| 122 * non-ares version). | |
| 123 * | |
| 124 * Returns name information about the given hostname and port number. If | |
| 125 * successful, the 'addrinfo' is returned and the forth argument will point to | |
| 126 * memory we need to free after use. That memory *MUST* be freed with | |
| 127 * Curl_freeaddrinfo(), nothing else. | |
| 128 */ | |
| 129 Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn, | |
| 130 const char *hostname, | |
| 131 int port, | |
| 132 int *waitp) | |
| 133 { | |
| 134 struct addrinfo hints; | |
| 135 Curl_addrinfo *res; | |
| 136 int error; | |
| 137 char sbuf[12]; | |
| 138 char *sbufptr = NULL; | |
| 139 #ifndef USE_RESOLVE_ON_IPS | |
| 140 char addrbuf[128]; | |
| 141 #endif | |
| 142 int pf; | |
| 143 #if !defined(CURL_DISABLE_VERBOSE_STRINGS) | |
| 144 struct Curl_easy *data = conn->data; | |
| 145 #endif | |
| 146 | |
| 147 *waitp = 0; /* synchronous response only */ | |
| 148 | |
| 149 /* Check if a limited name resolve has been requested */ | |
| 150 switch(conn->ip_version) { | |
| 151 case CURL_IPRESOLVE_V4: | |
| 152 pf = PF_INET; | |
| 153 break; | |
| 154 case CURL_IPRESOLVE_V6: | |
| 155 pf = PF_INET6; | |
| 156 break; | |
| 157 default: | |
| 158 pf = PF_UNSPEC; | |
| 159 break; | |
| 160 } | |
| 161 | |
| 162 if((pf != PF_INET) && !Curl_ipv6works()) | |
| 163 /* The stack seems to be a non-IPv6 one */ | |
| 164 pf = PF_INET; | |
| 165 | |
| 166 memset(&hints, 0, sizeof(hints)); | |
| 167 hints.ai_family = pf; | |
| 168 hints.ai_socktype = (conn->transport == TRNSPRT_TCP) ? | |
| 169 SOCK_STREAM : SOCK_DGRAM; | |
| 170 | |
| 171 #ifndef USE_RESOLVE_ON_IPS | |
| 172 /* | |
| 173 * The AI_NUMERICHOST must not be set to get synthesized IPv6 address from | |
| 174 * an IPv4 address on iOS and Mac OS X. | |
| 175 */ | |
| 176 if((1 == Curl_inet_pton(AF_INET, hostname, addrbuf)) || | |
| 177 (1 == Curl_inet_pton(AF_INET6, hostname, addrbuf))) { | |
| 178 /* the given address is numerical only, prevent a reverse lookup */ | |
| 179 hints.ai_flags = AI_NUMERICHOST; | |
| 180 } | |
| 181 #endif | |
| 182 | |
| 183 if(port) { | |
| 184 msnprintf(sbuf, sizeof(sbuf), "%d", port); | |
| 185 sbufptr = sbuf; | |
| 186 } | |
| 187 | |
| 188 error = Curl_getaddrinfo_ex(hostname, sbufptr, &hints, &res); | |
| 189 if(error) { | |
| 190 infof(data, "getaddrinfo(3) failed for %s:%d\n", hostname, port); | |
| 191 return NULL; | |
| 192 } | |
| 193 | |
| 194 if(port) { | |
| 195 Curl_addrinfo_set_port(res, port); | |
| 196 } | |
| 197 | |
| 198 dump_addrinfo(conn, res); | |
| 199 | |
| 200 return res; | |
| 201 } | |
| 202 #endif /* CURLRES_SYNCH */ | |
| 203 | |
| 204 #endif /* CURLRES_IPV6 */ |
