From: Daniel Stenberg Date: Mon, 27 Jan 2025 08:34:57 +0000 (+0100) Subject: urldata: tweak the UserDefined struct X-Git-Tag: curl-8_12_0~41 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=35b1c1585ba895c5014e413305c3df6d2ed8bb80;p=thirdparty%2Fcurl.git urldata: tweak the UserDefined struct By better sticking to listing the struct members sorted by size, this struct is now 48 bytes smaller on my fairly maximized build, without removing anything. Turned 'connect_only' into two bits instead of an unsigned char with two magic values. Also put the 'gssapi_delegation' field within ifdef HAVE_GSSAPI. Closes #16097 --- diff --git a/lib/multi.c b/lib/multi.c index 2c3ddb556f..d4dd4a0047 100644 --- a/lib/multi.c +++ b/lib/multi.c @@ -2048,7 +2048,7 @@ static CURLMcode state_do(struct Curl_easy *data, } } - if(data->set.connect_only == 1) { + if(data->set.connect_only && !data->set.connect_only_ws) { /* keep connection open for application to use the socket */ connkeep(data->conn, "CONNECT_ONLY"); multistate(data, MSTATE_DONE); diff --git a/lib/setopt.c b/lib/setopt.c index 5b9f8be6a0..e264c73784 100644 --- a/lib/setopt.c +++ b/lib/setopt.c @@ -917,6 +917,7 @@ static CURLcode setopt_long(struct Curl_easy *data, CURLoption option, break; #endif +#ifdef HAVE_GSSAPI case CURLOPT_GSSAPI_DELEGATION: /* * GSS-API credential delegation bitmask @@ -924,6 +925,7 @@ static CURLcode setopt_long(struct Curl_easy *data, CURLoption option, data->set.gssapi_delegation = (unsigned char)uarg& (CURLGSSAPI_DELEGATION_POLICY_FLAG|CURLGSSAPI_DELEGATION_FLAG); break; +#endif case CURLOPT_SSL_VERIFYPEER: /* * Enable peer SSL verifying. @@ -1104,7 +1106,8 @@ static CURLcode setopt_long(struct Curl_easy *data, CURLoption option, */ if(arg > 2) return CURLE_BAD_FUNCTION_ARGUMENT; - data->set.connect_only = (unsigned char)arg; + data->set.connect_only = !!arg; + data->set.connect_only_ws = (arg == 2); break; case CURLOPT_SSL_SESSIONID_CACHE: diff --git a/lib/url.c b/lib/url.c index d6747c0e74..0f3d1002b4 100644 --- a/lib/url.c +++ b/lib/url.c @@ -1025,10 +1025,12 @@ static bool url_match_conn(struct connectdata *conn, void *userdata) } } +#ifdef HAVE_GSSAPI /* GSS delegation differences do not actually affect every connection and auth method, but this check takes precaution before efficiency */ if(needle->gssapi_delegation != conn->gssapi_delegation) return FALSE; +#endif /* If looking for HTTP and the HTTP version we want is less * than the HTTP version of conn, continue looking. @@ -1389,8 +1391,9 @@ static struct connectdata *allocate_conn(struct Curl_easy *data) conn->fclosesocket = data->set.fclosesocket; conn->closesocket_client = data->set.closesocket_client; conn->lastused = conn->created; +#ifdef HAVE_GSSAPI conn->gssapi_delegation = data->set.gssapi_delegation; - +#endif return conn; error: diff --git a/lib/urldata.h b/lib/urldata.h index de53cba4b2..33fa0d1354 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -1536,23 +1536,15 @@ struct UserDefined { void *out; /* CURLOPT_WRITEDATA */ void *in_set; /* CURLOPT_READDATA */ void *writeheader; /* write the header to this if non-NULL */ - unsigned short use_port; /* which port to use (when not using default) */ unsigned long httpauth; /* kind of HTTP authentication to use (bitmask) */ unsigned long proxyauth; /* kind of proxy authentication to use (bitmask) */ long maxredirs; /* maximum no. of http(s) redirects to follow, set to -1 for infinity */ - void *postfields; /* if POST, set the fields' values here */ curl_seek_callback seek_func; /* function that seeks the input */ curl_off_t postfieldsize; /* if POST, this might have a size to use instead of strlen(), and then the data *may* be binary (contain zero bytes) */ -#ifndef CURL_DISABLE_BINDLOCAL - unsigned short localport; /* local port number to bind to */ - unsigned short localportrange; /* number of additional port numbers to test - in case the 'localport' one cannot be - bind()ed */ -#endif curl_write_callback fwrite_func; /* function that stores the output */ curl_write_callback fwrite_header; /* function that stores headers */ curl_write_callback fwrite_rtp; /* function that stores interleaved RTP */ @@ -1582,11 +1574,6 @@ struct UserDefined { #endif void *progress_client; /* pointer to pass to the progress callback */ void *ioctl_client; /* pointer to pass to the ioctl callback */ - unsigned int timeout; /* ms, 0 means no timeout */ - unsigned int connecttimeout; /* ms, 0 means default timeout */ - unsigned int happy_eyeballs_timeout; /* ms, 0 is a valid value */ - unsigned int server_response_timeout; /* ms, 0 means no timeout */ - unsigned int shutdowntimeout; /* ms, 0 means default timeout */ long maxage_conn; /* in seconds, max idle time to allow a connection that is to be reused */ long maxlifetime_conn; /* in seconds, max time since creation to allow a @@ -1614,10 +1601,6 @@ struct UserDefined { struct curl_slist *connect_to; /* list of host:port mappings to override the hostname and port to connect to */ time_t timevalue; /* what time to compare with */ - unsigned char timecondition; /* kind of time comparison: curl_TimeCond */ - unsigned char method; /* what kind of HTTP request: Curl_HttpReq */ - unsigned char httpwant; /* when non-zero, a specific HTTP version requested - to be used in the library's request(s) */ struct ssl_config_data ssl; /* user defined SSL stuff */ #ifndef CURL_DISABLE_PROXY struct ssl_config_data proxy_ssl; /* user defined SSL stuff for proxy */ @@ -1637,24 +1620,17 @@ struct UserDefined { #ifndef CURL_DISABLE_HTTP struct curl_slist *http200aliases; /* linked list of aliases for http200 */ #endif - unsigned char ipver; /* the CURL_IPRESOLVE_* defines in the public header - file 0 - whatever, 1 - v2, 2 - v6 */ curl_off_t max_filesize; /* Maximum file size to download */ #ifndef CURL_DISABLE_FTP + unsigned int accepttimeout; /* in milliseconds, 0 means no timeout */ unsigned char ftp_filemethod; /* how to get to a file: curl_ftpfile */ unsigned char ftpsslauth; /* what AUTH XXX to try: curl_ftpauth */ unsigned char ftp_ccc; /* FTP CCC options: curl_ftpccc */ - unsigned int accepttimeout; /* in milliseconds, 0 means no timeout */ #endif #if !defined(CURL_DISABLE_FTP) || defined(USE_SSH) struct curl_slist *quote; /* after connection is established */ struct curl_slist *postquote; /* after the transfer */ struct curl_slist *prequote; /* before the transfer, after type */ - /* Despite the name, ftp_create_missing_dirs is for FTP(S) and SFTP - 1 - create directories that do not exist - 2 - the same but also allow MKD to fail once - */ - unsigned char ftp_create_missing_dirs; #endif #ifdef USE_LIBSSH2 curl_sshhostkeycallback ssh_hostkeyfunc; /* hostkey check callback */ @@ -1665,9 +1641,6 @@ struct UserDefined { void *ssh_keyfunc_userp; /* custom pointer to callback */ int ssh_auth_types; /* allowed SSH auth types */ unsigned int new_directory_perms; /* when creating remote dirs */ -#endif -#ifndef CURL_DISABLE_NETRC - unsigned char use_netrc; /* enum CURL_NETRC_OPTION values */ #endif unsigned int new_file_perms; /* when creating remote files */ char *str[STRING_LAST]; /* array of strings, pointing to allocated memory */ @@ -1692,10 +1665,12 @@ struct UserDefined { void *fnmatch_data; void *wildcardptr; #endif - /* GSS-API credential delegation, see the documentation of - CURLOPT_GSSAPI_DELEGATION */ - unsigned char gssapi_delegation; + unsigned int timeout; /* ms, 0 means no timeout */ + unsigned int connecttimeout; /* ms, 0 means default timeout */ + unsigned int happy_eyeballs_timeout; /* ms, 0 is a valid value */ + unsigned int server_response_timeout; /* ms, 0 means no timeout */ + unsigned int shutdowntimeout; /* ms, 0 means default timeout */ int tcp_keepidle; /* seconds in idle before sending keepalive probe */ int tcp_keepintvl; /* seconds between TCP keepalive probes */ int tcp_keepcnt; /* maximum number of keepalive probes */ @@ -1717,18 +1692,49 @@ struct UserDefined { void *trailer_data; /* pointer to pass to trailer data callback */ curl_trailer_callback trailer_callback; /* trailing data callback */ #endif - char keep_post; /* keep POSTs as POSTs after a 30x request; each - bit represents a request, from 301 to 303 */ #ifndef CURL_DISABLE_SMTP struct curl_slist *mail_rcpt; /* linked list of mail recipients */ - BIT(mail_rcpt_allowfails); /* allow RCPT TO command to fail for some - recipients */ #endif unsigned int maxconnects; /* Max idle connections in the connection cache */ + unsigned short use_port; /* which port to use (when not using default) */ +#ifndef CURL_DISABLE_BINDLOCAL + unsigned short localport; /* local port number to bind to */ + unsigned short localportrange; /* number of additional port numbers to test + in case the 'localport' one cannot be + bind()ed */ +#endif +#ifndef CURL_DISABLE_NETRC + unsigned char use_netrc; /* enum CURL_NETRC_OPTION values */ +#endif +#if !defined(CURL_DISABLE_FTP) || defined(USE_SSH) + /* Despite the name, ftp_create_missing_dirs is for FTP(S) and SFTP + 1 - create directories that do not exist + 2 - the same but also allow MKD to fail once + */ + unsigned char ftp_create_missing_dirs; +#endif unsigned char use_ssl; /* if AUTH TLS is to be attempted etc, for FTP or IMAP or POP3 or others! (type: curl_usessl)*/ - unsigned char connect_only; /* make connection/request, then let - application use the socket */ + char keep_post; /* keep POSTs as POSTs after a 30x request; each + bit represents a request, from 301 to 303 */ + unsigned char timecondition; /* kind of time comparison: curl_TimeCond */ + unsigned char method; /* what kind of HTTP request: Curl_HttpReq */ + unsigned char httpwant; /* when non-zero, a specific HTTP version requested + to be used in the library's request(s) */ + unsigned char ipver; /* the CURL_IPRESOLVE_* defines in the public header + file 0 - whatever, 1 - v2, 2 - v6 */ +#ifdef HAVE_GSSAPI + /* GSS-API credential delegation, see the documentation of + CURLOPT_GSSAPI_DELEGATION */ + unsigned char gssapi_delegation; +#endif + BIT(connect_only); /* make connection/request, then let application use the + socket */ + BIT(connect_only_ws); /* special websocket connect-only level */ +#ifndef CURL_DISABLE_SMTP + BIT(mail_rcpt_allowfails); /* allow RCPT TO command to fail for some + recipients */ +#endif #ifndef CURL_DISABLE_MIME BIT(mime_formescape); #endif