aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/curl/lib/hostasyn.c
blob: 318ddc1fb8a4030bd7f62d7de04d9ebac6067e21 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*************************************************************************** 
 *                                  _   _ ____  _ 
 *  Project                     ___| | | |  _ \| | 
 *                             / __| | | | |_) | | 
 *                            | (__| |_| |  _ <| |___ 
 *                             \___|\___/|_| \_\_____| 
 * 
 * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
 * 
 * This software is licensed as described in the file COPYING, which 
 * you should have received as part of this distribution. The terms 
 * are also available at https://curl.se/docs/copyright.html.
 * 
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell 
 * copies of the Software, and permit persons to whom the Software is 
 * furnished to do so, under the terms of the COPYING file. 
 * 
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 
 * KIND, either express or implied. 
 * 
 ***************************************************************************/ 
 
#include "curl_setup.h" 
 
/***********************************************************************
 * Only for builds using asynchronous name resolves
 **********************************************************************/
#ifdef CURLRES_ASYNCH

#ifdef HAVE_NETINET_IN_H 
#include <netinet/in.h> 
#endif 
#ifdef HAVE_NETDB_H 
#include <netdb.h> 
#endif 
#ifdef HAVE_ARPA_INET_H 
#include <arpa/inet.h> 
#endif 
#ifdef __VMS 
#include <in.h> 
#include <inet.h> 
#endif 
 
#ifdef HAVE_PROCESS_H 
#include <process.h> 
#endif 
 
#include "urldata.h" 
#include "sendf.h" 
#include "hostip.h" 
#include "hash.h" 
#include "share.h" 
#include "strerror.h" 
#include "url.h" 
#include "curl_memory.h" 
/* The last #include file should be: */ 
#include "memdebug.h" 
 
/* 
 * Curl_addrinfo_callback() gets called by ares, gethostbyname_thread() 
 * or getaddrinfo_thread() when we got the name resolved (or not!). 
 * 
 * If the status argument is CURL_ASYNC_SUCCESS, this function takes 
 * ownership of the Curl_addrinfo passed, storing the resolved data 
 * in the DNS cache. 
 * 
 * The storage operation locks and unlocks the DNS cache. 
 */ 
CURLcode Curl_addrinfo_callback(struct connectdata *conn, 
                                int status, 
                                struct Curl_addrinfo *ai) 
{ 
  struct Curl_dns_entry *dns = NULL; 
  CURLcode result = CURLE_OK;
 
  conn->async.status = status; 
 
  if(CURL_ASYNC_SUCCESS == status) { 
    if(ai) { 
      struct Curl_easy *data = conn->data;
 
      if(data->share) 
        Curl_share_lock(data, CURL_LOCK_DATA_DNS, CURL_LOCK_ACCESS_SINGLE); 
 
      dns = Curl_cache_addr(data, ai, 
                            conn->async.hostname, 
                            conn->async.port); 
      if(data->share)
        Curl_share_unlock(data, CURL_LOCK_DATA_DNS);

      if(!dns) { 
        /* failed to store, cleanup and return error */ 
        Curl_freeaddrinfo(ai); 
        result = CURLE_OUT_OF_MEMORY;
      } 
    } 
    else { 
      result = CURLE_OUT_OF_MEMORY;
    } 
  } 
 
  conn->async.dns = dns; 
 
 /* Set async.done TRUE last in this function since it may be used multi- 
    threaded and once this is TRUE the other thread may read fields from the 
    async struct */ 
  conn->async.done = TRUE; 
 
  /* IPv4: The input hostent struct will be freed by ares when we return from
     this function */ 
  return result;
} 
 
/* 
 * Curl_getaddrinfo() is the generic low-level name resolve API within this 
 * source file. There are several versions of this function - for different 
 * name resolve layers (selected at build-time). They all take this same set 
 * of arguments 
 */ 
struct Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
                                       const char *hostname,
                                       int port,
                                       int *waitp)
{ 
  return Curl_resolver_getaddrinfo(conn, hostname, port, waitp); 
} 
 
#endif /* CURLRES_ASYNCH */