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
25*6236dae4SAndroid Build Coastguard Worker #include "curl_setup.h"
26*6236dae4SAndroid Build Coastguard Worker
27*6236dae4SAndroid Build Coastguard Worker #include <curl/curl.h>
28*6236dae4SAndroid Build Coastguard Worker
29*6236dae4SAndroid Build Coastguard Worker #include "urldata.h"
30*6236dae4SAndroid Build Coastguard Worker #include "getinfo.h"
31*6236dae4SAndroid Build Coastguard Worker
32*6236dae4SAndroid Build Coastguard Worker #include "vtls/vtls.h"
33*6236dae4SAndroid Build Coastguard Worker #include "connect.h" /* Curl_getconnectinfo() */
34*6236dae4SAndroid Build Coastguard Worker #include "progress.h"
35*6236dae4SAndroid Build Coastguard Worker
36*6236dae4SAndroid Build Coastguard Worker /* The last #include files should be: */
37*6236dae4SAndroid Build Coastguard Worker #include "curl_memory.h"
38*6236dae4SAndroid Build Coastguard Worker #include "memdebug.h"
39*6236dae4SAndroid Build Coastguard Worker
40*6236dae4SAndroid Build Coastguard Worker /*
41*6236dae4SAndroid Build Coastguard Worker * Initialize statistical and informational data.
42*6236dae4SAndroid Build Coastguard Worker *
43*6236dae4SAndroid Build Coastguard Worker * This function is called in curl_easy_reset, curl_easy_duphandle and at the
44*6236dae4SAndroid Build Coastguard Worker * beginning of a perform session. It must reset the session-info variables,
45*6236dae4SAndroid Build Coastguard Worker * in particular all variables in struct PureInfo.
46*6236dae4SAndroid Build Coastguard Worker */
Curl_initinfo(struct Curl_easy * data)47*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_initinfo(struct Curl_easy *data)
48*6236dae4SAndroid Build Coastguard Worker {
49*6236dae4SAndroid Build Coastguard Worker struct Progress *pro = &data->progress;
50*6236dae4SAndroid Build Coastguard Worker struct PureInfo *info = &data->info;
51*6236dae4SAndroid Build Coastguard Worker
52*6236dae4SAndroid Build Coastguard Worker pro->t_nslookup = 0;
53*6236dae4SAndroid Build Coastguard Worker pro->t_connect = 0;
54*6236dae4SAndroid Build Coastguard Worker pro->t_appconnect = 0;
55*6236dae4SAndroid Build Coastguard Worker pro->t_pretransfer = 0;
56*6236dae4SAndroid Build Coastguard Worker pro->t_posttransfer = 0;
57*6236dae4SAndroid Build Coastguard Worker pro->t_starttransfer = 0;
58*6236dae4SAndroid Build Coastguard Worker pro->timespent = 0;
59*6236dae4SAndroid Build Coastguard Worker pro->t_redirect = 0;
60*6236dae4SAndroid Build Coastguard Worker pro->is_t_startransfer_set = FALSE;
61*6236dae4SAndroid Build Coastguard Worker
62*6236dae4SAndroid Build Coastguard Worker info->httpcode = 0;
63*6236dae4SAndroid Build Coastguard Worker info->httpproxycode = 0;
64*6236dae4SAndroid Build Coastguard Worker info->httpversion = 0;
65*6236dae4SAndroid Build Coastguard Worker info->filetime = -1; /* -1 is an illegal time and thus means unknown */
66*6236dae4SAndroid Build Coastguard Worker info->timecond = FALSE;
67*6236dae4SAndroid Build Coastguard Worker
68*6236dae4SAndroid Build Coastguard Worker info->header_size = 0;
69*6236dae4SAndroid Build Coastguard Worker info->request_size = 0;
70*6236dae4SAndroid Build Coastguard Worker info->proxyauthavail = 0;
71*6236dae4SAndroid Build Coastguard Worker info->httpauthavail = 0;
72*6236dae4SAndroid Build Coastguard Worker info->numconnects = 0;
73*6236dae4SAndroid Build Coastguard Worker
74*6236dae4SAndroid Build Coastguard Worker free(info->contenttype);
75*6236dae4SAndroid Build Coastguard Worker info->contenttype = NULL;
76*6236dae4SAndroid Build Coastguard Worker
77*6236dae4SAndroid Build Coastguard Worker free(info->wouldredirect);
78*6236dae4SAndroid Build Coastguard Worker info->wouldredirect = NULL;
79*6236dae4SAndroid Build Coastguard Worker
80*6236dae4SAndroid Build Coastguard Worker memset(&info->primary, 0, sizeof(info->primary));
81*6236dae4SAndroid Build Coastguard Worker info->primary.remote_port = -1;
82*6236dae4SAndroid Build Coastguard Worker info->primary.local_port = -1;
83*6236dae4SAndroid Build Coastguard Worker info->retry_after = 0;
84*6236dae4SAndroid Build Coastguard Worker
85*6236dae4SAndroid Build Coastguard Worker info->conn_scheme = 0;
86*6236dae4SAndroid Build Coastguard Worker info->conn_protocol = 0;
87*6236dae4SAndroid Build Coastguard Worker
88*6236dae4SAndroid Build Coastguard Worker #ifdef USE_SSL
89*6236dae4SAndroid Build Coastguard Worker Curl_ssl_free_certinfo(data);
90*6236dae4SAndroid Build Coastguard Worker #endif
91*6236dae4SAndroid Build Coastguard Worker return CURLE_OK;
92*6236dae4SAndroid Build Coastguard Worker }
93*6236dae4SAndroid Build Coastguard Worker
getinfo_char(struct Curl_easy * data,CURLINFO info,const char ** param_charp)94*6236dae4SAndroid Build Coastguard Worker static CURLcode getinfo_char(struct Curl_easy *data, CURLINFO info,
95*6236dae4SAndroid Build Coastguard Worker const char **param_charp)
96*6236dae4SAndroid Build Coastguard Worker {
97*6236dae4SAndroid Build Coastguard Worker switch(info) {
98*6236dae4SAndroid Build Coastguard Worker case CURLINFO_EFFECTIVE_URL:
99*6236dae4SAndroid Build Coastguard Worker *param_charp = data->state.url ? data->state.url : (char *)"";
100*6236dae4SAndroid Build Coastguard Worker break;
101*6236dae4SAndroid Build Coastguard Worker case CURLINFO_EFFECTIVE_METHOD: {
102*6236dae4SAndroid Build Coastguard Worker const char *m = data->set.str[STRING_CUSTOMREQUEST];
103*6236dae4SAndroid Build Coastguard Worker if(!m) {
104*6236dae4SAndroid Build Coastguard Worker if(data->set.opt_no_body)
105*6236dae4SAndroid Build Coastguard Worker m = "HEAD";
106*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_HTTP
107*6236dae4SAndroid Build Coastguard Worker else {
108*6236dae4SAndroid Build Coastguard Worker switch(data->state.httpreq) {
109*6236dae4SAndroid Build Coastguard Worker case HTTPREQ_POST:
110*6236dae4SAndroid Build Coastguard Worker case HTTPREQ_POST_FORM:
111*6236dae4SAndroid Build Coastguard Worker case HTTPREQ_POST_MIME:
112*6236dae4SAndroid Build Coastguard Worker m = "POST";
113*6236dae4SAndroid Build Coastguard Worker break;
114*6236dae4SAndroid Build Coastguard Worker case HTTPREQ_PUT:
115*6236dae4SAndroid Build Coastguard Worker m = "PUT";
116*6236dae4SAndroid Build Coastguard Worker break;
117*6236dae4SAndroid Build Coastguard Worker default: /* this should never happen */
118*6236dae4SAndroid Build Coastguard Worker case HTTPREQ_GET:
119*6236dae4SAndroid Build Coastguard Worker m = "GET";
120*6236dae4SAndroid Build Coastguard Worker break;
121*6236dae4SAndroid Build Coastguard Worker case HTTPREQ_HEAD:
122*6236dae4SAndroid Build Coastguard Worker m = "HEAD";
123*6236dae4SAndroid Build Coastguard Worker break;
124*6236dae4SAndroid Build Coastguard Worker }
125*6236dae4SAndroid Build Coastguard Worker }
126*6236dae4SAndroid Build Coastguard Worker #endif
127*6236dae4SAndroid Build Coastguard Worker }
128*6236dae4SAndroid Build Coastguard Worker *param_charp = m;
129*6236dae4SAndroid Build Coastguard Worker }
130*6236dae4SAndroid Build Coastguard Worker break;
131*6236dae4SAndroid Build Coastguard Worker case CURLINFO_CONTENT_TYPE:
132*6236dae4SAndroid Build Coastguard Worker *param_charp = data->info.contenttype;
133*6236dae4SAndroid Build Coastguard Worker break;
134*6236dae4SAndroid Build Coastguard Worker case CURLINFO_PRIVATE:
135*6236dae4SAndroid Build Coastguard Worker *param_charp = (char *) data->set.private_data;
136*6236dae4SAndroid Build Coastguard Worker break;
137*6236dae4SAndroid Build Coastguard Worker case CURLINFO_FTP_ENTRY_PATH:
138*6236dae4SAndroid Build Coastguard Worker /* Return the entrypath string from the most recent connection.
139*6236dae4SAndroid Build Coastguard Worker This pointer was copied from the connectdata structure by FTP.
140*6236dae4SAndroid Build Coastguard Worker The actual string may be free()ed by subsequent libcurl calls so
141*6236dae4SAndroid Build Coastguard Worker it must be copied to a safer area before the next libcurl call.
142*6236dae4SAndroid Build Coastguard Worker Callers must never free it themselves. */
143*6236dae4SAndroid Build Coastguard Worker *param_charp = data->state.most_recent_ftp_entrypath;
144*6236dae4SAndroid Build Coastguard Worker break;
145*6236dae4SAndroid Build Coastguard Worker case CURLINFO_REDIRECT_URL:
146*6236dae4SAndroid Build Coastguard Worker /* Return the URL this request would have been redirected to if that
147*6236dae4SAndroid Build Coastguard Worker option had been enabled! */
148*6236dae4SAndroid Build Coastguard Worker *param_charp = data->info.wouldredirect;
149*6236dae4SAndroid Build Coastguard Worker break;
150*6236dae4SAndroid Build Coastguard Worker case CURLINFO_REFERER:
151*6236dae4SAndroid Build Coastguard Worker /* Return the referrer header for this request, or NULL if unset */
152*6236dae4SAndroid Build Coastguard Worker *param_charp = data->state.referer;
153*6236dae4SAndroid Build Coastguard Worker break;
154*6236dae4SAndroid Build Coastguard Worker case CURLINFO_PRIMARY_IP:
155*6236dae4SAndroid Build Coastguard Worker /* Return the ip address of the most recent (primary) connection */
156*6236dae4SAndroid Build Coastguard Worker *param_charp = data->info.primary.remote_ip;
157*6236dae4SAndroid Build Coastguard Worker break;
158*6236dae4SAndroid Build Coastguard Worker case CURLINFO_LOCAL_IP:
159*6236dae4SAndroid Build Coastguard Worker /* Return the source/local ip address of the most recent (primary)
160*6236dae4SAndroid Build Coastguard Worker connection */
161*6236dae4SAndroid Build Coastguard Worker *param_charp = data->info.primary.local_ip;
162*6236dae4SAndroid Build Coastguard Worker break;
163*6236dae4SAndroid Build Coastguard Worker case CURLINFO_RTSP_SESSION_ID:
164*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_RTSP
165*6236dae4SAndroid Build Coastguard Worker *param_charp = data->set.str[STRING_RTSP_SESSION_ID];
166*6236dae4SAndroid Build Coastguard Worker #else
167*6236dae4SAndroid Build Coastguard Worker *param_charp = NULL;
168*6236dae4SAndroid Build Coastguard Worker #endif
169*6236dae4SAndroid Build Coastguard Worker break;
170*6236dae4SAndroid Build Coastguard Worker case CURLINFO_SCHEME:
171*6236dae4SAndroid Build Coastguard Worker *param_charp = data->info.conn_scheme;
172*6236dae4SAndroid Build Coastguard Worker break;
173*6236dae4SAndroid Build Coastguard Worker case CURLINFO_CAPATH:
174*6236dae4SAndroid Build Coastguard Worker #ifdef CURL_CA_PATH
175*6236dae4SAndroid Build Coastguard Worker *param_charp = CURL_CA_PATH;
176*6236dae4SAndroid Build Coastguard Worker #else
177*6236dae4SAndroid Build Coastguard Worker *param_charp = NULL;
178*6236dae4SAndroid Build Coastguard Worker #endif
179*6236dae4SAndroid Build Coastguard Worker break;
180*6236dae4SAndroid Build Coastguard Worker case CURLINFO_CAINFO:
181*6236dae4SAndroid Build Coastguard Worker #ifdef CURL_CA_BUNDLE
182*6236dae4SAndroid Build Coastguard Worker *param_charp = CURL_CA_BUNDLE;
183*6236dae4SAndroid Build Coastguard Worker #else
184*6236dae4SAndroid Build Coastguard Worker *param_charp = NULL;
185*6236dae4SAndroid Build Coastguard Worker #endif
186*6236dae4SAndroid Build Coastguard Worker break;
187*6236dae4SAndroid Build Coastguard Worker default:
188*6236dae4SAndroid Build Coastguard Worker return CURLE_UNKNOWN_OPTION;
189*6236dae4SAndroid Build Coastguard Worker }
190*6236dae4SAndroid Build Coastguard Worker
191*6236dae4SAndroid Build Coastguard Worker return CURLE_OK;
192*6236dae4SAndroid Build Coastguard Worker }
193*6236dae4SAndroid Build Coastguard Worker
getinfo_long(struct Curl_easy * data,CURLINFO info,long * param_longp)194*6236dae4SAndroid Build Coastguard Worker static CURLcode getinfo_long(struct Curl_easy *data, CURLINFO info,
195*6236dae4SAndroid Build Coastguard Worker long *param_longp)
196*6236dae4SAndroid Build Coastguard Worker {
197*6236dae4SAndroid Build Coastguard Worker curl_socket_t sockfd;
198*6236dae4SAndroid Build Coastguard Worker
199*6236dae4SAndroid Build Coastguard Worker union {
200*6236dae4SAndroid Build Coastguard Worker unsigned long *to_ulong;
201*6236dae4SAndroid Build Coastguard Worker long *to_long;
202*6236dae4SAndroid Build Coastguard Worker } lptr;
203*6236dae4SAndroid Build Coastguard Worker
204*6236dae4SAndroid Build Coastguard Worker #ifdef DEBUGBUILD
205*6236dae4SAndroid Build Coastguard Worker char *timestr = getenv("CURL_TIME");
206*6236dae4SAndroid Build Coastguard Worker if(timestr) {
207*6236dae4SAndroid Build Coastguard Worker unsigned long val = strtoul(timestr, NULL, 10);
208*6236dae4SAndroid Build Coastguard Worker switch(info) {
209*6236dae4SAndroid Build Coastguard Worker case CURLINFO_LOCAL_PORT:
210*6236dae4SAndroid Build Coastguard Worker *param_longp = (long)val;
211*6236dae4SAndroid Build Coastguard Worker return CURLE_OK;
212*6236dae4SAndroid Build Coastguard Worker default:
213*6236dae4SAndroid Build Coastguard Worker break;
214*6236dae4SAndroid Build Coastguard Worker }
215*6236dae4SAndroid Build Coastguard Worker }
216*6236dae4SAndroid Build Coastguard Worker /* use another variable for this to allow different values */
217*6236dae4SAndroid Build Coastguard Worker timestr = getenv("CURL_DEBUG_SIZE");
218*6236dae4SAndroid Build Coastguard Worker if(timestr) {
219*6236dae4SAndroid Build Coastguard Worker unsigned long val = strtoul(timestr, NULL, 10);
220*6236dae4SAndroid Build Coastguard Worker switch(info) {
221*6236dae4SAndroid Build Coastguard Worker case CURLINFO_HEADER_SIZE:
222*6236dae4SAndroid Build Coastguard Worker case CURLINFO_REQUEST_SIZE:
223*6236dae4SAndroid Build Coastguard Worker *param_longp = (long)val;
224*6236dae4SAndroid Build Coastguard Worker return CURLE_OK;
225*6236dae4SAndroid Build Coastguard Worker default:
226*6236dae4SAndroid Build Coastguard Worker break;
227*6236dae4SAndroid Build Coastguard Worker }
228*6236dae4SAndroid Build Coastguard Worker }
229*6236dae4SAndroid Build Coastguard Worker #endif
230*6236dae4SAndroid Build Coastguard Worker
231*6236dae4SAndroid Build Coastguard Worker switch(info) {
232*6236dae4SAndroid Build Coastguard Worker case CURLINFO_RESPONSE_CODE:
233*6236dae4SAndroid Build Coastguard Worker *param_longp = data->info.httpcode;
234*6236dae4SAndroid Build Coastguard Worker break;
235*6236dae4SAndroid Build Coastguard Worker case CURLINFO_HTTP_CONNECTCODE:
236*6236dae4SAndroid Build Coastguard Worker *param_longp = data->info.httpproxycode;
237*6236dae4SAndroid Build Coastguard Worker break;
238*6236dae4SAndroid Build Coastguard Worker case CURLINFO_FILETIME:
239*6236dae4SAndroid Build Coastguard Worker if(data->info.filetime > LONG_MAX)
240*6236dae4SAndroid Build Coastguard Worker *param_longp = LONG_MAX;
241*6236dae4SAndroid Build Coastguard Worker else if(data->info.filetime < LONG_MIN)
242*6236dae4SAndroid Build Coastguard Worker *param_longp = LONG_MIN;
243*6236dae4SAndroid Build Coastguard Worker else
244*6236dae4SAndroid Build Coastguard Worker *param_longp = (long)data->info.filetime;
245*6236dae4SAndroid Build Coastguard Worker break;
246*6236dae4SAndroid Build Coastguard Worker case CURLINFO_HEADER_SIZE:
247*6236dae4SAndroid Build Coastguard Worker *param_longp = (long)data->info.header_size;
248*6236dae4SAndroid Build Coastguard Worker break;
249*6236dae4SAndroid Build Coastguard Worker case CURLINFO_REQUEST_SIZE:
250*6236dae4SAndroid Build Coastguard Worker *param_longp = (long)data->info.request_size;
251*6236dae4SAndroid Build Coastguard Worker break;
252*6236dae4SAndroid Build Coastguard Worker case CURLINFO_SSL_VERIFYRESULT:
253*6236dae4SAndroid Build Coastguard Worker *param_longp = data->set.ssl.certverifyresult;
254*6236dae4SAndroid Build Coastguard Worker break;
255*6236dae4SAndroid Build Coastguard Worker case CURLINFO_PROXY_SSL_VERIFYRESULT:
256*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_PROXY
257*6236dae4SAndroid Build Coastguard Worker *param_longp = data->set.proxy_ssl.certverifyresult;
258*6236dae4SAndroid Build Coastguard Worker #else
259*6236dae4SAndroid Build Coastguard Worker *param_longp = 0;
260*6236dae4SAndroid Build Coastguard Worker #endif
261*6236dae4SAndroid Build Coastguard Worker break;
262*6236dae4SAndroid Build Coastguard Worker case CURLINFO_REDIRECT_COUNT:
263*6236dae4SAndroid Build Coastguard Worker *param_longp = data->state.followlocation;
264*6236dae4SAndroid Build Coastguard Worker break;
265*6236dae4SAndroid Build Coastguard Worker case CURLINFO_HTTPAUTH_AVAIL:
266*6236dae4SAndroid Build Coastguard Worker lptr.to_long = param_longp;
267*6236dae4SAndroid Build Coastguard Worker *lptr.to_ulong = data->info.httpauthavail;
268*6236dae4SAndroid Build Coastguard Worker break;
269*6236dae4SAndroid Build Coastguard Worker case CURLINFO_PROXYAUTH_AVAIL:
270*6236dae4SAndroid Build Coastguard Worker lptr.to_long = param_longp;
271*6236dae4SAndroid Build Coastguard Worker *lptr.to_ulong = data->info.proxyauthavail;
272*6236dae4SAndroid Build Coastguard Worker break;
273*6236dae4SAndroid Build Coastguard Worker case CURLINFO_OS_ERRNO:
274*6236dae4SAndroid Build Coastguard Worker *param_longp = data->state.os_errno;
275*6236dae4SAndroid Build Coastguard Worker break;
276*6236dae4SAndroid Build Coastguard Worker case CURLINFO_NUM_CONNECTS:
277*6236dae4SAndroid Build Coastguard Worker *param_longp = data->info.numconnects;
278*6236dae4SAndroid Build Coastguard Worker break;
279*6236dae4SAndroid Build Coastguard Worker case CURLINFO_LASTSOCKET:
280*6236dae4SAndroid Build Coastguard Worker sockfd = Curl_getconnectinfo(data, NULL);
281*6236dae4SAndroid Build Coastguard Worker
282*6236dae4SAndroid Build Coastguard Worker /* note: this is not a good conversion for systems with 64-bit sockets and
283*6236dae4SAndroid Build Coastguard Worker 32-bit longs */
284*6236dae4SAndroid Build Coastguard Worker if(sockfd != CURL_SOCKET_BAD)
285*6236dae4SAndroid Build Coastguard Worker *param_longp = (long)sockfd;
286*6236dae4SAndroid Build Coastguard Worker else
287*6236dae4SAndroid Build Coastguard Worker /* this interface is documented to return -1 in case of badness, which
288*6236dae4SAndroid Build Coastguard Worker may not be the same as the CURL_SOCKET_BAD value */
289*6236dae4SAndroid Build Coastguard Worker *param_longp = -1;
290*6236dae4SAndroid Build Coastguard Worker break;
291*6236dae4SAndroid Build Coastguard Worker case CURLINFO_PRIMARY_PORT:
292*6236dae4SAndroid Build Coastguard Worker /* Return the (remote) port of the most recent (primary) connection */
293*6236dae4SAndroid Build Coastguard Worker *param_longp = data->info.primary.remote_port;
294*6236dae4SAndroid Build Coastguard Worker break;
295*6236dae4SAndroid Build Coastguard Worker case CURLINFO_LOCAL_PORT:
296*6236dae4SAndroid Build Coastguard Worker /* Return the local port of the most recent (primary) connection */
297*6236dae4SAndroid Build Coastguard Worker *param_longp = data->info.primary.local_port;
298*6236dae4SAndroid Build Coastguard Worker break;
299*6236dae4SAndroid Build Coastguard Worker case CURLINFO_PROXY_ERROR:
300*6236dae4SAndroid Build Coastguard Worker *param_longp = (long)data->info.pxcode;
301*6236dae4SAndroid Build Coastguard Worker break;
302*6236dae4SAndroid Build Coastguard Worker case CURLINFO_CONDITION_UNMET:
303*6236dae4SAndroid Build Coastguard Worker if(data->info.httpcode == 304)
304*6236dae4SAndroid Build Coastguard Worker *param_longp = 1L;
305*6236dae4SAndroid Build Coastguard Worker else
306*6236dae4SAndroid Build Coastguard Worker /* return if the condition prevented the document to get transferred */
307*6236dae4SAndroid Build Coastguard Worker *param_longp = data->info.timecond ? 1L : 0L;
308*6236dae4SAndroid Build Coastguard Worker break;
309*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_RTSP
310*6236dae4SAndroid Build Coastguard Worker case CURLINFO_RTSP_CLIENT_CSEQ:
311*6236dae4SAndroid Build Coastguard Worker *param_longp = data->state.rtsp_next_client_CSeq;
312*6236dae4SAndroid Build Coastguard Worker break;
313*6236dae4SAndroid Build Coastguard Worker case CURLINFO_RTSP_SERVER_CSEQ:
314*6236dae4SAndroid Build Coastguard Worker *param_longp = data->state.rtsp_next_server_CSeq;
315*6236dae4SAndroid Build Coastguard Worker break;
316*6236dae4SAndroid Build Coastguard Worker case CURLINFO_RTSP_CSEQ_RECV:
317*6236dae4SAndroid Build Coastguard Worker *param_longp = data->state.rtsp_CSeq_recv;
318*6236dae4SAndroid Build Coastguard Worker break;
319*6236dae4SAndroid Build Coastguard Worker #else
320*6236dae4SAndroid Build Coastguard Worker case CURLINFO_RTSP_CLIENT_CSEQ:
321*6236dae4SAndroid Build Coastguard Worker case CURLINFO_RTSP_SERVER_CSEQ:
322*6236dae4SAndroid Build Coastguard Worker case CURLINFO_RTSP_CSEQ_RECV:
323*6236dae4SAndroid Build Coastguard Worker *param_longp = 0;
324*6236dae4SAndroid Build Coastguard Worker break;
325*6236dae4SAndroid Build Coastguard Worker #endif
326*6236dae4SAndroid Build Coastguard Worker case CURLINFO_HTTP_VERSION:
327*6236dae4SAndroid Build Coastguard Worker switch(data->info.httpversion) {
328*6236dae4SAndroid Build Coastguard Worker case 10:
329*6236dae4SAndroid Build Coastguard Worker *param_longp = CURL_HTTP_VERSION_1_0;
330*6236dae4SAndroid Build Coastguard Worker break;
331*6236dae4SAndroid Build Coastguard Worker case 11:
332*6236dae4SAndroid Build Coastguard Worker *param_longp = CURL_HTTP_VERSION_1_1;
333*6236dae4SAndroid Build Coastguard Worker break;
334*6236dae4SAndroid Build Coastguard Worker case 20:
335*6236dae4SAndroid Build Coastguard Worker *param_longp = CURL_HTTP_VERSION_2_0;
336*6236dae4SAndroid Build Coastguard Worker break;
337*6236dae4SAndroid Build Coastguard Worker case 30:
338*6236dae4SAndroid Build Coastguard Worker *param_longp = CURL_HTTP_VERSION_3;
339*6236dae4SAndroid Build Coastguard Worker break;
340*6236dae4SAndroid Build Coastguard Worker default:
341*6236dae4SAndroid Build Coastguard Worker *param_longp = CURL_HTTP_VERSION_NONE;
342*6236dae4SAndroid Build Coastguard Worker break;
343*6236dae4SAndroid Build Coastguard Worker }
344*6236dae4SAndroid Build Coastguard Worker break;
345*6236dae4SAndroid Build Coastguard Worker case CURLINFO_PROTOCOL:
346*6236dae4SAndroid Build Coastguard Worker *param_longp = (long)data->info.conn_protocol;
347*6236dae4SAndroid Build Coastguard Worker break;
348*6236dae4SAndroid Build Coastguard Worker case CURLINFO_USED_PROXY:
349*6236dae4SAndroid Build Coastguard Worker *param_longp =
350*6236dae4SAndroid Build Coastguard Worker #ifdef CURL_DISABLE_PROXY
351*6236dae4SAndroid Build Coastguard Worker 0
352*6236dae4SAndroid Build Coastguard Worker #else
353*6236dae4SAndroid Build Coastguard Worker data->info.used_proxy
354*6236dae4SAndroid Build Coastguard Worker #endif
355*6236dae4SAndroid Build Coastguard Worker ;
356*6236dae4SAndroid Build Coastguard Worker break;
357*6236dae4SAndroid Build Coastguard Worker default:
358*6236dae4SAndroid Build Coastguard Worker return CURLE_UNKNOWN_OPTION;
359*6236dae4SAndroid Build Coastguard Worker }
360*6236dae4SAndroid Build Coastguard Worker
361*6236dae4SAndroid Build Coastguard Worker return CURLE_OK;
362*6236dae4SAndroid Build Coastguard Worker }
363*6236dae4SAndroid Build Coastguard Worker
364*6236dae4SAndroid Build Coastguard Worker #define DOUBLE_SECS(x) (double)(x)/1000000
365*6236dae4SAndroid Build Coastguard Worker
getinfo_offt(struct Curl_easy * data,CURLINFO info,curl_off_t * param_offt)366*6236dae4SAndroid Build Coastguard Worker static CURLcode getinfo_offt(struct Curl_easy *data, CURLINFO info,
367*6236dae4SAndroid Build Coastguard Worker curl_off_t *param_offt)
368*6236dae4SAndroid Build Coastguard Worker {
369*6236dae4SAndroid Build Coastguard Worker #ifdef DEBUGBUILD
370*6236dae4SAndroid Build Coastguard Worker char *timestr = getenv("CURL_TIME");
371*6236dae4SAndroid Build Coastguard Worker if(timestr) {
372*6236dae4SAndroid Build Coastguard Worker unsigned long val = strtoul(timestr, NULL, 10);
373*6236dae4SAndroid Build Coastguard Worker switch(info) {
374*6236dae4SAndroid Build Coastguard Worker case CURLINFO_TOTAL_TIME_T:
375*6236dae4SAndroid Build Coastguard Worker case CURLINFO_NAMELOOKUP_TIME_T:
376*6236dae4SAndroid Build Coastguard Worker case CURLINFO_CONNECT_TIME_T:
377*6236dae4SAndroid Build Coastguard Worker case CURLINFO_APPCONNECT_TIME_T:
378*6236dae4SAndroid Build Coastguard Worker case CURLINFO_PRETRANSFER_TIME_T:
379*6236dae4SAndroid Build Coastguard Worker case CURLINFO_POSTTRANSFER_TIME_T:
380*6236dae4SAndroid Build Coastguard Worker case CURLINFO_STARTTRANSFER_TIME_T:
381*6236dae4SAndroid Build Coastguard Worker case CURLINFO_REDIRECT_TIME_T:
382*6236dae4SAndroid Build Coastguard Worker case CURLINFO_SPEED_DOWNLOAD_T:
383*6236dae4SAndroid Build Coastguard Worker case CURLINFO_SPEED_UPLOAD_T:
384*6236dae4SAndroid Build Coastguard Worker *param_offt = (curl_off_t)val;
385*6236dae4SAndroid Build Coastguard Worker return CURLE_OK;
386*6236dae4SAndroid Build Coastguard Worker default:
387*6236dae4SAndroid Build Coastguard Worker break;
388*6236dae4SAndroid Build Coastguard Worker }
389*6236dae4SAndroid Build Coastguard Worker }
390*6236dae4SAndroid Build Coastguard Worker #endif
391*6236dae4SAndroid Build Coastguard Worker switch(info) {
392*6236dae4SAndroid Build Coastguard Worker case CURLINFO_FILETIME_T:
393*6236dae4SAndroid Build Coastguard Worker *param_offt = (curl_off_t)data->info.filetime;
394*6236dae4SAndroid Build Coastguard Worker break;
395*6236dae4SAndroid Build Coastguard Worker case CURLINFO_SIZE_UPLOAD_T:
396*6236dae4SAndroid Build Coastguard Worker *param_offt = data->progress.ul.cur_size;
397*6236dae4SAndroid Build Coastguard Worker break;
398*6236dae4SAndroid Build Coastguard Worker case CURLINFO_SIZE_DOWNLOAD_T:
399*6236dae4SAndroid Build Coastguard Worker *param_offt = data->progress.dl.cur_size;
400*6236dae4SAndroid Build Coastguard Worker break;
401*6236dae4SAndroid Build Coastguard Worker case CURLINFO_SPEED_DOWNLOAD_T:
402*6236dae4SAndroid Build Coastguard Worker *param_offt = data->progress.dl.speed;
403*6236dae4SAndroid Build Coastguard Worker break;
404*6236dae4SAndroid Build Coastguard Worker case CURLINFO_SPEED_UPLOAD_T:
405*6236dae4SAndroid Build Coastguard Worker *param_offt = data->progress.ul.speed;
406*6236dae4SAndroid Build Coastguard Worker break;
407*6236dae4SAndroid Build Coastguard Worker case CURLINFO_CONTENT_LENGTH_DOWNLOAD_T:
408*6236dae4SAndroid Build Coastguard Worker *param_offt = (data->progress.flags & PGRS_DL_SIZE_KNOWN) ?
409*6236dae4SAndroid Build Coastguard Worker data->progress.dl.total_size : -1;
410*6236dae4SAndroid Build Coastguard Worker break;
411*6236dae4SAndroid Build Coastguard Worker case CURLINFO_CONTENT_LENGTH_UPLOAD_T:
412*6236dae4SAndroid Build Coastguard Worker *param_offt = (data->progress.flags & PGRS_UL_SIZE_KNOWN) ?
413*6236dae4SAndroid Build Coastguard Worker data->progress.ul.total_size : -1;
414*6236dae4SAndroid Build Coastguard Worker break;
415*6236dae4SAndroid Build Coastguard Worker case CURLINFO_TOTAL_TIME_T:
416*6236dae4SAndroid Build Coastguard Worker *param_offt = data->progress.timespent;
417*6236dae4SAndroid Build Coastguard Worker break;
418*6236dae4SAndroid Build Coastguard Worker case CURLINFO_NAMELOOKUP_TIME_T:
419*6236dae4SAndroid Build Coastguard Worker *param_offt = data->progress.t_nslookup;
420*6236dae4SAndroid Build Coastguard Worker break;
421*6236dae4SAndroid Build Coastguard Worker case CURLINFO_CONNECT_TIME_T:
422*6236dae4SAndroid Build Coastguard Worker *param_offt = data->progress.t_connect;
423*6236dae4SAndroid Build Coastguard Worker break;
424*6236dae4SAndroid Build Coastguard Worker case CURLINFO_APPCONNECT_TIME_T:
425*6236dae4SAndroid Build Coastguard Worker *param_offt = data->progress.t_appconnect;
426*6236dae4SAndroid Build Coastguard Worker break;
427*6236dae4SAndroid Build Coastguard Worker case CURLINFO_PRETRANSFER_TIME_T:
428*6236dae4SAndroid Build Coastguard Worker *param_offt = data->progress.t_pretransfer;
429*6236dae4SAndroid Build Coastguard Worker break;
430*6236dae4SAndroid Build Coastguard Worker case CURLINFO_POSTTRANSFER_TIME_T:
431*6236dae4SAndroid Build Coastguard Worker *param_offt = data->progress.t_posttransfer;
432*6236dae4SAndroid Build Coastguard Worker break;
433*6236dae4SAndroid Build Coastguard Worker case CURLINFO_STARTTRANSFER_TIME_T:
434*6236dae4SAndroid Build Coastguard Worker *param_offt = data->progress.t_starttransfer;
435*6236dae4SAndroid Build Coastguard Worker break;
436*6236dae4SAndroid Build Coastguard Worker case CURLINFO_QUEUE_TIME_T:
437*6236dae4SAndroid Build Coastguard Worker *param_offt = data->progress.t_postqueue;
438*6236dae4SAndroid Build Coastguard Worker break;
439*6236dae4SAndroid Build Coastguard Worker case CURLINFO_REDIRECT_TIME_T:
440*6236dae4SAndroid Build Coastguard Worker *param_offt = data->progress.t_redirect;
441*6236dae4SAndroid Build Coastguard Worker break;
442*6236dae4SAndroid Build Coastguard Worker case CURLINFO_RETRY_AFTER:
443*6236dae4SAndroid Build Coastguard Worker *param_offt = data->info.retry_after;
444*6236dae4SAndroid Build Coastguard Worker break;
445*6236dae4SAndroid Build Coastguard Worker case CURLINFO_XFER_ID:
446*6236dae4SAndroid Build Coastguard Worker *param_offt = data->id;
447*6236dae4SAndroid Build Coastguard Worker break;
448*6236dae4SAndroid Build Coastguard Worker case CURLINFO_CONN_ID:
449*6236dae4SAndroid Build Coastguard Worker *param_offt = data->conn ?
450*6236dae4SAndroid Build Coastguard Worker data->conn->connection_id : data->state.recent_conn_id;
451*6236dae4SAndroid Build Coastguard Worker break;
452*6236dae4SAndroid Build Coastguard Worker case CURLINFO_EARLYDATA_SENT_T:
453*6236dae4SAndroid Build Coastguard Worker *param_offt = data->progress.earlydata_sent;
454*6236dae4SAndroid Build Coastguard Worker break;
455*6236dae4SAndroid Build Coastguard Worker default:
456*6236dae4SAndroid Build Coastguard Worker return CURLE_UNKNOWN_OPTION;
457*6236dae4SAndroid Build Coastguard Worker }
458*6236dae4SAndroid Build Coastguard Worker
459*6236dae4SAndroid Build Coastguard Worker return CURLE_OK;
460*6236dae4SAndroid Build Coastguard Worker }
461*6236dae4SAndroid Build Coastguard Worker
getinfo_double(struct Curl_easy * data,CURLINFO info,double * param_doublep)462*6236dae4SAndroid Build Coastguard Worker static CURLcode getinfo_double(struct Curl_easy *data, CURLINFO info,
463*6236dae4SAndroid Build Coastguard Worker double *param_doublep)
464*6236dae4SAndroid Build Coastguard Worker {
465*6236dae4SAndroid Build Coastguard Worker #ifdef DEBUGBUILD
466*6236dae4SAndroid Build Coastguard Worker char *timestr = getenv("CURL_TIME");
467*6236dae4SAndroid Build Coastguard Worker if(timestr) {
468*6236dae4SAndroid Build Coastguard Worker unsigned long val = strtoul(timestr, NULL, 10);
469*6236dae4SAndroid Build Coastguard Worker switch(info) {
470*6236dae4SAndroid Build Coastguard Worker case CURLINFO_TOTAL_TIME:
471*6236dae4SAndroid Build Coastguard Worker case CURLINFO_NAMELOOKUP_TIME:
472*6236dae4SAndroid Build Coastguard Worker case CURLINFO_CONNECT_TIME:
473*6236dae4SAndroid Build Coastguard Worker case CURLINFO_APPCONNECT_TIME:
474*6236dae4SAndroid Build Coastguard Worker case CURLINFO_PRETRANSFER_TIME:
475*6236dae4SAndroid Build Coastguard Worker case CURLINFO_STARTTRANSFER_TIME:
476*6236dae4SAndroid Build Coastguard Worker case CURLINFO_REDIRECT_TIME:
477*6236dae4SAndroid Build Coastguard Worker case CURLINFO_SPEED_DOWNLOAD:
478*6236dae4SAndroid Build Coastguard Worker case CURLINFO_SPEED_UPLOAD:
479*6236dae4SAndroid Build Coastguard Worker *param_doublep = (double)val;
480*6236dae4SAndroid Build Coastguard Worker return CURLE_OK;
481*6236dae4SAndroid Build Coastguard Worker default:
482*6236dae4SAndroid Build Coastguard Worker break;
483*6236dae4SAndroid Build Coastguard Worker }
484*6236dae4SAndroid Build Coastguard Worker }
485*6236dae4SAndroid Build Coastguard Worker #endif
486*6236dae4SAndroid Build Coastguard Worker switch(info) {
487*6236dae4SAndroid Build Coastguard Worker case CURLINFO_TOTAL_TIME:
488*6236dae4SAndroid Build Coastguard Worker *param_doublep = DOUBLE_SECS(data->progress.timespent);
489*6236dae4SAndroid Build Coastguard Worker break;
490*6236dae4SAndroid Build Coastguard Worker case CURLINFO_NAMELOOKUP_TIME:
491*6236dae4SAndroid Build Coastguard Worker *param_doublep = DOUBLE_SECS(data->progress.t_nslookup);
492*6236dae4SAndroid Build Coastguard Worker break;
493*6236dae4SAndroid Build Coastguard Worker case CURLINFO_CONNECT_TIME:
494*6236dae4SAndroid Build Coastguard Worker *param_doublep = DOUBLE_SECS(data->progress.t_connect);
495*6236dae4SAndroid Build Coastguard Worker break;
496*6236dae4SAndroid Build Coastguard Worker case CURLINFO_APPCONNECT_TIME:
497*6236dae4SAndroid Build Coastguard Worker *param_doublep = DOUBLE_SECS(data->progress.t_appconnect);
498*6236dae4SAndroid Build Coastguard Worker break;
499*6236dae4SAndroid Build Coastguard Worker case CURLINFO_PRETRANSFER_TIME:
500*6236dae4SAndroid Build Coastguard Worker *param_doublep = DOUBLE_SECS(data->progress.t_pretransfer);
501*6236dae4SAndroid Build Coastguard Worker break;
502*6236dae4SAndroid Build Coastguard Worker case CURLINFO_STARTTRANSFER_TIME:
503*6236dae4SAndroid Build Coastguard Worker *param_doublep = DOUBLE_SECS(data->progress.t_starttransfer);
504*6236dae4SAndroid Build Coastguard Worker break;
505*6236dae4SAndroid Build Coastguard Worker case CURLINFO_SIZE_UPLOAD:
506*6236dae4SAndroid Build Coastguard Worker *param_doublep = (double)data->progress.ul.cur_size;
507*6236dae4SAndroid Build Coastguard Worker break;
508*6236dae4SAndroid Build Coastguard Worker case CURLINFO_SIZE_DOWNLOAD:
509*6236dae4SAndroid Build Coastguard Worker *param_doublep = (double)data->progress.dl.cur_size;
510*6236dae4SAndroid Build Coastguard Worker break;
511*6236dae4SAndroid Build Coastguard Worker case CURLINFO_SPEED_DOWNLOAD:
512*6236dae4SAndroid Build Coastguard Worker *param_doublep = (double)data->progress.dl.speed;
513*6236dae4SAndroid Build Coastguard Worker break;
514*6236dae4SAndroid Build Coastguard Worker case CURLINFO_SPEED_UPLOAD:
515*6236dae4SAndroid Build Coastguard Worker *param_doublep = (double)data->progress.ul.speed;
516*6236dae4SAndroid Build Coastguard Worker break;
517*6236dae4SAndroid Build Coastguard Worker case CURLINFO_CONTENT_LENGTH_DOWNLOAD:
518*6236dae4SAndroid Build Coastguard Worker *param_doublep = (data->progress.flags & PGRS_DL_SIZE_KNOWN) ?
519*6236dae4SAndroid Build Coastguard Worker (double)data->progress.dl.total_size : -1;
520*6236dae4SAndroid Build Coastguard Worker break;
521*6236dae4SAndroid Build Coastguard Worker case CURLINFO_CONTENT_LENGTH_UPLOAD:
522*6236dae4SAndroid Build Coastguard Worker *param_doublep = (data->progress.flags & PGRS_UL_SIZE_KNOWN) ?
523*6236dae4SAndroid Build Coastguard Worker (double)data->progress.ul.total_size : -1;
524*6236dae4SAndroid Build Coastguard Worker break;
525*6236dae4SAndroid Build Coastguard Worker case CURLINFO_REDIRECT_TIME:
526*6236dae4SAndroid Build Coastguard Worker *param_doublep = DOUBLE_SECS(data->progress.t_redirect);
527*6236dae4SAndroid Build Coastguard Worker break;
528*6236dae4SAndroid Build Coastguard Worker
529*6236dae4SAndroid Build Coastguard Worker default:
530*6236dae4SAndroid Build Coastguard Worker return CURLE_UNKNOWN_OPTION;
531*6236dae4SAndroid Build Coastguard Worker }
532*6236dae4SAndroid Build Coastguard Worker
533*6236dae4SAndroid Build Coastguard Worker return CURLE_OK;
534*6236dae4SAndroid Build Coastguard Worker }
535*6236dae4SAndroid Build Coastguard Worker
getinfo_slist(struct Curl_easy * data,CURLINFO info,struct curl_slist ** param_slistp)536*6236dae4SAndroid Build Coastguard Worker static CURLcode getinfo_slist(struct Curl_easy *data, CURLINFO info,
537*6236dae4SAndroid Build Coastguard Worker struct curl_slist **param_slistp)
538*6236dae4SAndroid Build Coastguard Worker {
539*6236dae4SAndroid Build Coastguard Worker union {
540*6236dae4SAndroid Build Coastguard Worker struct curl_certinfo *to_certinfo;
541*6236dae4SAndroid Build Coastguard Worker struct curl_slist *to_slist;
542*6236dae4SAndroid Build Coastguard Worker } ptr;
543*6236dae4SAndroid Build Coastguard Worker
544*6236dae4SAndroid Build Coastguard Worker switch(info) {
545*6236dae4SAndroid Build Coastguard Worker case CURLINFO_SSL_ENGINES:
546*6236dae4SAndroid Build Coastguard Worker *param_slistp = Curl_ssl_engines_list(data);
547*6236dae4SAndroid Build Coastguard Worker break;
548*6236dae4SAndroid Build Coastguard Worker case CURLINFO_COOKIELIST:
549*6236dae4SAndroid Build Coastguard Worker *param_slistp = Curl_cookie_list(data);
550*6236dae4SAndroid Build Coastguard Worker break;
551*6236dae4SAndroid Build Coastguard Worker case CURLINFO_CERTINFO:
552*6236dae4SAndroid Build Coastguard Worker /* Return the a pointer to the certinfo struct. Not really an slist
553*6236dae4SAndroid Build Coastguard Worker pointer but we can pretend it is here */
554*6236dae4SAndroid Build Coastguard Worker ptr.to_certinfo = &data->info.certs;
555*6236dae4SAndroid Build Coastguard Worker *param_slistp = ptr.to_slist;
556*6236dae4SAndroid Build Coastguard Worker break;
557*6236dae4SAndroid Build Coastguard Worker case CURLINFO_TLS_SESSION:
558*6236dae4SAndroid Build Coastguard Worker case CURLINFO_TLS_SSL_PTR:
559*6236dae4SAndroid Build Coastguard Worker {
560*6236dae4SAndroid Build Coastguard Worker struct curl_tlssessioninfo **tsip = (struct curl_tlssessioninfo **)
561*6236dae4SAndroid Build Coastguard Worker param_slistp;
562*6236dae4SAndroid Build Coastguard Worker struct curl_tlssessioninfo *tsi = &data->tsi;
563*6236dae4SAndroid Build Coastguard Worker #ifdef USE_SSL
564*6236dae4SAndroid Build Coastguard Worker struct connectdata *conn = data->conn;
565*6236dae4SAndroid Build Coastguard Worker #endif
566*6236dae4SAndroid Build Coastguard Worker
567*6236dae4SAndroid Build Coastguard Worker *tsip = tsi;
568*6236dae4SAndroid Build Coastguard Worker tsi->backend = Curl_ssl_backend();
569*6236dae4SAndroid Build Coastguard Worker tsi->internals = NULL;
570*6236dae4SAndroid Build Coastguard Worker
571*6236dae4SAndroid Build Coastguard Worker #ifdef USE_SSL
572*6236dae4SAndroid Build Coastguard Worker if(conn && tsi->backend != CURLSSLBACKEND_NONE) {
573*6236dae4SAndroid Build Coastguard Worker tsi->internals = Curl_ssl_get_internals(data, FIRSTSOCKET, info, 0);
574*6236dae4SAndroid Build Coastguard Worker }
575*6236dae4SAndroid Build Coastguard Worker #endif
576*6236dae4SAndroid Build Coastguard Worker }
577*6236dae4SAndroid Build Coastguard Worker break;
578*6236dae4SAndroid Build Coastguard Worker default:
579*6236dae4SAndroid Build Coastguard Worker return CURLE_UNKNOWN_OPTION;
580*6236dae4SAndroid Build Coastguard Worker }
581*6236dae4SAndroid Build Coastguard Worker
582*6236dae4SAndroid Build Coastguard Worker return CURLE_OK;
583*6236dae4SAndroid Build Coastguard Worker }
584*6236dae4SAndroid Build Coastguard Worker
getinfo_socket(struct Curl_easy * data,CURLINFO info,curl_socket_t * param_socketp)585*6236dae4SAndroid Build Coastguard Worker static CURLcode getinfo_socket(struct Curl_easy *data, CURLINFO info,
586*6236dae4SAndroid Build Coastguard Worker curl_socket_t *param_socketp)
587*6236dae4SAndroid Build Coastguard Worker {
588*6236dae4SAndroid Build Coastguard Worker switch(info) {
589*6236dae4SAndroid Build Coastguard Worker case CURLINFO_ACTIVESOCKET:
590*6236dae4SAndroid Build Coastguard Worker *param_socketp = Curl_getconnectinfo(data, NULL);
591*6236dae4SAndroid Build Coastguard Worker break;
592*6236dae4SAndroid Build Coastguard Worker default:
593*6236dae4SAndroid Build Coastguard Worker return CURLE_UNKNOWN_OPTION;
594*6236dae4SAndroid Build Coastguard Worker }
595*6236dae4SAndroid Build Coastguard Worker
596*6236dae4SAndroid Build Coastguard Worker return CURLE_OK;
597*6236dae4SAndroid Build Coastguard Worker }
598*6236dae4SAndroid Build Coastguard Worker
Curl_getinfo(struct Curl_easy * data,CURLINFO info,...)599*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_getinfo(struct Curl_easy *data, CURLINFO info, ...)
600*6236dae4SAndroid Build Coastguard Worker {
601*6236dae4SAndroid Build Coastguard Worker va_list arg;
602*6236dae4SAndroid Build Coastguard Worker long *param_longp = NULL;
603*6236dae4SAndroid Build Coastguard Worker double *param_doublep = NULL;
604*6236dae4SAndroid Build Coastguard Worker curl_off_t *param_offt = NULL;
605*6236dae4SAndroid Build Coastguard Worker const char **param_charp = NULL;
606*6236dae4SAndroid Build Coastguard Worker struct curl_slist **param_slistp = NULL;
607*6236dae4SAndroid Build Coastguard Worker curl_socket_t *param_socketp = NULL;
608*6236dae4SAndroid Build Coastguard Worker int type;
609*6236dae4SAndroid Build Coastguard Worker CURLcode result = CURLE_UNKNOWN_OPTION;
610*6236dae4SAndroid Build Coastguard Worker
611*6236dae4SAndroid Build Coastguard Worker if(!data)
612*6236dae4SAndroid Build Coastguard Worker return CURLE_BAD_FUNCTION_ARGUMENT;
613*6236dae4SAndroid Build Coastguard Worker
614*6236dae4SAndroid Build Coastguard Worker va_start(arg, info);
615*6236dae4SAndroid Build Coastguard Worker
616*6236dae4SAndroid Build Coastguard Worker type = CURLINFO_TYPEMASK & (int)info;
617*6236dae4SAndroid Build Coastguard Worker switch(type) {
618*6236dae4SAndroid Build Coastguard Worker case CURLINFO_STRING:
619*6236dae4SAndroid Build Coastguard Worker param_charp = va_arg(arg, const char **);
620*6236dae4SAndroid Build Coastguard Worker if(param_charp)
621*6236dae4SAndroid Build Coastguard Worker result = getinfo_char(data, info, param_charp);
622*6236dae4SAndroid Build Coastguard Worker break;
623*6236dae4SAndroid Build Coastguard Worker case CURLINFO_LONG:
624*6236dae4SAndroid Build Coastguard Worker param_longp = va_arg(arg, long *);
625*6236dae4SAndroid Build Coastguard Worker if(param_longp)
626*6236dae4SAndroid Build Coastguard Worker result = getinfo_long(data, info, param_longp);
627*6236dae4SAndroid Build Coastguard Worker break;
628*6236dae4SAndroid Build Coastguard Worker case CURLINFO_DOUBLE:
629*6236dae4SAndroid Build Coastguard Worker param_doublep = va_arg(arg, double *);
630*6236dae4SAndroid Build Coastguard Worker if(param_doublep)
631*6236dae4SAndroid Build Coastguard Worker result = getinfo_double(data, info, param_doublep);
632*6236dae4SAndroid Build Coastguard Worker break;
633*6236dae4SAndroid Build Coastguard Worker case CURLINFO_OFF_T:
634*6236dae4SAndroid Build Coastguard Worker param_offt = va_arg(arg, curl_off_t *);
635*6236dae4SAndroid Build Coastguard Worker if(param_offt)
636*6236dae4SAndroid Build Coastguard Worker result = getinfo_offt(data, info, param_offt);
637*6236dae4SAndroid Build Coastguard Worker break;
638*6236dae4SAndroid Build Coastguard Worker case CURLINFO_SLIST:
639*6236dae4SAndroid Build Coastguard Worker param_slistp = va_arg(arg, struct curl_slist **);
640*6236dae4SAndroid Build Coastguard Worker if(param_slistp)
641*6236dae4SAndroid Build Coastguard Worker result = getinfo_slist(data, info, param_slistp);
642*6236dae4SAndroid Build Coastguard Worker break;
643*6236dae4SAndroid Build Coastguard Worker case CURLINFO_SOCKET:
644*6236dae4SAndroid Build Coastguard Worker param_socketp = va_arg(arg, curl_socket_t *);
645*6236dae4SAndroid Build Coastguard Worker if(param_socketp)
646*6236dae4SAndroid Build Coastguard Worker result = getinfo_socket(data, info, param_socketp);
647*6236dae4SAndroid Build Coastguard Worker break;
648*6236dae4SAndroid Build Coastguard Worker default:
649*6236dae4SAndroid Build Coastguard Worker break;
650*6236dae4SAndroid Build Coastguard Worker }
651*6236dae4SAndroid Build Coastguard Worker
652*6236dae4SAndroid Build Coastguard Worker va_end(arg);
653*6236dae4SAndroid Build Coastguard Worker
654*6236dae4SAndroid Build Coastguard Worker return result;
655*6236dae4SAndroid Build Coastguard Worker }
656