xref: /aosp_15_r20/external/curl/tests/server/resolve.c (revision 6236dae45794135f37c4eb022389c904c8b0090d)
1*6236dae4SAndroid Build Coastguard Worker /***************************************************************************
2*6236dae4SAndroid Build Coastguard Worker  *                                  _   _ ____  _
3*6236dae4SAndroid Build Coastguard Worker  *  Project                     ___| | | |  _ \| |
4*6236dae4SAndroid Build Coastguard Worker  *                             / __| | | | |_) | |
5*6236dae4SAndroid Build Coastguard Worker  *                            | (__| |_| |  _ <| |___
6*6236dae4SAndroid Build Coastguard Worker  *                             \___|\___/|_| \_\_____|
7*6236dae4SAndroid Build Coastguard Worker  *
8*6236dae4SAndroid Build Coastguard Worker  * Copyright (C) Daniel Stenberg, <[email protected]>, et al.
9*6236dae4SAndroid Build Coastguard Worker  *
10*6236dae4SAndroid Build Coastguard Worker  * This software is licensed as described in the file COPYING, which
11*6236dae4SAndroid Build Coastguard Worker  * you should have received as part of this distribution. The terms
12*6236dae4SAndroid Build Coastguard Worker  * are also available at https://curl.se/docs/copyright.html.
13*6236dae4SAndroid Build Coastguard Worker  *
14*6236dae4SAndroid Build Coastguard Worker  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15*6236dae4SAndroid Build Coastguard Worker  * copies of the Software, and permit persons to whom the Software is
16*6236dae4SAndroid Build Coastguard Worker  * furnished to do so, under the terms of the COPYING file.
17*6236dae4SAndroid Build Coastguard Worker  *
18*6236dae4SAndroid Build Coastguard Worker  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19*6236dae4SAndroid Build Coastguard Worker  * KIND, either express or implied.
20*6236dae4SAndroid Build Coastguard Worker  *
21*6236dae4SAndroid Build Coastguard Worker  * SPDX-License-Identifier: curl
22*6236dae4SAndroid Build Coastguard Worker  *
23*6236dae4SAndroid Build Coastguard Worker  ***************************************************************************/
24*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_NO_GETADDRINFO_OVERRIDE
25*6236dae4SAndroid Build Coastguard Worker #define CURL_NO_GETADDRINFO_OVERRIDE
26*6236dae4SAndroid Build Coastguard Worker #endif
27*6236dae4SAndroid Build Coastguard Worker 
28*6236dae4SAndroid Build Coastguard Worker #include "server_setup.h"
29*6236dae4SAndroid Build Coastguard Worker 
30*6236dae4SAndroid Build Coastguard Worker /* Purpose
31*6236dae4SAndroid Build Coastguard Worker  *
32*6236dae4SAndroid Build Coastguard Worker  * Resolve the given name, using system name resolve functions (NOT any
33*6236dae4SAndroid Build Coastguard Worker  * function provided by libcurl). Used to see if the name exists and thus if
34*6236dae4SAndroid Build Coastguard Worker  * we can allow a test case to use it for testing.
35*6236dae4SAndroid Build Coastguard Worker  *
36*6236dae4SAndroid Build Coastguard Worker  * Like if 'localhost' actual exists etc.
37*6236dae4SAndroid Build Coastguard Worker  *
38*6236dae4SAndroid Build Coastguard Worker  */
39*6236dae4SAndroid Build Coastguard Worker 
40*6236dae4SAndroid Build Coastguard Worker #include <signal.h>
41*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_NETINET_IN_H
42*6236dae4SAndroid Build Coastguard Worker #include <netinet/in.h>
43*6236dae4SAndroid Build Coastguard Worker #endif
44*6236dae4SAndroid Build Coastguard Worker #ifdef _XOPEN_SOURCE_EXTENDED
45*6236dae4SAndroid Build Coastguard Worker /* This define is "almost" required to build on HP-UX 11 */
46*6236dae4SAndroid Build Coastguard Worker #include <arpa/inet.h>
47*6236dae4SAndroid Build Coastguard Worker #endif
48*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_NETDB_H
49*6236dae4SAndroid Build Coastguard Worker #include <netdb.h>
50*6236dae4SAndroid Build Coastguard Worker #endif
51*6236dae4SAndroid Build Coastguard Worker 
52*6236dae4SAndroid Build Coastguard Worker #include "curlx.h" /* from the private lib dir */
53*6236dae4SAndroid Build Coastguard Worker #include "util.h"
54*6236dae4SAndroid Build Coastguard Worker 
55*6236dae4SAndroid Build Coastguard Worker /* include memdebug.h last */
56*6236dae4SAndroid Build Coastguard Worker #include "memdebug.h"
57*6236dae4SAndroid Build Coastguard Worker 
58*6236dae4SAndroid Build Coastguard Worker static bool use_ipv6 = FALSE;
59*6236dae4SAndroid Build Coastguard Worker static const char *ipv_inuse = "IPv4";
60*6236dae4SAndroid Build Coastguard Worker 
61*6236dae4SAndroid Build Coastguard Worker const char *serverlogfile = ""; /* for a util.c function we don't use */
62*6236dae4SAndroid Build Coastguard Worker 
main(int argc,char * argv[])63*6236dae4SAndroid Build Coastguard Worker int main(int argc, char *argv[])
64*6236dae4SAndroid Build Coastguard Worker {
65*6236dae4SAndroid Build Coastguard Worker   int arg = 1;
66*6236dae4SAndroid Build Coastguard Worker   const char *host = NULL;
67*6236dae4SAndroid Build Coastguard Worker   int rc = 0;
68*6236dae4SAndroid Build Coastguard Worker 
69*6236dae4SAndroid Build Coastguard Worker   while(argc > arg) {
70*6236dae4SAndroid Build Coastguard Worker     if(!strcmp("--version", argv[arg])) {
71*6236dae4SAndroid Build Coastguard Worker       printf("resolve IPv4%s\n",
72*6236dae4SAndroid Build Coastguard Worker #if defined(CURLRES_IPV6)
73*6236dae4SAndroid Build Coastguard Worker              "/IPv6"
74*6236dae4SAndroid Build Coastguard Worker #else
75*6236dae4SAndroid Build Coastguard Worker              ""
76*6236dae4SAndroid Build Coastguard Worker #endif
77*6236dae4SAndroid Build Coastguard Worker              );
78*6236dae4SAndroid Build Coastguard Worker       return 0;
79*6236dae4SAndroid Build Coastguard Worker     }
80*6236dae4SAndroid Build Coastguard Worker     else if(!strcmp("--ipv6", argv[arg])) {
81*6236dae4SAndroid Build Coastguard Worker       ipv_inuse = "IPv6";
82*6236dae4SAndroid Build Coastguard Worker       use_ipv6 = TRUE;
83*6236dae4SAndroid Build Coastguard Worker       arg++;
84*6236dae4SAndroid Build Coastguard Worker     }
85*6236dae4SAndroid Build Coastguard Worker     else if(!strcmp("--ipv4", argv[arg])) {
86*6236dae4SAndroid Build Coastguard Worker       /* for completeness, we support this option as well */
87*6236dae4SAndroid Build Coastguard Worker       ipv_inuse = "IPv4";
88*6236dae4SAndroid Build Coastguard Worker       use_ipv6 = FALSE;
89*6236dae4SAndroid Build Coastguard Worker       arg++;
90*6236dae4SAndroid Build Coastguard Worker     }
91*6236dae4SAndroid Build Coastguard Worker     else {
92*6236dae4SAndroid Build Coastguard Worker       host = argv[arg++];
93*6236dae4SAndroid Build Coastguard Worker     }
94*6236dae4SAndroid Build Coastguard Worker   }
95*6236dae4SAndroid Build Coastguard Worker   if(!host) {
96*6236dae4SAndroid Build Coastguard Worker     puts("Usage: resolve [option] <host>\n"
97*6236dae4SAndroid Build Coastguard Worker          " --version\n"
98*6236dae4SAndroid Build Coastguard Worker          " --ipv4"
99*6236dae4SAndroid Build Coastguard Worker #if defined(CURLRES_IPV6)
100*6236dae4SAndroid Build Coastguard Worker          "\n --ipv6"
101*6236dae4SAndroid Build Coastguard Worker #endif
102*6236dae4SAndroid Build Coastguard Worker          );
103*6236dae4SAndroid Build Coastguard Worker     return 1;
104*6236dae4SAndroid Build Coastguard Worker   }
105*6236dae4SAndroid Build Coastguard Worker 
106*6236dae4SAndroid Build Coastguard Worker #ifdef _WIN32
107*6236dae4SAndroid Build Coastguard Worker   win32_init();
108*6236dae4SAndroid Build Coastguard Worker   atexit(win32_cleanup);
109*6236dae4SAndroid Build Coastguard Worker #endif
110*6236dae4SAndroid Build Coastguard Worker 
111*6236dae4SAndroid Build Coastguard Worker #if defined(CURLRES_IPV6)
112*6236dae4SAndroid Build Coastguard Worker   if(use_ipv6) {
113*6236dae4SAndroid Build Coastguard Worker     /* Check that the system has IPv6 enabled before checking the resolver */
114*6236dae4SAndroid Build Coastguard Worker     curl_socket_t s = socket(PF_INET6, SOCK_DGRAM, 0);
115*6236dae4SAndroid Build Coastguard Worker     if(s == CURL_SOCKET_BAD)
116*6236dae4SAndroid Build Coastguard Worker       /* an IPv6 address was requested and we can't get/use one */
117*6236dae4SAndroid Build Coastguard Worker       rc = -1;
118*6236dae4SAndroid Build Coastguard Worker     else {
119*6236dae4SAndroid Build Coastguard Worker       sclose(s);
120*6236dae4SAndroid Build Coastguard Worker     }
121*6236dae4SAndroid Build Coastguard Worker   }
122*6236dae4SAndroid Build Coastguard Worker 
123*6236dae4SAndroid Build Coastguard Worker   if(rc == 0) {
124*6236dae4SAndroid Build Coastguard Worker     /* getaddrinfo() resolve */
125*6236dae4SAndroid Build Coastguard Worker     struct addrinfo *ai;
126*6236dae4SAndroid Build Coastguard Worker     struct addrinfo hints;
127*6236dae4SAndroid Build Coastguard Worker 
128*6236dae4SAndroid Build Coastguard Worker     memset(&hints, 0, sizeof(hints));
129*6236dae4SAndroid Build Coastguard Worker     hints.ai_family = use_ipv6 ? PF_INET6 : PF_INET;
130*6236dae4SAndroid Build Coastguard Worker     hints.ai_socktype = SOCK_STREAM;
131*6236dae4SAndroid Build Coastguard Worker     hints.ai_flags = 0;
132*6236dae4SAndroid Build Coastguard Worker     rc = getaddrinfo(host, "80", &hints, &ai);
133*6236dae4SAndroid Build Coastguard Worker     if(rc == 0)
134*6236dae4SAndroid Build Coastguard Worker       freeaddrinfo(ai);
135*6236dae4SAndroid Build Coastguard Worker   }
136*6236dae4SAndroid Build Coastguard Worker #else
137*6236dae4SAndroid Build Coastguard Worker   if(use_ipv6) {
138*6236dae4SAndroid Build Coastguard Worker     puts("IPv6 support has been disabled in this program");
139*6236dae4SAndroid Build Coastguard Worker     return 1;
140*6236dae4SAndroid Build Coastguard Worker   }
141*6236dae4SAndroid Build Coastguard Worker   else {
142*6236dae4SAndroid Build Coastguard Worker     /* gethostbyname() resolve */
143*6236dae4SAndroid Build Coastguard Worker     struct hostent *he;
144*6236dae4SAndroid Build Coastguard Worker 
145*6236dae4SAndroid Build Coastguard Worker     he = gethostbyname(host);
146*6236dae4SAndroid Build Coastguard Worker 
147*6236dae4SAndroid Build Coastguard Worker     rc = !he;
148*6236dae4SAndroid Build Coastguard Worker   }
149*6236dae4SAndroid Build Coastguard Worker #endif
150*6236dae4SAndroid Build Coastguard Worker 
151*6236dae4SAndroid Build Coastguard Worker   if(rc)
152*6236dae4SAndroid Build Coastguard Worker     printf("Resolving %s '%s' didn't work\n", ipv_inuse, host);
153*6236dae4SAndroid Build Coastguard Worker 
154*6236dae4SAndroid Build Coastguard Worker   return !!rc;
155*6236dae4SAndroid Build Coastguard Worker }
156