Annotation of embedaddon/curl/tests/server/resolve.c, revision 1.1.1.1

1.1       misho       1: /***************************************************************************
                      2:  *                                  _   _ ____  _
                      3:  *  Project                     ___| | | |  _ \| |
                      4:  *                             / __| | | | |_) | |
                      5:  *                            | (__| |_| |  _ <| |___
                      6:  *                             \___|\___/|_| \_\_____|
                      7:  *
                      8:  * Copyright (C) 1998 - 2020, 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: #include "server_setup.h"
                     23: 
                     24: /* Purpose
                     25:  *
                     26:  * Resolve the given name, using system name resolve functions (NOT any
                     27:  * function provided by libcurl). Used to see if the name exists and thus if
                     28:  * we can allow a test case to use it for testing.
                     29:  *
                     30:  * Like if 'localhost' actual exists etc.
                     31:  *
                     32:  */
                     33: 
                     34: #ifdef HAVE_SIGNAL_H
                     35: #include <signal.h>
                     36: #endif
                     37: #ifdef HAVE_NETINET_IN_H
                     38: #include <netinet/in.h>
                     39: #endif
                     40: #ifdef _XOPEN_SOURCE_EXTENDED
                     41: /* This define is "almost" required to build on HPUX 11 */
                     42: #include <arpa/inet.h>
                     43: #endif
                     44: #ifdef HAVE_NETDB_H
                     45: #include <netdb.h>
                     46: #endif
                     47: 
                     48: #define ENABLE_CURLX_PRINTF
                     49: /* make the curlx header define all printf() functions to use the curlx_*
                     50:    versions instead */
                     51: #include "curlx.h" /* from the private lib dir */
                     52: #include "util.h"
                     53: 
                     54: /* include memdebug.h last */
                     55: #include "memdebug.h"
                     56: 
                     57: static bool use_ipv6 = FALSE;
                     58: static const char *ipv_inuse = "IPv4";
                     59: 
                     60: const char *serverlogfile = ""; /* for a util.c function we don't use */
                     61: 
                     62: int main(int argc, char *argv[])
                     63: {
                     64:   int arg = 1;
                     65:   const char *host = NULL;
                     66:   int rc = 0;
                     67: 
                     68:   while(argc>arg) {
                     69:     if(!strcmp("--version", argv[arg])) {
                     70:       printf("resolve IPv4%s\n",
                     71: #if defined(CURLRES_IPV6)
                     72:              "/IPv6"
                     73: #else
                     74:              ""
                     75: #endif
                     76:              );
                     77:       return 0;
                     78:     }
                     79:     else if(!strcmp("--ipv6", argv[arg])) {
                     80:       ipv_inuse = "IPv6";
                     81:       use_ipv6 = TRUE;
                     82:       arg++;
                     83:     }
                     84:     else if(!strcmp("--ipv4", argv[arg])) {
                     85:       /* for completeness, we support this option as well */
                     86:       ipv_inuse = "IPv4";
                     87:       use_ipv6 = FALSE;
                     88:       arg++;
                     89:     }
                     90:     else {
                     91:       host = argv[arg++];
                     92:     }
                     93:   }
                     94:   if(!host) {
                     95:     puts("Usage: resolve [option] <host>\n"
                     96:          " --version\n"
                     97:          " --ipv4"
                     98: #if defined(CURLRES_IPV6)
                     99:          "\n --ipv6"
                    100: #endif
                    101:          );
                    102:     return 1;
                    103:   }
                    104: 
                    105: #ifdef WIN32
                    106:   win32_init();
                    107:   atexit(win32_cleanup);
                    108: #endif
                    109: 
                    110: #if defined(CURLRES_IPV6)
                    111:   if(use_ipv6) {
                    112:     /* Check that the system has IPv6 enabled before checking the resolver */
                    113:     curl_socket_t s = socket(PF_INET6, SOCK_DGRAM, 0);
                    114:     if(s == CURL_SOCKET_BAD)
                    115:       /* an IPv6 address was requested and we can't get/use one */
                    116:       rc = -1;
                    117:     else {
                    118:       sclose(s);
                    119:     }
                    120:   }
                    121: 
                    122:   if(rc == 0) {
                    123:     /* getaddrinfo() resolve */
                    124:     struct addrinfo *ai;
                    125:     struct addrinfo hints;
                    126: 
                    127:     memset(&hints, 0, sizeof(hints));
                    128:     hints.ai_family = use_ipv6 ? PF_INET6 : PF_INET;
                    129:     hints.ai_socktype = SOCK_STREAM;
                    130:     hints.ai_flags = 0;
                    131:     /* Use parenthesis around functions to stop them from being replaced by
                    132:        the macro in memdebug.h */
                    133:     rc = (getaddrinfo)(host, "80", &hints, &ai);
                    134:     if(rc == 0)
                    135:       (freeaddrinfo)(ai);
                    136:   }
                    137: #else
                    138:   if(use_ipv6) {
                    139:     puts("IPv6 support has been disabled in this program");
                    140:     return 1;
                    141:   }
                    142:   else {
                    143:     /* gethostbyname() resolve */
                    144:     struct hostent *he;
                    145: 
                    146:     he = gethostbyname(host);
                    147: 
                    148:     rc = !he;
                    149:   }
                    150: #endif
                    151: 
                    152:   if(rc)
                    153:     printf("Resolving %s '%s' didn't work\n", ipv_inuse, host);
                    154: 
                    155:   return !!rc;
                    156: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>