1*6236dae4SAndroid Build Coastguard Worker #ifndef HEADER_CURL_ASYN_H 2*6236dae4SAndroid Build Coastguard Worker #define HEADER_CURL_ASYN_H 3*6236dae4SAndroid Build Coastguard Worker /*************************************************************************** 4*6236dae4SAndroid Build Coastguard Worker * _ _ ____ _ 5*6236dae4SAndroid Build Coastguard Worker * Project ___| | | | _ \| | 6*6236dae4SAndroid Build Coastguard Worker * / __| | | | |_) | | 7*6236dae4SAndroid Build Coastguard Worker * | (__| |_| | _ <| |___ 8*6236dae4SAndroid Build Coastguard Worker * \___|\___/|_| \_\_____| 9*6236dae4SAndroid Build Coastguard Worker * 10*6236dae4SAndroid Build Coastguard Worker * Copyright (C) Daniel Stenberg, <[email protected]>, et al. 11*6236dae4SAndroid Build Coastguard Worker * 12*6236dae4SAndroid Build Coastguard Worker * This software is licensed as described in the file COPYING, which 13*6236dae4SAndroid Build Coastguard Worker * you should have received as part of this distribution. The terms 14*6236dae4SAndroid Build Coastguard Worker * are also available at https://curl.se/docs/copyright.html. 15*6236dae4SAndroid Build Coastguard Worker * 16*6236dae4SAndroid Build Coastguard Worker * You may opt to use, copy, modify, merge, publish, distribute and/or sell 17*6236dae4SAndroid Build Coastguard Worker * copies of the Software, and permit persons to whom the Software is 18*6236dae4SAndroid Build Coastguard Worker * furnished to do so, under the terms of the COPYING file. 19*6236dae4SAndroid Build Coastguard Worker * 20*6236dae4SAndroid Build Coastguard Worker * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 21*6236dae4SAndroid Build Coastguard Worker * KIND, either express or implied. 22*6236dae4SAndroid Build Coastguard Worker * 23*6236dae4SAndroid Build Coastguard Worker * SPDX-License-Identifier: curl 24*6236dae4SAndroid Build Coastguard Worker * 25*6236dae4SAndroid Build Coastguard Worker ***************************************************************************/ 26*6236dae4SAndroid Build Coastguard Worker 27*6236dae4SAndroid Build Coastguard Worker #include "curl_setup.h" 28*6236dae4SAndroid Build Coastguard Worker #include "curl_addrinfo.h" 29*6236dae4SAndroid Build Coastguard Worker 30*6236dae4SAndroid Build Coastguard Worker struct addrinfo; 31*6236dae4SAndroid Build Coastguard Worker struct hostent; 32*6236dae4SAndroid Build Coastguard Worker struct Curl_easy; 33*6236dae4SAndroid Build Coastguard Worker struct connectdata; 34*6236dae4SAndroid Build Coastguard Worker struct Curl_dns_entry; 35*6236dae4SAndroid Build Coastguard Worker 36*6236dae4SAndroid Build Coastguard Worker /* 37*6236dae4SAndroid Build Coastguard Worker * This header defines all functions in the internal asynch resolver interface. 38*6236dae4SAndroid Build Coastguard Worker * All asynch resolvers need to provide these functions. 39*6236dae4SAndroid Build Coastguard Worker * asyn-ares.c and asyn-thread.c are the current implementations of asynch 40*6236dae4SAndroid Build Coastguard Worker * resolver backends. 41*6236dae4SAndroid Build Coastguard Worker */ 42*6236dae4SAndroid Build Coastguard Worker 43*6236dae4SAndroid Build Coastguard Worker /* 44*6236dae4SAndroid Build Coastguard Worker * Curl_resolver_global_init() 45*6236dae4SAndroid Build Coastguard Worker * 46*6236dae4SAndroid Build Coastguard Worker * Called from curl_global_init() to initialize global resolver environment. 47*6236dae4SAndroid Build Coastguard Worker * Returning anything else than CURLE_OK fails curl_global_init(). 48*6236dae4SAndroid Build Coastguard Worker */ 49*6236dae4SAndroid Build Coastguard Worker int Curl_resolver_global_init(void); 50*6236dae4SAndroid Build Coastguard Worker 51*6236dae4SAndroid Build Coastguard Worker /* 52*6236dae4SAndroid Build Coastguard Worker * Curl_resolver_global_cleanup() 53*6236dae4SAndroid Build Coastguard Worker * Called from curl_global_cleanup() to destroy global resolver environment. 54*6236dae4SAndroid Build Coastguard Worker */ 55*6236dae4SAndroid Build Coastguard Worker void Curl_resolver_global_cleanup(void); 56*6236dae4SAndroid Build Coastguard Worker 57*6236dae4SAndroid Build Coastguard Worker /* 58*6236dae4SAndroid Build Coastguard Worker * Curl_resolver_init() 59*6236dae4SAndroid Build Coastguard Worker * Called from curl_easy_init() -> Curl_open() to initialize resolver 60*6236dae4SAndroid Build Coastguard Worker * URL-state specific environment ('resolver' member of the UrlState 61*6236dae4SAndroid Build Coastguard Worker * structure). Should fill the passed pointer by the initialized handler. 62*6236dae4SAndroid Build Coastguard Worker * Returning anything else than CURLE_OK fails curl_easy_init() with the 63*6236dae4SAndroid Build Coastguard Worker * correspondent code. 64*6236dae4SAndroid Build Coastguard Worker */ 65*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_resolver_init(struct Curl_easy *easy, void **resolver); 66*6236dae4SAndroid Build Coastguard Worker 67*6236dae4SAndroid Build Coastguard Worker /* 68*6236dae4SAndroid Build Coastguard Worker * Curl_resolver_cleanup() 69*6236dae4SAndroid Build Coastguard Worker * Called from curl_easy_cleanup() -> Curl_close() to cleanup resolver 70*6236dae4SAndroid Build Coastguard Worker * URL-state specific environment ('resolver' member of the UrlState 71*6236dae4SAndroid Build Coastguard Worker * structure). Should destroy the handler and free all resources connected to 72*6236dae4SAndroid Build Coastguard Worker * it. 73*6236dae4SAndroid Build Coastguard Worker */ 74*6236dae4SAndroid Build Coastguard Worker void Curl_resolver_cleanup(void *resolver); 75*6236dae4SAndroid Build Coastguard Worker 76*6236dae4SAndroid Build Coastguard Worker /* 77*6236dae4SAndroid Build Coastguard Worker * Curl_resolver_duphandle() 78*6236dae4SAndroid Build Coastguard Worker * Called from curl_easy_duphandle() to duplicate resolver URL-state specific 79*6236dae4SAndroid Build Coastguard Worker * environment ('resolver' member of the UrlState structure). Should 80*6236dae4SAndroid Build Coastguard Worker * duplicate the 'from' handle and pass the resulting handle to the 'to' 81*6236dae4SAndroid Build Coastguard Worker * pointer. Returning anything else than CURLE_OK causes failed 82*6236dae4SAndroid Build Coastguard Worker * curl_easy_duphandle() call. 83*6236dae4SAndroid Build Coastguard Worker */ 84*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_resolver_duphandle(struct Curl_easy *easy, void **to, 85*6236dae4SAndroid Build Coastguard Worker void *from); 86*6236dae4SAndroid Build Coastguard Worker 87*6236dae4SAndroid Build Coastguard Worker /* 88*6236dae4SAndroid Build Coastguard Worker * Curl_resolver_cancel(). 89*6236dae4SAndroid Build Coastguard Worker * 90*6236dae4SAndroid Build Coastguard Worker * It is called from inside other functions to cancel currently performing 91*6236dae4SAndroid Build Coastguard Worker * resolver request. Should also free any temporary resources allocated to 92*6236dae4SAndroid Build Coastguard Worker * perform a request. This never waits for resolver threads to complete. 93*6236dae4SAndroid Build Coastguard Worker * 94*6236dae4SAndroid Build Coastguard Worker * It is safe to call this when conn is in any state. 95*6236dae4SAndroid Build Coastguard Worker */ 96*6236dae4SAndroid Build Coastguard Worker void Curl_resolver_cancel(struct Curl_easy *data); 97*6236dae4SAndroid Build Coastguard Worker 98*6236dae4SAndroid Build Coastguard Worker /* 99*6236dae4SAndroid Build Coastguard Worker * Curl_resolver_kill(). 100*6236dae4SAndroid Build Coastguard Worker * 101*6236dae4SAndroid Build Coastguard Worker * This acts like Curl_resolver_cancel() except it will block until any threads 102*6236dae4SAndroid Build Coastguard Worker * associated with the resolver are complete. This never blocks for resolvers 103*6236dae4SAndroid Build Coastguard Worker * that do not use threads. This is intended to be the "last chance" function 104*6236dae4SAndroid Build Coastguard Worker * that cleans up an in-progress resolver completely (before its owner is about 105*6236dae4SAndroid Build Coastguard Worker * to die). 106*6236dae4SAndroid Build Coastguard Worker * 107*6236dae4SAndroid Build Coastguard Worker * It is safe to call this when conn is in any state. 108*6236dae4SAndroid Build Coastguard Worker */ 109*6236dae4SAndroid Build Coastguard Worker void Curl_resolver_kill(struct Curl_easy *data); 110*6236dae4SAndroid Build Coastguard Worker 111*6236dae4SAndroid Build Coastguard Worker /* Curl_resolver_getsock() 112*6236dae4SAndroid Build Coastguard Worker * 113*6236dae4SAndroid Build Coastguard Worker * This function is called from the multi_getsock() function. 'sock' is a 114*6236dae4SAndroid Build Coastguard Worker * pointer to an array to hold the file descriptors, with 'numsock' being the 115*6236dae4SAndroid Build Coastguard Worker * size of that array (in number of entries). This function is supposed to 116*6236dae4SAndroid Build Coastguard Worker * return bitmask indicating what file descriptors (referring to array indexes 117*6236dae4SAndroid Build Coastguard Worker * in the 'sock' array) to wait for, read/write. 118*6236dae4SAndroid Build Coastguard Worker */ 119*6236dae4SAndroid Build Coastguard Worker int Curl_resolver_getsock(struct Curl_easy *data, curl_socket_t *sock); 120*6236dae4SAndroid Build Coastguard Worker 121*6236dae4SAndroid Build Coastguard Worker /* 122*6236dae4SAndroid Build Coastguard Worker * Curl_resolver_is_resolved() 123*6236dae4SAndroid Build Coastguard Worker * 124*6236dae4SAndroid Build Coastguard Worker * Called repeatedly to check if a previous name resolve request has 125*6236dae4SAndroid Build Coastguard Worker * completed. It should also make sure to time-out if the operation seems to 126*6236dae4SAndroid Build Coastguard Worker * take too long. 127*6236dae4SAndroid Build Coastguard Worker * 128*6236dae4SAndroid Build Coastguard Worker * Returns normal CURLcode errors. 129*6236dae4SAndroid Build Coastguard Worker */ 130*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_resolver_is_resolved(struct Curl_easy *data, 131*6236dae4SAndroid Build Coastguard Worker struct Curl_dns_entry **dns); 132*6236dae4SAndroid Build Coastguard Worker 133*6236dae4SAndroid Build Coastguard Worker /* 134*6236dae4SAndroid Build Coastguard Worker * Curl_resolver_wait_resolv() 135*6236dae4SAndroid Build Coastguard Worker * 136*6236dae4SAndroid Build Coastguard Worker * Waits for a resolve to finish. This function should be avoided since using 137*6236dae4SAndroid Build Coastguard Worker * this risk getting the multi interface to "hang". 138*6236dae4SAndroid Build Coastguard Worker * 139*6236dae4SAndroid Build Coastguard Worker * If 'entry' is non-NULL, make it point to the resolved dns entry 140*6236dae4SAndroid Build Coastguard Worker * 141*6236dae4SAndroid Build Coastguard Worker * Returns CURLE_COULDNT_RESOLVE_HOST if the host was not resolved, 142*6236dae4SAndroid Build Coastguard Worker * CURLE_OPERATION_TIMEDOUT if a time-out occurred, or other errors. 143*6236dae4SAndroid Build Coastguard Worker */ 144*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_resolver_wait_resolv(struct Curl_easy *data, 145*6236dae4SAndroid Build Coastguard Worker struct Curl_dns_entry **dnsentry); 146*6236dae4SAndroid Build Coastguard Worker 147*6236dae4SAndroid Build Coastguard Worker /* 148*6236dae4SAndroid Build Coastguard Worker * Curl_resolver_getaddrinfo() - when using this resolver 149*6236dae4SAndroid Build Coastguard Worker * 150*6236dae4SAndroid Build Coastguard Worker * Returns name information about the given hostname and port number. If 151*6236dae4SAndroid Build Coastguard Worker * successful, the 'hostent' is returned and the fourth argument will point to 152*6236dae4SAndroid Build Coastguard Worker * memory we need to free after use. That memory *MUST* be freed with 153*6236dae4SAndroid Build Coastguard Worker * Curl_freeaddrinfo(), nothing else. 154*6236dae4SAndroid Build Coastguard Worker * 155*6236dae4SAndroid Build Coastguard Worker * Each resolver backend must of course make sure to return data in the 156*6236dae4SAndroid Build Coastguard Worker * correct format to comply with this. 157*6236dae4SAndroid Build Coastguard Worker */ 158*6236dae4SAndroid Build Coastguard Worker struct Curl_addrinfo *Curl_resolver_getaddrinfo(struct Curl_easy *data, 159*6236dae4SAndroid Build Coastguard Worker const char *hostname, 160*6236dae4SAndroid Build Coastguard Worker int port, 161*6236dae4SAndroid Build Coastguard Worker int *waitp); 162*6236dae4SAndroid Build Coastguard Worker 163*6236dae4SAndroid Build Coastguard Worker #ifndef CURLRES_ASYNCH 164*6236dae4SAndroid Build Coastguard Worker /* convert these functions if an asynch resolver is not used */ 165*6236dae4SAndroid Build Coastguard Worker #define Curl_resolver_cancel(x) Curl_nop_stmt 166*6236dae4SAndroid Build Coastguard Worker #define Curl_resolver_kill(x) Curl_nop_stmt 167*6236dae4SAndroid Build Coastguard Worker #define Curl_resolver_is_resolved(x,y) CURLE_COULDNT_RESOLVE_HOST 168*6236dae4SAndroid Build Coastguard Worker #define Curl_resolver_wait_resolv(x,y) CURLE_COULDNT_RESOLVE_HOST 169*6236dae4SAndroid Build Coastguard Worker #define Curl_resolver_duphandle(x,y,z) CURLE_OK 170*6236dae4SAndroid Build Coastguard Worker #define Curl_resolver_init(x,y) CURLE_OK 171*6236dae4SAndroid Build Coastguard Worker #define Curl_resolver_global_init() CURLE_OK 172*6236dae4SAndroid Build Coastguard Worker #define Curl_resolver_global_cleanup() Curl_nop_stmt 173*6236dae4SAndroid Build Coastguard Worker #define Curl_resolver_cleanup(x) Curl_nop_stmt 174*6236dae4SAndroid Build Coastguard Worker #endif 175*6236dae4SAndroid Build Coastguard Worker 176*6236dae4SAndroid Build Coastguard Worker #ifdef CURLRES_ASYNCH 177*6236dae4SAndroid Build Coastguard Worker #define Curl_resolver_asynch() 1 178*6236dae4SAndroid Build Coastguard Worker #else 179*6236dae4SAndroid Build Coastguard Worker #define Curl_resolver_asynch() 0 180*6236dae4SAndroid Build Coastguard Worker #endif 181*6236dae4SAndroid Build Coastguard Worker 182*6236dae4SAndroid Build Coastguard Worker 183*6236dae4SAndroid Build Coastguard Worker /********** end of generic resolver interface functions *****************/ 184*6236dae4SAndroid Build Coastguard Worker #endif /* HEADER_CURL_ASYN_H */ 185