mirror of
https://github.com/moparisthebest/curl
synced 2024-12-21 23:58:49 -05:00
Split up Curl_getinfo
This avoids false positives from clang's scan-build.
This commit is contained in:
parent
6e3802a2cf
commit
1a74e54e8b
298
lib/getinfo.c
298
lib/getinfo.c
@ -72,61 +72,62 @@ CURLcode Curl_initinfo(struct SessionHandle *data)
|
|||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
|
static CURLcode Curl_getinfo_char(struct SessionHandle *data, CURLINFO info,
|
||||||
|
char **param_charp)
|
||||||
{
|
{
|
||||||
va_list arg;
|
switch(info) {
|
||||||
long *param_longp=NULL;
|
case CURLINFO_EFFECTIVE_URL:
|
||||||
double *param_doublep=NULL;
|
*param_charp = data->change.url?data->change.url:(char *)"";
|
||||||
char **param_charp=NULL;
|
break;
|
||||||
struct curl_slist **param_slistp=NULL;
|
case CURLINFO_CONTENT_TYPE:
|
||||||
int type;
|
*param_charp = data->info.contenttype;
|
||||||
curl_socket_t sockfd;
|
break;
|
||||||
|
case CURLINFO_PRIVATE:
|
||||||
|
*param_charp = (char *) data->set.private_data;
|
||||||
|
break;
|
||||||
|
case CURLINFO_FTP_ENTRY_PATH:
|
||||||
|
/* Return the entrypath string from the most recent connection.
|
||||||
|
This pointer was copied from the connectdata structure by FTP.
|
||||||
|
The actual string may be free()ed by subsequent libcurl calls so
|
||||||
|
it must be copied to a safer area before the next libcurl call.
|
||||||
|
Callers must never free it themselves. */
|
||||||
|
*param_charp = data->state.most_recent_ftp_entrypath;
|
||||||
|
break;
|
||||||
|
case CURLINFO_REDIRECT_URL:
|
||||||
|
/* Return the URL this request would have been redirected to if that
|
||||||
|
option had been enabled! */
|
||||||
|
*param_charp = data->info.wouldredirect;
|
||||||
|
break;
|
||||||
|
case CURLINFO_PRIMARY_IP:
|
||||||
|
/* Return the ip address of the most recent (primary) connection */
|
||||||
|
*param_charp = data->info.conn_primary_ip;
|
||||||
|
break;
|
||||||
|
case CURLINFO_LOCAL_IP:
|
||||||
|
/* Return the source/local ip address of the most recent (primary)
|
||||||
|
connection */
|
||||||
|
*param_charp = data->info.conn_local_ip;
|
||||||
|
break;
|
||||||
|
case CURLINFO_RTSP_SESSION_ID:
|
||||||
|
*param_charp = data->set.str[STRING_RTSP_SESSION_ID];
|
||||||
|
break;
|
||||||
|
|
||||||
union {
|
default:
|
||||||
struct curl_certinfo * to_certinfo;
|
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||||
struct curl_slist * to_slist;
|
}
|
||||||
} ptr;
|
return CURLE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static CURLcode Curl_getinfo_long(struct SessionHandle *data, CURLINFO info,
|
||||||
|
long *param_longp)
|
||||||
|
{
|
||||||
|
curl_socket_t sockfd;
|
||||||
|
|
||||||
union {
|
union {
|
||||||
unsigned long *to_ulong;
|
unsigned long *to_ulong;
|
||||||
long *to_long;
|
long *to_long;
|
||||||
} lptr;
|
} lptr;
|
||||||
|
|
||||||
if(!data)
|
|
||||||
return CURLE_BAD_FUNCTION_ARGUMENT;
|
|
||||||
|
|
||||||
va_start(arg, info);
|
|
||||||
|
|
||||||
type = CURLINFO_TYPEMASK & (int)info;
|
|
||||||
switch(type) {
|
|
||||||
case CURLINFO_STRING:
|
|
||||||
param_charp = va_arg(arg, char **);
|
|
||||||
if(NULL == param_charp)
|
|
||||||
return CURLE_BAD_FUNCTION_ARGUMENT;
|
|
||||||
break;
|
|
||||||
case CURLINFO_LONG:
|
|
||||||
param_longp = va_arg(arg, long *);
|
|
||||||
if(NULL == param_longp)
|
|
||||||
return CURLE_BAD_FUNCTION_ARGUMENT;
|
|
||||||
break;
|
|
||||||
case CURLINFO_DOUBLE:
|
|
||||||
param_doublep = va_arg(arg, double *);
|
|
||||||
if(NULL == param_doublep)
|
|
||||||
return CURLE_BAD_FUNCTION_ARGUMENT;
|
|
||||||
break;
|
|
||||||
case CURLINFO_SLIST:
|
|
||||||
param_slistp = va_arg(arg, struct curl_slist **);
|
|
||||||
if(NULL == param_slistp)
|
|
||||||
return CURLE_BAD_FUNCTION_ARGUMENT;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return CURLE_BAD_FUNCTION_ARGUMENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(info) {
|
switch(info) {
|
||||||
case CURLINFO_EFFECTIVE_URL:
|
|
||||||
*param_charp = data->change.url?data->change.url:(char *)"";
|
|
||||||
break;
|
|
||||||
case CURLINFO_RESPONSE_CODE:
|
case CURLINFO_RESPONSE_CODE:
|
||||||
*param_longp = data->info.httpcode;
|
*param_longp = data->info.httpcode;
|
||||||
break;
|
break;
|
||||||
@ -142,6 +143,70 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
|
|||||||
case CURLINFO_REQUEST_SIZE:
|
case CURLINFO_REQUEST_SIZE:
|
||||||
*param_longp = data->info.request_size;
|
*param_longp = data->info.request_size;
|
||||||
break;
|
break;
|
||||||
|
case CURLINFO_SSL_VERIFYRESULT:
|
||||||
|
*param_longp = data->set.ssl.certverifyresult;
|
||||||
|
break;
|
||||||
|
case CURLINFO_REDIRECT_COUNT:
|
||||||
|
*param_longp = data->set.followlocation;
|
||||||
|
break;
|
||||||
|
case CURLINFO_HTTPAUTH_AVAIL:
|
||||||
|
lptr.to_long = param_longp;
|
||||||
|
*lptr.to_ulong = data->info.httpauthavail;
|
||||||
|
break;
|
||||||
|
case CURLINFO_PROXYAUTH_AVAIL:
|
||||||
|
lptr.to_long = param_longp;
|
||||||
|
*lptr.to_ulong = data->info.proxyauthavail;
|
||||||
|
break;
|
||||||
|
case CURLINFO_OS_ERRNO:
|
||||||
|
*param_longp = data->state.os_errno;
|
||||||
|
break;
|
||||||
|
case CURLINFO_NUM_CONNECTS:
|
||||||
|
*param_longp = data->info.numconnects;
|
||||||
|
break;
|
||||||
|
case CURLINFO_LASTSOCKET:
|
||||||
|
sockfd = Curl_getconnectinfo(data, NULL);
|
||||||
|
|
||||||
|
/* note: this is not a good conversion for systems with 64 bit sockets and
|
||||||
|
32 bit longs */
|
||||||
|
if(sockfd != CURL_SOCKET_BAD)
|
||||||
|
*param_longp = (long)sockfd;
|
||||||
|
else
|
||||||
|
/* this interface is documented to return -1 in case of badness, which
|
||||||
|
may not be the same as the CURL_SOCKET_BAD value */
|
||||||
|
*param_longp = -1;
|
||||||
|
break;
|
||||||
|
case CURLINFO_PRIMARY_PORT:
|
||||||
|
/* Return the (remote) port of the most recent (primary) connection */
|
||||||
|
*param_longp = data->info.conn_primary_port;
|
||||||
|
break;
|
||||||
|
case CURLINFO_LOCAL_PORT:
|
||||||
|
/* Return the local port of the most recent (primary) connection */
|
||||||
|
*param_longp = data->info.conn_local_port;
|
||||||
|
break;
|
||||||
|
case CURLINFO_CONDITION_UNMET:
|
||||||
|
/* return if the condition prevented the document to get transferred */
|
||||||
|
*param_longp = data->info.timecond;
|
||||||
|
break;
|
||||||
|
case CURLINFO_RTSP_CLIENT_CSEQ:
|
||||||
|
*param_longp = data->state.rtsp_next_client_CSeq;
|
||||||
|
break;
|
||||||
|
case CURLINFO_RTSP_SERVER_CSEQ:
|
||||||
|
*param_longp = data->state.rtsp_next_server_CSeq;
|
||||||
|
break;
|
||||||
|
case CURLINFO_RTSP_CSEQ_RECV:
|
||||||
|
*param_longp = data->state.rtsp_CSeq_recv;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||||
|
}
|
||||||
|
return CURLE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static CURLcode Curl_getinfo_double(struct SessionHandle *data, CURLINFO info,
|
||||||
|
double *param_doublep)
|
||||||
|
{
|
||||||
|
switch(info) {
|
||||||
case CURLINFO_TOTAL_TIME:
|
case CURLINFO_TOTAL_TIME:
|
||||||
*param_doublep = data->progress.timespent;
|
*param_doublep = data->progress.timespent;
|
||||||
break;
|
break;
|
||||||
@ -172,9 +237,6 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
|
|||||||
case CURLINFO_SPEED_UPLOAD:
|
case CURLINFO_SPEED_UPLOAD:
|
||||||
*param_doublep = (double)data->progress.ulspeed;
|
*param_doublep = (double)data->progress.ulspeed;
|
||||||
break;
|
break;
|
||||||
case CURLINFO_SSL_VERIFYRESULT:
|
|
||||||
*param_longp = data->set.ssl.certverifyresult;
|
|
||||||
break;
|
|
||||||
case CURLINFO_CONTENT_LENGTH_DOWNLOAD:
|
case CURLINFO_CONTENT_LENGTH_DOWNLOAD:
|
||||||
*param_doublep = (data->progress.flags & PGRS_DL_SIZE_KNOWN)?
|
*param_doublep = (data->progress.flags & PGRS_DL_SIZE_KNOWN)?
|
||||||
(double)data->progress.size_dl:-1;
|
(double)data->progress.size_dl:-1;
|
||||||
@ -186,102 +248,78 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
|
|||||||
case CURLINFO_REDIRECT_TIME:
|
case CURLINFO_REDIRECT_TIME:
|
||||||
*param_doublep = data->progress.t_redirect;
|
*param_doublep = data->progress.t_redirect;
|
||||||
break;
|
break;
|
||||||
case CURLINFO_REDIRECT_COUNT:
|
|
||||||
*param_longp = data->set.followlocation;
|
default:
|
||||||
break;
|
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||||
case CURLINFO_CONTENT_TYPE:
|
}
|
||||||
*param_charp = data->info.contenttype;
|
return CURLE_OK;
|
||||||
break;
|
}
|
||||||
case CURLINFO_PRIVATE:
|
|
||||||
*param_charp = (char *) data->set.private_data;
|
static CURLcode Curl_getinfo_slist(struct SessionHandle *data, CURLINFO info,
|
||||||
break;
|
struct curl_slist **param_slistp)
|
||||||
case CURLINFO_HTTPAUTH_AVAIL:
|
{
|
||||||
lptr.to_long = param_longp;
|
union {
|
||||||
*lptr.to_ulong = data->info.httpauthavail;
|
struct curl_certinfo * to_certinfo;
|
||||||
break;
|
struct curl_slist * to_slist;
|
||||||
case CURLINFO_PROXYAUTH_AVAIL:
|
} ptr;
|
||||||
lptr.to_long = param_longp;
|
|
||||||
*lptr.to_ulong = data->info.proxyauthavail;
|
switch(info) {
|
||||||
break;
|
|
||||||
case CURLINFO_OS_ERRNO:
|
|
||||||
*param_longp = data->state.os_errno;
|
|
||||||
break;
|
|
||||||
case CURLINFO_NUM_CONNECTS:
|
|
||||||
*param_longp = data->info.numconnects;
|
|
||||||
break;
|
|
||||||
case CURLINFO_SSL_ENGINES:
|
case CURLINFO_SSL_ENGINES:
|
||||||
*param_slistp = Curl_ssl_engines_list(data);
|
*param_slistp = Curl_ssl_engines_list(data);
|
||||||
break;
|
break;
|
||||||
case CURLINFO_COOKIELIST:
|
case CURLINFO_COOKIELIST:
|
||||||
*param_slistp = Curl_cookie_list(data);
|
*param_slistp = Curl_cookie_list(data);
|
||||||
break;
|
break;
|
||||||
case CURLINFO_FTP_ENTRY_PATH:
|
|
||||||
/* Return the entrypath string from the most recent connection.
|
|
||||||
This pointer was copied from the connectdata structure by FTP.
|
|
||||||
The actual string may be free()ed by subsequent libcurl calls so
|
|
||||||
it must be copied to a safer area before the next libcurl call.
|
|
||||||
Callers must never free it themselves. */
|
|
||||||
*param_charp = data->state.most_recent_ftp_entrypath;
|
|
||||||
break;
|
|
||||||
case CURLINFO_LASTSOCKET:
|
|
||||||
sockfd = Curl_getconnectinfo(data, NULL);
|
|
||||||
|
|
||||||
/* note: this is not a good conversion for systems with 64 bit sockets and
|
|
||||||
32 bit longs */
|
|
||||||
if(sockfd != CURL_SOCKET_BAD)
|
|
||||||
*param_longp = (long)sockfd;
|
|
||||||
else
|
|
||||||
/* this interface is documented to return -1 in case of badness, which
|
|
||||||
may not be the same as the CURL_SOCKET_BAD value */
|
|
||||||
*param_longp = -1;
|
|
||||||
break;
|
|
||||||
case CURLINFO_REDIRECT_URL:
|
|
||||||
/* Return the URL this request would have been redirected to if that
|
|
||||||
option had been enabled! */
|
|
||||||
*param_charp = data->info.wouldredirect;
|
|
||||||
break;
|
|
||||||
case CURLINFO_PRIMARY_IP:
|
|
||||||
/* Return the ip address of the most recent (primary) connection */
|
|
||||||
*param_charp = data->info.conn_primary_ip;
|
|
||||||
break;
|
|
||||||
case CURLINFO_PRIMARY_PORT:
|
|
||||||
/* Return the (remote) port of the most recent (primary) connection */
|
|
||||||
*param_longp = data->info.conn_primary_port;
|
|
||||||
break;
|
|
||||||
case CURLINFO_LOCAL_IP:
|
|
||||||
/* Return the source/local ip address of the most recent (primary)
|
|
||||||
connection */
|
|
||||||
*param_charp = data->info.conn_local_ip;
|
|
||||||
break;
|
|
||||||
case CURLINFO_LOCAL_PORT:
|
|
||||||
/* Return the local port of the most recent (primary) connection */
|
|
||||||
*param_longp = data->info.conn_local_port;
|
|
||||||
break;
|
|
||||||
case CURLINFO_CERTINFO:
|
case CURLINFO_CERTINFO:
|
||||||
/* Return the a pointer to the certinfo struct. Not really an slist
|
/* Return the a pointer to the certinfo struct. Not really an slist
|
||||||
pointer but we can pretend it is here */
|
pointer but we can pretend it is here */
|
||||||
ptr.to_certinfo = &data->info.certs;
|
ptr.to_certinfo = &data->info.certs;
|
||||||
*param_slistp = ptr.to_slist;
|
*param_slistp = ptr.to_slist;
|
||||||
break;
|
break;
|
||||||
case CURLINFO_CONDITION_UNMET:
|
|
||||||
/* return if the condition prevented the document to get transferred */
|
|
||||||
*param_longp = data->info.timecond;
|
|
||||||
break;
|
|
||||||
case CURLINFO_RTSP_SESSION_ID:
|
|
||||||
*param_charp = data->set.str[STRING_RTSP_SESSION_ID];
|
|
||||||
break;
|
|
||||||
case CURLINFO_RTSP_CLIENT_CSEQ:
|
|
||||||
*param_longp = data->state.rtsp_next_client_CSeq;
|
|
||||||
break;
|
|
||||||
case CURLINFO_RTSP_SERVER_CSEQ:
|
|
||||||
*param_longp = data->state.rtsp_next_server_CSeq;
|
|
||||||
break;
|
|
||||||
case CURLINFO_RTSP_CSEQ_RECV:
|
|
||||||
*param_longp = data->state.rtsp_CSeq_recv;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return CURLE_BAD_FUNCTION_ARGUMENT;
|
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||||
}
|
}
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
|
||||||
|
{
|
||||||
|
va_list arg;
|
||||||
|
long *param_longp=NULL;
|
||||||
|
double *param_doublep=NULL;
|
||||||
|
char **param_charp=NULL;
|
||||||
|
struct curl_slist **param_slistp=NULL;
|
||||||
|
int type;
|
||||||
|
|
||||||
|
if(!data)
|
||||||
|
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||||
|
|
||||||
|
va_start(arg, info);
|
||||||
|
|
||||||
|
type = CURLINFO_TYPEMASK & (int)info;
|
||||||
|
switch(type) {
|
||||||
|
case CURLINFO_STRING:
|
||||||
|
param_charp = va_arg(arg, char **);
|
||||||
|
if(NULL == param_charp)
|
||||||
|
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||||
|
return Curl_getinfo_char(data, info, param_charp);
|
||||||
|
case CURLINFO_LONG:
|
||||||
|
param_longp = va_arg(arg, long *);
|
||||||
|
if(NULL == param_longp)
|
||||||
|
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||||
|
return Curl_getinfo_long(data, info, param_longp);
|
||||||
|
case CURLINFO_DOUBLE:
|
||||||
|
param_doublep = va_arg(arg, double *);
|
||||||
|
if(NULL == param_doublep)
|
||||||
|
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||||
|
return Curl_getinfo_double(data, info, param_doublep);
|
||||||
|
case CURLINFO_SLIST:
|
||||||
|
param_slistp = va_arg(arg, struct curl_slist **);
|
||||||
|
if(NULL == param_slistp)
|
||||||
|
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||||
|
return Curl_getinfo_slist(data, info, param_slistp);
|
||||||
|
default:
|
||||||
|
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user