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