113498266Sopenharmony_ci/*************************************************************************** 213498266Sopenharmony_ci * _ _ ____ _ 313498266Sopenharmony_ci * Project ___| | | | _ \| | 413498266Sopenharmony_ci * / __| | | | |_) | | 513498266Sopenharmony_ci * | (__| |_| | _ <| |___ 613498266Sopenharmony_ci * \___|\___/|_| \_\_____| 713498266Sopenharmony_ci * 813498266Sopenharmony_ci * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al. 913498266Sopenharmony_ci * 1013498266Sopenharmony_ci * This software is licensed as described in the file COPYING, which 1113498266Sopenharmony_ci * you should have received as part of this distribution. The terms 1213498266Sopenharmony_ci * are also available at https://curl.se/docs/copyright.html. 1313498266Sopenharmony_ci * 1413498266Sopenharmony_ci * You may opt to use, copy, modify, merge, publish, distribute and/or sell 1513498266Sopenharmony_ci * copies of the Software, and permit persons to whom the Software is 1613498266Sopenharmony_ci * furnished to do so, under the terms of the COPYING file. 1713498266Sopenharmony_ci * 1813498266Sopenharmony_ci * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 1913498266Sopenharmony_ci * KIND, either express or implied. 2013498266Sopenharmony_ci * 2113498266Sopenharmony_ci * SPDX-License-Identifier: curl 2213498266Sopenharmony_ci * 2313498266Sopenharmony_ci ***************************************************************************/ 2413498266Sopenharmony_ci 2513498266Sopenharmony_ci#include "curl_setup.h" 2613498266Sopenharmony_ci 2713498266Sopenharmony_ci#include <limits.h> 2813498266Sopenharmony_ci 2913498266Sopenharmony_ci#ifdef HAVE_NETINET_IN_H 3013498266Sopenharmony_ci#include <netinet/in.h> 3113498266Sopenharmony_ci#endif 3213498266Sopenharmony_ci 3313498266Sopenharmony_ci#ifdef HAVE_LINUX_TCP_H 3413498266Sopenharmony_ci#include <linux/tcp.h> 3513498266Sopenharmony_ci#elif defined(HAVE_NETINET_TCP_H) 3613498266Sopenharmony_ci#include <netinet/tcp.h> 3713498266Sopenharmony_ci#endif 3813498266Sopenharmony_ci 3913498266Sopenharmony_ci#include "urldata.h" 4013498266Sopenharmony_ci#include "url.h" 4113498266Sopenharmony_ci#include "progress.h" 4213498266Sopenharmony_ci#include "content_encoding.h" 4313498266Sopenharmony_ci#include "strcase.h" 4413498266Sopenharmony_ci#include "share.h" 4513498266Sopenharmony_ci#include "vtls/vtls.h" 4613498266Sopenharmony_ci#include "warnless.h" 4713498266Sopenharmony_ci#include "sendf.h" 4813498266Sopenharmony_ci#include "http2.h" 4913498266Sopenharmony_ci#include "setopt.h" 5013498266Sopenharmony_ci#include "multiif.h" 5113498266Sopenharmony_ci#include "altsvc.h" 5213498266Sopenharmony_ci#include "hsts.h" 5313498266Sopenharmony_ci#include "tftp.h" 5413498266Sopenharmony_ci#include "strdup.h" 5513498266Sopenharmony_ci/* The last 3 #include files should be in this order */ 5613498266Sopenharmony_ci#include "curl_printf.h" 5713498266Sopenharmony_ci#include "curl_memory.h" 5813498266Sopenharmony_ci#include "memdebug.h" 5913498266Sopenharmony_ci 6013498266Sopenharmony_ciCURLcode Curl_setstropt(char **charp, const char *s) 6113498266Sopenharmony_ci{ 6213498266Sopenharmony_ci /* Release the previous storage at `charp' and replace by a dynamic storage 6313498266Sopenharmony_ci copy of `s'. Return CURLE_OK or CURLE_OUT_OF_MEMORY. */ 6413498266Sopenharmony_ci 6513498266Sopenharmony_ci Curl_safefree(*charp); 6613498266Sopenharmony_ci 6713498266Sopenharmony_ci if(s) { 6813498266Sopenharmony_ci if(strlen(s) > CURL_MAX_INPUT_LENGTH) 6913498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 7013498266Sopenharmony_ci 7113498266Sopenharmony_ci *charp = strdup(s); 7213498266Sopenharmony_ci if(!*charp) 7313498266Sopenharmony_ci return CURLE_OUT_OF_MEMORY; 7413498266Sopenharmony_ci } 7513498266Sopenharmony_ci 7613498266Sopenharmony_ci return CURLE_OK; 7713498266Sopenharmony_ci} 7813498266Sopenharmony_ci 7913498266Sopenharmony_ciCURLcode Curl_setblobopt(struct curl_blob **blobp, 8013498266Sopenharmony_ci const struct curl_blob *blob) 8113498266Sopenharmony_ci{ 8213498266Sopenharmony_ci /* free the previous storage at `blobp' and replace by a dynamic storage 8313498266Sopenharmony_ci copy of blob. If CURL_BLOB_COPY is set, the data is copied. */ 8413498266Sopenharmony_ci 8513498266Sopenharmony_ci Curl_safefree(*blobp); 8613498266Sopenharmony_ci 8713498266Sopenharmony_ci if(blob) { 8813498266Sopenharmony_ci struct curl_blob *nblob; 8913498266Sopenharmony_ci if(blob->len > CURL_MAX_INPUT_LENGTH) 9013498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 9113498266Sopenharmony_ci nblob = (struct curl_blob *) 9213498266Sopenharmony_ci malloc(sizeof(struct curl_blob) + 9313498266Sopenharmony_ci ((blob->flags & CURL_BLOB_COPY) ? blob->len : 0)); 9413498266Sopenharmony_ci if(!nblob) 9513498266Sopenharmony_ci return CURLE_OUT_OF_MEMORY; 9613498266Sopenharmony_ci *nblob = *blob; 9713498266Sopenharmony_ci if(blob->flags & CURL_BLOB_COPY) { 9813498266Sopenharmony_ci /* put the data after the blob struct in memory */ 9913498266Sopenharmony_ci nblob->data = (char *)nblob + sizeof(struct curl_blob); 10013498266Sopenharmony_ci memcpy(nblob->data, blob->data, blob->len); 10113498266Sopenharmony_ci } 10213498266Sopenharmony_ci 10313498266Sopenharmony_ci *blobp = nblob; 10413498266Sopenharmony_ci return CURLE_OK; 10513498266Sopenharmony_ci } 10613498266Sopenharmony_ci 10713498266Sopenharmony_ci return CURLE_OK; 10813498266Sopenharmony_ci} 10913498266Sopenharmony_ci 11013498266Sopenharmony_cistatic CURLcode setstropt_userpwd(char *option, char **userp, char **passwdp) 11113498266Sopenharmony_ci{ 11213498266Sopenharmony_ci CURLcode result = CURLE_OK; 11313498266Sopenharmony_ci char *user = NULL; 11413498266Sopenharmony_ci char *passwd = NULL; 11513498266Sopenharmony_ci 11613498266Sopenharmony_ci /* Parse the login details if specified. It not then we treat NULL as a hint 11713498266Sopenharmony_ci to clear the existing data */ 11813498266Sopenharmony_ci if(option) { 11913498266Sopenharmony_ci size_t len = strlen(option); 12013498266Sopenharmony_ci if(len > CURL_MAX_INPUT_LENGTH) 12113498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 12213498266Sopenharmony_ci 12313498266Sopenharmony_ci result = Curl_parse_login_details(option, len, 12413498266Sopenharmony_ci (userp ? &user : NULL), 12513498266Sopenharmony_ci (passwdp ? &passwd : NULL), 12613498266Sopenharmony_ci NULL); 12713498266Sopenharmony_ci } 12813498266Sopenharmony_ci 12913498266Sopenharmony_ci if(!result) { 13013498266Sopenharmony_ci /* Store the username part of option if required */ 13113498266Sopenharmony_ci if(userp) { 13213498266Sopenharmony_ci if(!user && option && option[0] == ':') { 13313498266Sopenharmony_ci /* Allocate an empty string instead of returning NULL as user name */ 13413498266Sopenharmony_ci user = strdup(""); 13513498266Sopenharmony_ci if(!user) 13613498266Sopenharmony_ci result = CURLE_OUT_OF_MEMORY; 13713498266Sopenharmony_ci } 13813498266Sopenharmony_ci 13913498266Sopenharmony_ci Curl_safefree(*userp); 14013498266Sopenharmony_ci *userp = user; 14113498266Sopenharmony_ci } 14213498266Sopenharmony_ci 14313498266Sopenharmony_ci /* Store the password part of option if required */ 14413498266Sopenharmony_ci if(passwdp) { 14513498266Sopenharmony_ci Curl_safefree(*passwdp); 14613498266Sopenharmony_ci *passwdp = passwd; 14713498266Sopenharmony_ci } 14813498266Sopenharmony_ci } 14913498266Sopenharmony_ci 15013498266Sopenharmony_ci return result; 15113498266Sopenharmony_ci} 15213498266Sopenharmony_ci 15313498266Sopenharmony_ci#define C_SSLVERSION_VALUE(x) (x & 0xffff) 15413498266Sopenharmony_ci#define C_SSLVERSION_MAX_VALUE(x) (x & 0xffff0000) 15513498266Sopenharmony_ci 15613498266Sopenharmony_cistatic CURLcode protocol2num(const char *str, curl_prot_t *val) 15713498266Sopenharmony_ci{ 15813498266Sopenharmony_ci /* 15913498266Sopenharmony_ci * We are asked to cherry-pick protocols, so play it safe and disallow all 16013498266Sopenharmony_ci * protocols to start with, and re-add the wanted ones back in. 16113498266Sopenharmony_ci */ 16213498266Sopenharmony_ci *val = 0; 16313498266Sopenharmony_ci 16413498266Sopenharmony_ci if(!str) 16513498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 16613498266Sopenharmony_ci 16713498266Sopenharmony_ci if(curl_strequal(str, "all")) { 16813498266Sopenharmony_ci *val = ~(curl_prot_t) 0; 16913498266Sopenharmony_ci return CURLE_OK; 17013498266Sopenharmony_ci } 17113498266Sopenharmony_ci 17213498266Sopenharmony_ci do { 17313498266Sopenharmony_ci const char *token = str; 17413498266Sopenharmony_ci size_t tlen; 17513498266Sopenharmony_ci 17613498266Sopenharmony_ci str = strchr(str, ','); 17713498266Sopenharmony_ci tlen = str? (size_t) (str - token): strlen(token); 17813498266Sopenharmony_ci if(tlen) { 17913498266Sopenharmony_ci const struct Curl_handler *h = Curl_getn_scheme_handler(token, tlen); 18013498266Sopenharmony_ci 18113498266Sopenharmony_ci if(!h) 18213498266Sopenharmony_ci return CURLE_UNSUPPORTED_PROTOCOL; 18313498266Sopenharmony_ci 18413498266Sopenharmony_ci *val |= h->protocol; 18513498266Sopenharmony_ci } 18613498266Sopenharmony_ci } while(str && str++); 18713498266Sopenharmony_ci 18813498266Sopenharmony_ci if(!*val) 18913498266Sopenharmony_ci /* no protocol listed */ 19013498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 19113498266Sopenharmony_ci return CURLE_OK; 19213498266Sopenharmony_ci} 19313498266Sopenharmony_ci 19413498266Sopenharmony_ci/* 19513498266Sopenharmony_ci * Do not make Curl_vsetopt() static: it is called from 19613498266Sopenharmony_ci * packages/OS400/ccsidcurl.c. 19713498266Sopenharmony_ci */ 19813498266Sopenharmony_ciCURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param) 19913498266Sopenharmony_ci{ 20013498266Sopenharmony_ci char *argptr; 20113498266Sopenharmony_ci CURLcode result = CURLE_OK; 20213498266Sopenharmony_ci long arg; 20313498266Sopenharmony_ci unsigned long uarg; 20413498266Sopenharmony_ci curl_off_t bigsize; 20513498266Sopenharmony_ci 20613498266Sopenharmony_ci switch(option) { 20713498266Sopenharmony_ci case CURLOPT_DNS_CACHE_TIMEOUT: 20813498266Sopenharmony_ci arg = va_arg(param, long); 20913498266Sopenharmony_ci if(arg < -1) 21013498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 21113498266Sopenharmony_ci else if(arg > INT_MAX) 21213498266Sopenharmony_ci arg = INT_MAX; 21313498266Sopenharmony_ci 21413498266Sopenharmony_ci data->set.dns_cache_timeout = (int)arg; 21513498266Sopenharmony_ci break; 21613498266Sopenharmony_ci case CURLOPT_CA_CACHE_TIMEOUT: 21713498266Sopenharmony_ci arg = va_arg(param, long); 21813498266Sopenharmony_ci if(arg < -1) 21913498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 22013498266Sopenharmony_ci else if(arg > INT_MAX) 22113498266Sopenharmony_ci arg = INT_MAX; 22213498266Sopenharmony_ci 22313498266Sopenharmony_ci data->set.general_ssl.ca_cache_timeout = (int)arg; 22413498266Sopenharmony_ci break; 22513498266Sopenharmony_ci case CURLOPT_DNS_USE_GLOBAL_CACHE: 22613498266Sopenharmony_ci /* deprecated */ 22713498266Sopenharmony_ci break; 22813498266Sopenharmony_ci case CURLOPT_SSL_CIPHER_LIST: 22913498266Sopenharmony_ci /* set a list of cipher we want to use in the SSL connection */ 23013498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_SSL_CIPHER_LIST], 23113498266Sopenharmony_ci va_arg(param, char *)); 23213498266Sopenharmony_ci break; 23313498266Sopenharmony_ci#ifndef CURL_DISABLE_PROXY 23413498266Sopenharmony_ci case CURLOPT_PROXY_SSL_CIPHER_LIST: 23513498266Sopenharmony_ci /* set a list of cipher we want to use in the SSL connection for proxy */ 23613498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_SSL_CIPHER_LIST_PROXY], 23713498266Sopenharmony_ci va_arg(param, char *)); 23813498266Sopenharmony_ci break; 23913498266Sopenharmony_ci#endif 24013498266Sopenharmony_ci case CURLOPT_TLS13_CIPHERS: 24113498266Sopenharmony_ci if(Curl_ssl_supports(data, SSLSUPP_TLS13_CIPHERSUITES)) { 24213498266Sopenharmony_ci /* set preferred list of TLS 1.3 cipher suites */ 24313498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_SSL_CIPHER13_LIST], 24413498266Sopenharmony_ci va_arg(param, char *)); 24513498266Sopenharmony_ci } 24613498266Sopenharmony_ci else 24713498266Sopenharmony_ci return CURLE_NOT_BUILT_IN; 24813498266Sopenharmony_ci break; 24913498266Sopenharmony_ci#ifndef CURL_DISABLE_PROXY 25013498266Sopenharmony_ci case CURLOPT_PROXY_TLS13_CIPHERS: 25113498266Sopenharmony_ci if(Curl_ssl_supports(data, SSLSUPP_TLS13_CIPHERSUITES)) { 25213498266Sopenharmony_ci /* set preferred list of TLS 1.3 cipher suites for proxy */ 25313498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_SSL_CIPHER13_LIST_PROXY], 25413498266Sopenharmony_ci va_arg(param, char *)); 25513498266Sopenharmony_ci } 25613498266Sopenharmony_ci else 25713498266Sopenharmony_ci return CURLE_NOT_BUILT_IN; 25813498266Sopenharmony_ci break; 25913498266Sopenharmony_ci#endif 26013498266Sopenharmony_ci case CURLOPT_RANDOM_FILE: 26113498266Sopenharmony_ci break; 26213498266Sopenharmony_ci case CURLOPT_EGDSOCKET: 26313498266Sopenharmony_ci break; 26413498266Sopenharmony_ci case CURLOPT_MAXCONNECTS: 26513498266Sopenharmony_ci /* 26613498266Sopenharmony_ci * Set the absolute number of maximum simultaneous alive connection that 26713498266Sopenharmony_ci * libcurl is allowed to have. 26813498266Sopenharmony_ci */ 26913498266Sopenharmony_ci uarg = va_arg(param, unsigned long); 27013498266Sopenharmony_ci if(uarg > UINT_MAX) 27113498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 27213498266Sopenharmony_ci data->set.maxconnects = (unsigned int)uarg; 27313498266Sopenharmony_ci break; 27413498266Sopenharmony_ci case CURLOPT_FORBID_REUSE: 27513498266Sopenharmony_ci /* 27613498266Sopenharmony_ci * When this transfer is done, it must not be left to be reused by a 27713498266Sopenharmony_ci * subsequent transfer but shall be closed immediately. 27813498266Sopenharmony_ci */ 27913498266Sopenharmony_ci data->set.reuse_forbid = (0 != va_arg(param, long)); 28013498266Sopenharmony_ci break; 28113498266Sopenharmony_ci case CURLOPT_FRESH_CONNECT: 28213498266Sopenharmony_ci /* 28313498266Sopenharmony_ci * This transfer shall not use a previously cached connection but 28413498266Sopenharmony_ci * should be made with a fresh new connect! 28513498266Sopenharmony_ci */ 28613498266Sopenharmony_ci data->set.reuse_fresh = (0 != va_arg(param, long)); 28713498266Sopenharmony_ci break; 28813498266Sopenharmony_ci case CURLOPT_VERBOSE: 28913498266Sopenharmony_ci /* 29013498266Sopenharmony_ci * Verbose means infof() calls that give a lot of information about 29113498266Sopenharmony_ci * the connection and transfer procedures as well as internal choices. 29213498266Sopenharmony_ci */ 29313498266Sopenharmony_ci data->set.verbose = (0 != va_arg(param, long)); 29413498266Sopenharmony_ci break; 29513498266Sopenharmony_ci case CURLOPT_HEADER: 29613498266Sopenharmony_ci /* 29713498266Sopenharmony_ci * Set to include the header in the general data output stream. 29813498266Sopenharmony_ci */ 29913498266Sopenharmony_ci data->set.include_header = (0 != va_arg(param, long)); 30013498266Sopenharmony_ci break; 30113498266Sopenharmony_ci case CURLOPT_NOPROGRESS: 30213498266Sopenharmony_ci /* 30313498266Sopenharmony_ci * Shut off the internal supported progress meter 30413498266Sopenharmony_ci */ 30513498266Sopenharmony_ci data->set.hide_progress = (0 != va_arg(param, long)); 30613498266Sopenharmony_ci if(data->set.hide_progress) 30713498266Sopenharmony_ci data->progress.flags |= PGRS_HIDE; 30813498266Sopenharmony_ci else 30913498266Sopenharmony_ci data->progress.flags &= ~PGRS_HIDE; 31013498266Sopenharmony_ci break; 31113498266Sopenharmony_ci case CURLOPT_NOBODY: 31213498266Sopenharmony_ci /* 31313498266Sopenharmony_ci * Do not include the body part in the output data stream. 31413498266Sopenharmony_ci */ 31513498266Sopenharmony_ci data->set.opt_no_body = (0 != va_arg(param, long)); 31613498266Sopenharmony_ci#ifndef CURL_DISABLE_HTTP 31713498266Sopenharmony_ci if(data->set.opt_no_body) 31813498266Sopenharmony_ci /* in HTTP lingo, no body means using the HEAD request... */ 31913498266Sopenharmony_ci data->set.method = HTTPREQ_HEAD; 32013498266Sopenharmony_ci else if(data->set.method == HTTPREQ_HEAD) 32113498266Sopenharmony_ci data->set.method = HTTPREQ_GET; 32213498266Sopenharmony_ci#endif 32313498266Sopenharmony_ci break; 32413498266Sopenharmony_ci case CURLOPT_FAILONERROR: 32513498266Sopenharmony_ci /* 32613498266Sopenharmony_ci * Don't output the >=400 error code HTML-page, but instead only 32713498266Sopenharmony_ci * return error. 32813498266Sopenharmony_ci */ 32913498266Sopenharmony_ci data->set.http_fail_on_error = (0 != va_arg(param, long)); 33013498266Sopenharmony_ci break; 33113498266Sopenharmony_ci case CURLOPT_KEEP_SENDING_ON_ERROR: 33213498266Sopenharmony_ci data->set.http_keep_sending_on_error = (0 != va_arg(param, long)); 33313498266Sopenharmony_ci break; 33413498266Sopenharmony_ci case CURLOPT_UPLOAD: 33513498266Sopenharmony_ci case CURLOPT_PUT: 33613498266Sopenharmony_ci /* 33713498266Sopenharmony_ci * We want to sent data to the remote host. If this is HTTP, that equals 33813498266Sopenharmony_ci * using the PUT request. 33913498266Sopenharmony_ci */ 34013498266Sopenharmony_ci arg = va_arg(param, long); 34113498266Sopenharmony_ci if(arg) { 34213498266Sopenharmony_ci /* If this is HTTP, PUT is what's needed to "upload" */ 34313498266Sopenharmony_ci data->set.method = HTTPREQ_PUT; 34413498266Sopenharmony_ci data->set.opt_no_body = FALSE; /* this is implied */ 34513498266Sopenharmony_ci } 34613498266Sopenharmony_ci else 34713498266Sopenharmony_ci /* In HTTP, the opposite of upload is GET (unless NOBODY is true as 34813498266Sopenharmony_ci then this can be changed to HEAD later on) */ 34913498266Sopenharmony_ci data->set.method = HTTPREQ_GET; 35013498266Sopenharmony_ci break; 35113498266Sopenharmony_ci case CURLOPT_REQUEST_TARGET: 35213498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_TARGET], 35313498266Sopenharmony_ci va_arg(param, char *)); 35413498266Sopenharmony_ci break; 35513498266Sopenharmony_ci case CURLOPT_FILETIME: 35613498266Sopenharmony_ci /* 35713498266Sopenharmony_ci * Try to get the file time of the remote document. The time will 35813498266Sopenharmony_ci * later (possibly) become available using curl_easy_getinfo(). 35913498266Sopenharmony_ci */ 36013498266Sopenharmony_ci data->set.get_filetime = (0 != va_arg(param, long)); 36113498266Sopenharmony_ci break; 36213498266Sopenharmony_ci case CURLOPT_SERVER_RESPONSE_TIMEOUT: 36313498266Sopenharmony_ci /* 36413498266Sopenharmony_ci * Option that specifies how quickly a server response must be obtained 36513498266Sopenharmony_ci * before it is considered failure. For pingpong protocols. 36613498266Sopenharmony_ci */ 36713498266Sopenharmony_ci arg = va_arg(param, long); 36813498266Sopenharmony_ci if((arg >= 0) && (arg <= (INT_MAX/1000))) 36913498266Sopenharmony_ci data->set.server_response_timeout = (unsigned int)arg * 1000; 37013498266Sopenharmony_ci else 37113498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 37213498266Sopenharmony_ci break; 37313498266Sopenharmony_ci case CURLOPT_SERVER_RESPONSE_TIMEOUT_MS: 37413498266Sopenharmony_ci /* 37513498266Sopenharmony_ci * Option that specifies how quickly a server response must be obtained 37613498266Sopenharmony_ci * before it is considered failure. For pingpong protocols. 37713498266Sopenharmony_ci */ 37813498266Sopenharmony_ci arg = va_arg(param, long); 37913498266Sopenharmony_ci if((arg >= 0) && (arg <= INT_MAX)) 38013498266Sopenharmony_ci data->set.server_response_timeout = (unsigned int)arg; 38113498266Sopenharmony_ci else 38213498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 38313498266Sopenharmony_ci break; 38413498266Sopenharmony_ci#ifndef CURL_DISABLE_TFTP 38513498266Sopenharmony_ci case CURLOPT_TFTP_NO_OPTIONS: 38613498266Sopenharmony_ci /* 38713498266Sopenharmony_ci * Option that prevents libcurl from sending TFTP option requests to the 38813498266Sopenharmony_ci * server. 38913498266Sopenharmony_ci */ 39013498266Sopenharmony_ci data->set.tftp_no_options = va_arg(param, long) != 0; 39113498266Sopenharmony_ci break; 39213498266Sopenharmony_ci case CURLOPT_TFTP_BLKSIZE: 39313498266Sopenharmony_ci /* 39413498266Sopenharmony_ci * TFTP option that specifies the block size to use for data transmission. 39513498266Sopenharmony_ci */ 39613498266Sopenharmony_ci arg = va_arg(param, long); 39713498266Sopenharmony_ci if(arg > TFTP_BLKSIZE_MAX || arg < TFTP_BLKSIZE_MIN) 39813498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 39913498266Sopenharmony_ci data->set.tftp_blksize = arg; 40013498266Sopenharmony_ci break; 40113498266Sopenharmony_ci#endif 40213498266Sopenharmony_ci#ifndef CURL_DISABLE_NETRC 40313498266Sopenharmony_ci case CURLOPT_NETRC: 40413498266Sopenharmony_ci /* 40513498266Sopenharmony_ci * Parse the $HOME/.netrc file 40613498266Sopenharmony_ci */ 40713498266Sopenharmony_ci arg = va_arg(param, long); 40813498266Sopenharmony_ci if((arg < CURL_NETRC_IGNORED) || (arg >= CURL_NETRC_LAST)) 40913498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 41013498266Sopenharmony_ci data->set.use_netrc = (unsigned char)arg; 41113498266Sopenharmony_ci break; 41213498266Sopenharmony_ci case CURLOPT_NETRC_FILE: 41313498266Sopenharmony_ci /* 41413498266Sopenharmony_ci * Use this file instead of the $HOME/.netrc file 41513498266Sopenharmony_ci */ 41613498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_NETRC_FILE], 41713498266Sopenharmony_ci va_arg(param, char *)); 41813498266Sopenharmony_ci break; 41913498266Sopenharmony_ci#endif 42013498266Sopenharmony_ci case CURLOPT_TRANSFERTEXT: 42113498266Sopenharmony_ci /* 42213498266Sopenharmony_ci * This option was previously named 'FTPASCII'. Renamed to work with 42313498266Sopenharmony_ci * more protocols than merely FTP. 42413498266Sopenharmony_ci * 42513498266Sopenharmony_ci * Transfer using ASCII (instead of BINARY). 42613498266Sopenharmony_ci */ 42713498266Sopenharmony_ci data->set.prefer_ascii = (0 != va_arg(param, long)); 42813498266Sopenharmony_ci break; 42913498266Sopenharmony_ci case CURLOPT_TIMECONDITION: 43013498266Sopenharmony_ci /* 43113498266Sopenharmony_ci * Set HTTP time condition. This must be one of the defines in the 43213498266Sopenharmony_ci * curl/curl.h header file. 43313498266Sopenharmony_ci */ 43413498266Sopenharmony_ci arg = va_arg(param, long); 43513498266Sopenharmony_ci if((arg < CURL_TIMECOND_NONE) || (arg >= CURL_TIMECOND_LAST)) 43613498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 43713498266Sopenharmony_ci data->set.timecondition = (unsigned char)(curl_TimeCond)arg; 43813498266Sopenharmony_ci break; 43913498266Sopenharmony_ci case CURLOPT_TIMEVALUE: 44013498266Sopenharmony_ci /* 44113498266Sopenharmony_ci * This is the value to compare with the remote document with the 44213498266Sopenharmony_ci * method set with CURLOPT_TIMECONDITION 44313498266Sopenharmony_ci */ 44413498266Sopenharmony_ci data->set.timevalue = (time_t)va_arg(param, long); 44513498266Sopenharmony_ci break; 44613498266Sopenharmony_ci 44713498266Sopenharmony_ci case CURLOPT_TIMEVALUE_LARGE: 44813498266Sopenharmony_ci /* 44913498266Sopenharmony_ci * This is the value to compare with the remote document with the 45013498266Sopenharmony_ci * method set with CURLOPT_TIMECONDITION 45113498266Sopenharmony_ci */ 45213498266Sopenharmony_ci data->set.timevalue = (time_t)va_arg(param, curl_off_t); 45313498266Sopenharmony_ci break; 45413498266Sopenharmony_ci 45513498266Sopenharmony_ci case CURLOPT_SSLVERSION: 45613498266Sopenharmony_ci#ifndef CURL_DISABLE_PROXY 45713498266Sopenharmony_ci case CURLOPT_PROXY_SSLVERSION: 45813498266Sopenharmony_ci#endif 45913498266Sopenharmony_ci /* 46013498266Sopenharmony_ci * Set explicit SSL version to try to connect with, as some SSL 46113498266Sopenharmony_ci * implementations are lame. 46213498266Sopenharmony_ci */ 46313498266Sopenharmony_ci#ifdef USE_SSL 46413498266Sopenharmony_ci { 46513498266Sopenharmony_ci long version, version_max; 46613498266Sopenharmony_ci struct ssl_primary_config *primary = &data->set.ssl.primary; 46713498266Sopenharmony_ci#ifndef CURL_DISABLE_PROXY 46813498266Sopenharmony_ci if(option != CURLOPT_SSLVERSION) 46913498266Sopenharmony_ci primary = &data->set.proxy_ssl.primary; 47013498266Sopenharmony_ci#endif 47113498266Sopenharmony_ci 47213498266Sopenharmony_ci arg = va_arg(param, long); 47313498266Sopenharmony_ci 47413498266Sopenharmony_ci version = C_SSLVERSION_VALUE(arg); 47513498266Sopenharmony_ci version_max = C_SSLVERSION_MAX_VALUE(arg); 47613498266Sopenharmony_ci 47713498266Sopenharmony_ci if(version < CURL_SSLVERSION_DEFAULT || 47813498266Sopenharmony_ci version == CURL_SSLVERSION_SSLv2 || 47913498266Sopenharmony_ci version == CURL_SSLVERSION_SSLv3 || 48013498266Sopenharmony_ci version >= CURL_SSLVERSION_LAST || 48113498266Sopenharmony_ci version_max < CURL_SSLVERSION_MAX_NONE || 48213498266Sopenharmony_ci version_max >= CURL_SSLVERSION_MAX_LAST) 48313498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 48413498266Sopenharmony_ci 48513498266Sopenharmony_ci primary->version = (unsigned char)version; 48613498266Sopenharmony_ci primary->version_max = (unsigned int)version_max; 48713498266Sopenharmony_ci } 48813498266Sopenharmony_ci#else 48913498266Sopenharmony_ci result = CURLE_NOT_BUILT_IN; 49013498266Sopenharmony_ci#endif 49113498266Sopenharmony_ci break; 49213498266Sopenharmony_ci 49313498266Sopenharmony_ci /* MQTT "borrows" some of the HTTP options */ 49413498266Sopenharmony_ci#if !defined(CURL_DISABLE_HTTP) || !defined(CURL_DISABLE_MQTT) 49513498266Sopenharmony_ci case CURLOPT_COPYPOSTFIELDS: 49613498266Sopenharmony_ci /* 49713498266Sopenharmony_ci * A string with POST data. Makes curl HTTP POST. Even if it is NULL. 49813498266Sopenharmony_ci * If needed, CURLOPT_POSTFIELDSIZE must have been set prior to 49913498266Sopenharmony_ci * CURLOPT_COPYPOSTFIELDS and not altered later. 50013498266Sopenharmony_ci */ 50113498266Sopenharmony_ci argptr = va_arg(param, char *); 50213498266Sopenharmony_ci 50313498266Sopenharmony_ci if(!argptr || data->set.postfieldsize == -1) 50413498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_COPYPOSTFIELDS], argptr); 50513498266Sopenharmony_ci else { 50613498266Sopenharmony_ci /* 50713498266Sopenharmony_ci * Check that requested length does not overflow the size_t type. 50813498266Sopenharmony_ci */ 50913498266Sopenharmony_ci 51013498266Sopenharmony_ci if((data->set.postfieldsize < 0) || 51113498266Sopenharmony_ci ((sizeof(curl_off_t) != sizeof(size_t)) && 51213498266Sopenharmony_ci (data->set.postfieldsize > (curl_off_t)((size_t)-1)))) 51313498266Sopenharmony_ci result = CURLE_OUT_OF_MEMORY; 51413498266Sopenharmony_ci else { 51513498266Sopenharmony_ci /* Allocate even when size == 0. This satisfies the need of possible 51613498266Sopenharmony_ci later address compare to detect the COPYPOSTFIELDS mode, and to 51713498266Sopenharmony_ci mark that postfields is used rather than read function or form 51813498266Sopenharmony_ci data. 51913498266Sopenharmony_ci */ 52013498266Sopenharmony_ci char *p = Curl_memdup0(argptr, (size_t)data->set.postfieldsize); 52113498266Sopenharmony_ci (void) Curl_setstropt(&data->set.str[STRING_COPYPOSTFIELDS], NULL); 52213498266Sopenharmony_ci if(!p) 52313498266Sopenharmony_ci result = CURLE_OUT_OF_MEMORY; 52413498266Sopenharmony_ci else 52513498266Sopenharmony_ci data->set.str[STRING_COPYPOSTFIELDS] = p; 52613498266Sopenharmony_ci } 52713498266Sopenharmony_ci } 52813498266Sopenharmony_ci 52913498266Sopenharmony_ci data->set.postfields = data->set.str[STRING_COPYPOSTFIELDS]; 53013498266Sopenharmony_ci data->set.method = HTTPREQ_POST; 53113498266Sopenharmony_ci break; 53213498266Sopenharmony_ci 53313498266Sopenharmony_ci case CURLOPT_POSTFIELDS: 53413498266Sopenharmony_ci /* 53513498266Sopenharmony_ci * Like above, but use static data instead of copying it. 53613498266Sopenharmony_ci */ 53713498266Sopenharmony_ci data->set.postfields = va_arg(param, void *); 53813498266Sopenharmony_ci /* Release old copied data. */ 53913498266Sopenharmony_ci (void) Curl_setstropt(&data->set.str[STRING_COPYPOSTFIELDS], NULL); 54013498266Sopenharmony_ci data->set.method = HTTPREQ_POST; 54113498266Sopenharmony_ci break; 54213498266Sopenharmony_ci 54313498266Sopenharmony_ci case CURLOPT_POSTFIELDSIZE: 54413498266Sopenharmony_ci /* 54513498266Sopenharmony_ci * The size of the POSTFIELD data to prevent libcurl to do strlen() to 54613498266Sopenharmony_ci * figure it out. Enables binary posts. 54713498266Sopenharmony_ci */ 54813498266Sopenharmony_ci bigsize = va_arg(param, long); 54913498266Sopenharmony_ci if(bigsize < -1) 55013498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 55113498266Sopenharmony_ci 55213498266Sopenharmony_ci if(data->set.postfieldsize < bigsize && 55313498266Sopenharmony_ci data->set.postfields == data->set.str[STRING_COPYPOSTFIELDS]) { 55413498266Sopenharmony_ci /* Previous CURLOPT_COPYPOSTFIELDS is no longer valid. */ 55513498266Sopenharmony_ci (void) Curl_setstropt(&data->set.str[STRING_COPYPOSTFIELDS], NULL); 55613498266Sopenharmony_ci data->set.postfields = NULL; 55713498266Sopenharmony_ci } 55813498266Sopenharmony_ci 55913498266Sopenharmony_ci data->set.postfieldsize = bigsize; 56013498266Sopenharmony_ci break; 56113498266Sopenharmony_ci 56213498266Sopenharmony_ci case CURLOPT_POSTFIELDSIZE_LARGE: 56313498266Sopenharmony_ci /* 56413498266Sopenharmony_ci * The size of the POSTFIELD data to prevent libcurl to do strlen() to 56513498266Sopenharmony_ci * figure it out. Enables binary posts. 56613498266Sopenharmony_ci */ 56713498266Sopenharmony_ci bigsize = va_arg(param, curl_off_t); 56813498266Sopenharmony_ci if(bigsize < -1) 56913498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 57013498266Sopenharmony_ci 57113498266Sopenharmony_ci if(data->set.postfieldsize < bigsize && 57213498266Sopenharmony_ci data->set.postfields == data->set.str[STRING_COPYPOSTFIELDS]) { 57313498266Sopenharmony_ci /* Previous CURLOPT_COPYPOSTFIELDS is no longer valid. */ 57413498266Sopenharmony_ci (void) Curl_setstropt(&data->set.str[STRING_COPYPOSTFIELDS], NULL); 57513498266Sopenharmony_ci data->set.postfields = NULL; 57613498266Sopenharmony_ci } 57713498266Sopenharmony_ci 57813498266Sopenharmony_ci data->set.postfieldsize = bigsize; 57913498266Sopenharmony_ci break; 58013498266Sopenharmony_ci#endif 58113498266Sopenharmony_ci#ifndef CURL_DISABLE_HTTP 58213498266Sopenharmony_ci case CURLOPT_AUTOREFERER: 58313498266Sopenharmony_ci /* 58413498266Sopenharmony_ci * Switch on automatic referer that gets set if curl follows locations. 58513498266Sopenharmony_ci */ 58613498266Sopenharmony_ci data->set.http_auto_referer = (0 != va_arg(param, long)); 58713498266Sopenharmony_ci break; 58813498266Sopenharmony_ci 58913498266Sopenharmony_ci case CURLOPT_ACCEPT_ENCODING: 59013498266Sopenharmony_ci /* 59113498266Sopenharmony_ci * String to use at the value of Accept-Encoding header. 59213498266Sopenharmony_ci * 59313498266Sopenharmony_ci * If the encoding is set to "" we use an Accept-Encoding header that 59413498266Sopenharmony_ci * encompasses all the encodings we support. 59513498266Sopenharmony_ci * If the encoding is set to NULL we don't send an Accept-Encoding header 59613498266Sopenharmony_ci * and ignore an received Content-Encoding header. 59713498266Sopenharmony_ci * 59813498266Sopenharmony_ci */ 59913498266Sopenharmony_ci argptr = va_arg(param, char *); 60013498266Sopenharmony_ci if(argptr && !*argptr) { 60113498266Sopenharmony_ci char all[256]; 60213498266Sopenharmony_ci Curl_all_content_encodings(all, sizeof(all)); 60313498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_ENCODING], all); 60413498266Sopenharmony_ci } 60513498266Sopenharmony_ci else 60613498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_ENCODING], argptr); 60713498266Sopenharmony_ci break; 60813498266Sopenharmony_ci 60913498266Sopenharmony_ci case CURLOPT_TRANSFER_ENCODING: 61013498266Sopenharmony_ci data->set.http_transfer_encoding = (0 != va_arg(param, long)); 61113498266Sopenharmony_ci break; 61213498266Sopenharmony_ci 61313498266Sopenharmony_ci case CURLOPT_FOLLOWLOCATION: 61413498266Sopenharmony_ci /* 61513498266Sopenharmony_ci * Follow Location: header hints on an HTTP-server. 61613498266Sopenharmony_ci */ 61713498266Sopenharmony_ci data->set.http_follow_location = (0 != va_arg(param, long)); 61813498266Sopenharmony_ci break; 61913498266Sopenharmony_ci 62013498266Sopenharmony_ci case CURLOPT_UNRESTRICTED_AUTH: 62113498266Sopenharmony_ci /* 62213498266Sopenharmony_ci * Send authentication (user+password) when following locations, even when 62313498266Sopenharmony_ci * hostname changed. 62413498266Sopenharmony_ci */ 62513498266Sopenharmony_ci data->set.allow_auth_to_other_hosts = (0 != va_arg(param, long)); 62613498266Sopenharmony_ci break; 62713498266Sopenharmony_ci 62813498266Sopenharmony_ci case CURLOPT_MAXREDIRS: 62913498266Sopenharmony_ci /* 63013498266Sopenharmony_ci * The maximum amount of hops you allow curl to follow Location: 63113498266Sopenharmony_ci * headers. This should mostly be used to detect never-ending loops. 63213498266Sopenharmony_ci */ 63313498266Sopenharmony_ci arg = va_arg(param, long); 63413498266Sopenharmony_ci if(arg < -1) 63513498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 63613498266Sopenharmony_ci data->set.maxredirs = arg; 63713498266Sopenharmony_ci break; 63813498266Sopenharmony_ci 63913498266Sopenharmony_ci case CURLOPT_POSTREDIR: 64013498266Sopenharmony_ci /* 64113498266Sopenharmony_ci * Set the behavior of POST when redirecting 64213498266Sopenharmony_ci * CURL_REDIR_GET_ALL - POST is changed to GET after 301 and 302 64313498266Sopenharmony_ci * CURL_REDIR_POST_301 - POST is kept as POST after 301 64413498266Sopenharmony_ci * CURL_REDIR_POST_302 - POST is kept as POST after 302 64513498266Sopenharmony_ci * CURL_REDIR_POST_303 - POST is kept as POST after 303 64613498266Sopenharmony_ci * CURL_REDIR_POST_ALL - POST is kept as POST after 301, 302 and 303 64713498266Sopenharmony_ci * other - POST is kept as POST after 301 and 302 64813498266Sopenharmony_ci */ 64913498266Sopenharmony_ci arg = va_arg(param, long); 65013498266Sopenharmony_ci if(arg < CURL_REDIR_GET_ALL) 65113498266Sopenharmony_ci /* no return error on too high numbers since the bitmask could be 65213498266Sopenharmony_ci extended in a future */ 65313498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 65413498266Sopenharmony_ci data->set.keep_post = arg & CURL_REDIR_POST_ALL; 65513498266Sopenharmony_ci break; 65613498266Sopenharmony_ci 65713498266Sopenharmony_ci case CURLOPT_POST: 65813498266Sopenharmony_ci /* Does this option serve a purpose anymore? Yes it does, when 65913498266Sopenharmony_ci CURLOPT_POSTFIELDS isn't used and the POST data is read off the 66013498266Sopenharmony_ci callback! */ 66113498266Sopenharmony_ci if(va_arg(param, long)) { 66213498266Sopenharmony_ci data->set.method = HTTPREQ_POST; 66313498266Sopenharmony_ci data->set.opt_no_body = FALSE; /* this is implied */ 66413498266Sopenharmony_ci } 66513498266Sopenharmony_ci else 66613498266Sopenharmony_ci data->set.method = HTTPREQ_GET; 66713498266Sopenharmony_ci break; 66813498266Sopenharmony_ci 66913498266Sopenharmony_ci#ifndef CURL_DISABLE_FORM_API 67013498266Sopenharmony_ci case CURLOPT_HTTPPOST: 67113498266Sopenharmony_ci /* 67213498266Sopenharmony_ci * Set to make us do HTTP POST. Legacy API-style. 67313498266Sopenharmony_ci */ 67413498266Sopenharmony_ci data->set.httppost = va_arg(param, struct curl_httppost *); 67513498266Sopenharmony_ci data->set.method = HTTPREQ_POST_FORM; 67613498266Sopenharmony_ci data->set.opt_no_body = FALSE; /* this is implied */ 67713498266Sopenharmony_ci Curl_mime_cleanpart(data->state.formp); 67813498266Sopenharmony_ci Curl_safefree(data->state.formp); 67913498266Sopenharmony_ci data->state.mimepost = NULL; 68013498266Sopenharmony_ci break; 68113498266Sopenharmony_ci#endif 68213498266Sopenharmony_ci 68313498266Sopenharmony_ci#if !defined(CURL_DISABLE_AWS) 68413498266Sopenharmony_ci case CURLOPT_AWS_SIGV4: 68513498266Sopenharmony_ci /* 68613498266Sopenharmony_ci * String that is merged to some authentication 68713498266Sopenharmony_ci * parameters are used by the algorithm. 68813498266Sopenharmony_ci */ 68913498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_AWS_SIGV4], 69013498266Sopenharmony_ci va_arg(param, char *)); 69113498266Sopenharmony_ci /* 69213498266Sopenharmony_ci * Basic been set by default it need to be unset here 69313498266Sopenharmony_ci */ 69413498266Sopenharmony_ci if(data->set.str[STRING_AWS_SIGV4]) 69513498266Sopenharmony_ci data->set.httpauth = CURLAUTH_AWS_SIGV4; 69613498266Sopenharmony_ci break; 69713498266Sopenharmony_ci#endif 69813498266Sopenharmony_ci 69913498266Sopenharmony_ci case CURLOPT_REFERER: 70013498266Sopenharmony_ci /* 70113498266Sopenharmony_ci * String to set in the HTTP Referer: field. 70213498266Sopenharmony_ci */ 70313498266Sopenharmony_ci if(data->state.referer_alloc) { 70413498266Sopenharmony_ci Curl_safefree(data->state.referer); 70513498266Sopenharmony_ci data->state.referer_alloc = FALSE; 70613498266Sopenharmony_ci } 70713498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_SET_REFERER], 70813498266Sopenharmony_ci va_arg(param, char *)); 70913498266Sopenharmony_ci data->state.referer = data->set.str[STRING_SET_REFERER]; 71013498266Sopenharmony_ci break; 71113498266Sopenharmony_ci 71213498266Sopenharmony_ci case CURLOPT_USERAGENT: 71313498266Sopenharmony_ci /* 71413498266Sopenharmony_ci * String to use in the HTTP User-Agent field 71513498266Sopenharmony_ci */ 71613498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_USERAGENT], 71713498266Sopenharmony_ci va_arg(param, char *)); 71813498266Sopenharmony_ci break; 71913498266Sopenharmony_ci 72013498266Sopenharmony_ci#ifndef CURL_DISABLE_PROXY 72113498266Sopenharmony_ci case CURLOPT_PROXYHEADER: 72213498266Sopenharmony_ci /* 72313498266Sopenharmony_ci * Set a list with proxy headers to use (or replace internals with) 72413498266Sopenharmony_ci * 72513498266Sopenharmony_ci * Since CURLOPT_HTTPHEADER was the only way to set HTTP headers for a 72613498266Sopenharmony_ci * long time we remain doing it this way until CURLOPT_PROXYHEADER is 72713498266Sopenharmony_ci * used. As soon as this option has been used, if set to anything but 72813498266Sopenharmony_ci * NULL, custom headers for proxies are only picked from this list. 72913498266Sopenharmony_ci * 73013498266Sopenharmony_ci * Set this option to NULL to restore the previous behavior. 73113498266Sopenharmony_ci */ 73213498266Sopenharmony_ci data->set.proxyheaders = va_arg(param, struct curl_slist *); 73313498266Sopenharmony_ci break; 73413498266Sopenharmony_ci#endif 73513498266Sopenharmony_ci case CURLOPT_HEADEROPT: 73613498266Sopenharmony_ci /* 73713498266Sopenharmony_ci * Set header option. 73813498266Sopenharmony_ci */ 73913498266Sopenharmony_ci arg = va_arg(param, long); 74013498266Sopenharmony_ci data->set.sep_headers = !!(arg & CURLHEADER_SEPARATE); 74113498266Sopenharmony_ci break; 74213498266Sopenharmony_ci 74313498266Sopenharmony_ci#if !defined(CURL_DISABLE_COOKIES) 74413498266Sopenharmony_ci case CURLOPT_COOKIE: 74513498266Sopenharmony_ci /* 74613498266Sopenharmony_ci * Cookie string to send to the remote server in the request. 74713498266Sopenharmony_ci */ 74813498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_COOKIE], 74913498266Sopenharmony_ci va_arg(param, char *)); 75013498266Sopenharmony_ci break; 75113498266Sopenharmony_ci 75213498266Sopenharmony_ci case CURLOPT_COOKIEFILE: 75313498266Sopenharmony_ci /* 75413498266Sopenharmony_ci * Set cookie file to read and parse. Can be used multiple times. 75513498266Sopenharmony_ci */ 75613498266Sopenharmony_ci argptr = (char *)va_arg(param, void *); 75713498266Sopenharmony_ci if(argptr) { 75813498266Sopenharmony_ci struct curl_slist *cl; 75913498266Sopenharmony_ci /* general protection against mistakes and abuse */ 76013498266Sopenharmony_ci if(strlen(argptr) > CURL_MAX_INPUT_LENGTH) 76113498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 76213498266Sopenharmony_ci /* append the cookie file name to the list of file names, and deal with 76313498266Sopenharmony_ci them later */ 76413498266Sopenharmony_ci cl = curl_slist_append(data->state.cookielist, argptr); 76513498266Sopenharmony_ci if(!cl) { 76613498266Sopenharmony_ci curl_slist_free_all(data->state.cookielist); 76713498266Sopenharmony_ci data->state.cookielist = NULL; 76813498266Sopenharmony_ci return CURLE_OUT_OF_MEMORY; 76913498266Sopenharmony_ci } 77013498266Sopenharmony_ci data->state.cookielist = cl; /* store the list for later use */ 77113498266Sopenharmony_ci } 77213498266Sopenharmony_ci else { 77313498266Sopenharmony_ci /* clear the list of cookie files */ 77413498266Sopenharmony_ci curl_slist_free_all(data->state.cookielist); 77513498266Sopenharmony_ci data->state.cookielist = NULL; 77613498266Sopenharmony_ci 77713498266Sopenharmony_ci if(!data->share || !data->share->cookies) { 77813498266Sopenharmony_ci /* throw away all existing cookies if this isn't a shared cookie 77913498266Sopenharmony_ci container */ 78013498266Sopenharmony_ci Curl_cookie_clearall(data->cookies); 78113498266Sopenharmony_ci Curl_cookie_cleanup(data->cookies); 78213498266Sopenharmony_ci } 78313498266Sopenharmony_ci /* disable the cookie engine */ 78413498266Sopenharmony_ci data->cookies = NULL; 78513498266Sopenharmony_ci } 78613498266Sopenharmony_ci break; 78713498266Sopenharmony_ci 78813498266Sopenharmony_ci case CURLOPT_COOKIEJAR: 78913498266Sopenharmony_ci /* 79013498266Sopenharmony_ci * Set cookie file name to dump all cookies to when we're done. 79113498266Sopenharmony_ci */ 79213498266Sopenharmony_ci { 79313498266Sopenharmony_ci struct CookieInfo *newcookies; 79413498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_COOKIEJAR], 79513498266Sopenharmony_ci va_arg(param, char *)); 79613498266Sopenharmony_ci 79713498266Sopenharmony_ci /* 79813498266Sopenharmony_ci * Activate the cookie parser. This may or may not already 79913498266Sopenharmony_ci * have been made. 80013498266Sopenharmony_ci */ 80113498266Sopenharmony_ci newcookies = Curl_cookie_init(data, NULL, data->cookies, 80213498266Sopenharmony_ci data->set.cookiesession); 80313498266Sopenharmony_ci if(!newcookies) 80413498266Sopenharmony_ci result = CURLE_OUT_OF_MEMORY; 80513498266Sopenharmony_ci data->cookies = newcookies; 80613498266Sopenharmony_ci } 80713498266Sopenharmony_ci break; 80813498266Sopenharmony_ci 80913498266Sopenharmony_ci case CURLOPT_COOKIESESSION: 81013498266Sopenharmony_ci /* 81113498266Sopenharmony_ci * Set this option to TRUE to start a new "cookie session". It will 81213498266Sopenharmony_ci * prevent the forthcoming read-cookies-from-file actions to accept 81313498266Sopenharmony_ci * cookies that are marked as being session cookies, as they belong to a 81413498266Sopenharmony_ci * previous session. 81513498266Sopenharmony_ci */ 81613498266Sopenharmony_ci data->set.cookiesession = (0 != va_arg(param, long)); 81713498266Sopenharmony_ci break; 81813498266Sopenharmony_ci 81913498266Sopenharmony_ci case CURLOPT_COOKIELIST: 82013498266Sopenharmony_ci argptr = va_arg(param, char *); 82113498266Sopenharmony_ci 82213498266Sopenharmony_ci if(!argptr) 82313498266Sopenharmony_ci break; 82413498266Sopenharmony_ci 82513498266Sopenharmony_ci if(strcasecompare(argptr, "ALL")) { 82613498266Sopenharmony_ci /* clear all cookies */ 82713498266Sopenharmony_ci Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE); 82813498266Sopenharmony_ci Curl_cookie_clearall(data->cookies); 82913498266Sopenharmony_ci Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE); 83013498266Sopenharmony_ci } 83113498266Sopenharmony_ci else if(strcasecompare(argptr, "SESS")) { 83213498266Sopenharmony_ci /* clear session cookies */ 83313498266Sopenharmony_ci Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE); 83413498266Sopenharmony_ci Curl_cookie_clearsess(data->cookies); 83513498266Sopenharmony_ci Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE); 83613498266Sopenharmony_ci } 83713498266Sopenharmony_ci else if(strcasecompare(argptr, "FLUSH")) { 83813498266Sopenharmony_ci /* flush cookies to file, takes care of the locking */ 83913498266Sopenharmony_ci Curl_flush_cookies(data, FALSE); 84013498266Sopenharmony_ci } 84113498266Sopenharmony_ci else if(strcasecompare(argptr, "RELOAD")) { 84213498266Sopenharmony_ci /* reload cookies from file */ 84313498266Sopenharmony_ci Curl_cookie_loadfiles(data); 84413498266Sopenharmony_ci break; 84513498266Sopenharmony_ci } 84613498266Sopenharmony_ci else { 84713498266Sopenharmony_ci if(!data->cookies) 84813498266Sopenharmony_ci /* if cookie engine was not running, activate it */ 84913498266Sopenharmony_ci data->cookies = Curl_cookie_init(data, NULL, NULL, TRUE); 85013498266Sopenharmony_ci 85113498266Sopenharmony_ci /* general protection against mistakes and abuse */ 85213498266Sopenharmony_ci if(strlen(argptr) > CURL_MAX_INPUT_LENGTH) 85313498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 85413498266Sopenharmony_ci argptr = strdup(argptr); 85513498266Sopenharmony_ci if(!argptr || !data->cookies) { 85613498266Sopenharmony_ci result = CURLE_OUT_OF_MEMORY; 85713498266Sopenharmony_ci free(argptr); 85813498266Sopenharmony_ci } 85913498266Sopenharmony_ci else { 86013498266Sopenharmony_ci Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE); 86113498266Sopenharmony_ci 86213498266Sopenharmony_ci if(checkprefix("Set-Cookie:", argptr)) 86313498266Sopenharmony_ci /* HTTP Header format line */ 86413498266Sopenharmony_ci Curl_cookie_add(data, data->cookies, TRUE, FALSE, argptr + 11, NULL, 86513498266Sopenharmony_ci NULL, TRUE); 86613498266Sopenharmony_ci 86713498266Sopenharmony_ci else 86813498266Sopenharmony_ci /* Netscape format line */ 86913498266Sopenharmony_ci Curl_cookie_add(data, data->cookies, FALSE, FALSE, argptr, NULL, 87013498266Sopenharmony_ci NULL, TRUE); 87113498266Sopenharmony_ci 87213498266Sopenharmony_ci Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE); 87313498266Sopenharmony_ci free(argptr); 87413498266Sopenharmony_ci } 87513498266Sopenharmony_ci } 87613498266Sopenharmony_ci 87713498266Sopenharmony_ci break; 87813498266Sopenharmony_ci#endif /* !CURL_DISABLE_COOKIES */ 87913498266Sopenharmony_ci 88013498266Sopenharmony_ci case CURLOPT_HTTPGET: 88113498266Sopenharmony_ci /* 88213498266Sopenharmony_ci * Set to force us do HTTP GET 88313498266Sopenharmony_ci */ 88413498266Sopenharmony_ci if(va_arg(param, long)) { 88513498266Sopenharmony_ci data->set.method = HTTPREQ_GET; 88613498266Sopenharmony_ci data->set.opt_no_body = FALSE; /* this is implied */ 88713498266Sopenharmony_ci } 88813498266Sopenharmony_ci break; 88913498266Sopenharmony_ci 89013498266Sopenharmony_ci case CURLOPT_HTTP_VERSION: 89113498266Sopenharmony_ci /* 89213498266Sopenharmony_ci * This sets a requested HTTP version to be used. The value is one of 89313498266Sopenharmony_ci * the listed enums in curl/curl.h. 89413498266Sopenharmony_ci */ 89513498266Sopenharmony_ci arg = va_arg(param, long); 89613498266Sopenharmony_ci switch(arg) { 89713498266Sopenharmony_ci case CURL_HTTP_VERSION_NONE: 89813498266Sopenharmony_ci#ifdef USE_HTTP2 89913498266Sopenharmony_ci /* TODO: this seems an undesirable quirk to force a behaviour on 90013498266Sopenharmony_ci * lower implementations that they should recognize independently? */ 90113498266Sopenharmony_ci arg = CURL_HTTP_VERSION_2TLS; 90213498266Sopenharmony_ci#endif 90313498266Sopenharmony_ci /* accepted */ 90413498266Sopenharmony_ci break; 90513498266Sopenharmony_ci case CURL_HTTP_VERSION_1_0: 90613498266Sopenharmony_ci case CURL_HTTP_VERSION_1_1: 90713498266Sopenharmony_ci /* accepted */ 90813498266Sopenharmony_ci break; 90913498266Sopenharmony_ci#ifdef USE_HTTP2 91013498266Sopenharmony_ci case CURL_HTTP_VERSION_2_0: 91113498266Sopenharmony_ci case CURL_HTTP_VERSION_2TLS: 91213498266Sopenharmony_ci case CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE: 91313498266Sopenharmony_ci /* accepted */ 91413498266Sopenharmony_ci break; 91513498266Sopenharmony_ci#endif 91613498266Sopenharmony_ci#ifdef ENABLE_QUIC 91713498266Sopenharmony_ci case CURL_HTTP_VERSION_3: 91813498266Sopenharmony_ci case CURL_HTTP_VERSION_3ONLY: 91913498266Sopenharmony_ci /* accepted */ 92013498266Sopenharmony_ci break; 92113498266Sopenharmony_ci#endif 92213498266Sopenharmony_ci default: 92313498266Sopenharmony_ci /* not accepted */ 92413498266Sopenharmony_ci if(arg < CURL_HTTP_VERSION_NONE) 92513498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 92613498266Sopenharmony_ci return CURLE_UNSUPPORTED_PROTOCOL; 92713498266Sopenharmony_ci } 92813498266Sopenharmony_ci data->set.httpwant = (unsigned char)arg; 92913498266Sopenharmony_ci break; 93013498266Sopenharmony_ci 93113498266Sopenharmony_ci case CURLOPT_EXPECT_100_TIMEOUT_MS: 93213498266Sopenharmony_ci /* 93313498266Sopenharmony_ci * Time to wait for a response to an HTTP request containing an 93413498266Sopenharmony_ci * Expect: 100-continue header before sending the data anyway. 93513498266Sopenharmony_ci */ 93613498266Sopenharmony_ci arg = va_arg(param, long); 93713498266Sopenharmony_ci if(arg < 0) 93813498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 93913498266Sopenharmony_ci data->set.expect_100_timeout = arg; 94013498266Sopenharmony_ci break; 94113498266Sopenharmony_ci 94213498266Sopenharmony_ci case CURLOPT_HTTP09_ALLOWED: 94313498266Sopenharmony_ci arg = va_arg(param, unsigned long); 94413498266Sopenharmony_ci if(arg > 1L) 94513498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 94613498266Sopenharmony_ci#ifdef USE_HYPER 94713498266Sopenharmony_ci /* Hyper does not support HTTP/0.9 */ 94813498266Sopenharmony_ci if(arg) 94913498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 95013498266Sopenharmony_ci#else 95113498266Sopenharmony_ci data->set.http09_allowed = !!arg; 95213498266Sopenharmony_ci#endif 95313498266Sopenharmony_ci break; 95413498266Sopenharmony_ci 95513498266Sopenharmony_ci case CURLOPT_HTTP200ALIASES: 95613498266Sopenharmony_ci /* 95713498266Sopenharmony_ci * Set a list of aliases for HTTP 200 in response header 95813498266Sopenharmony_ci */ 95913498266Sopenharmony_ci data->set.http200aliases = va_arg(param, struct curl_slist *); 96013498266Sopenharmony_ci break; 96113498266Sopenharmony_ci#endif /* CURL_DISABLE_HTTP */ 96213498266Sopenharmony_ci 96313498266Sopenharmony_ci#if !defined(CURL_DISABLE_HTTP) || !defined(CURL_DISABLE_SMTP) || \ 96413498266Sopenharmony_ci !defined(CURL_DISABLE_IMAP) 96513498266Sopenharmony_ci# if !defined(CURL_DISABLE_HTTP) || !defined(CURL_DISABLE_MIME) 96613498266Sopenharmony_ci case CURLOPT_HTTPHEADER: 96713498266Sopenharmony_ci /* 96813498266Sopenharmony_ci * Set a list with HTTP headers to use (or replace internals with) 96913498266Sopenharmony_ci */ 97013498266Sopenharmony_ci data->set.headers = va_arg(param, struct curl_slist *); 97113498266Sopenharmony_ci break; 97213498266Sopenharmony_ci# endif 97313498266Sopenharmony_ci 97413498266Sopenharmony_ci# ifndef CURL_DISABLE_MIME 97513498266Sopenharmony_ci case CURLOPT_MIMEPOST: 97613498266Sopenharmony_ci /* 97713498266Sopenharmony_ci * Set to make us do MIME POST 97813498266Sopenharmony_ci */ 97913498266Sopenharmony_ci result = Curl_mime_set_subparts(&data->set.mimepost, 98013498266Sopenharmony_ci va_arg(param, curl_mime *), FALSE); 98113498266Sopenharmony_ci if(!result) { 98213498266Sopenharmony_ci data->set.method = HTTPREQ_POST_MIME; 98313498266Sopenharmony_ci data->set.opt_no_body = FALSE; /* this is implied */ 98413498266Sopenharmony_ci#ifndef CURL_DISABLE_FORM_API 98513498266Sopenharmony_ci Curl_mime_cleanpart(data->state.formp); 98613498266Sopenharmony_ci Curl_safefree(data->state.formp); 98713498266Sopenharmony_ci data->state.mimepost = NULL; 98813498266Sopenharmony_ci#endif 98913498266Sopenharmony_ci } 99013498266Sopenharmony_ci break; 99113498266Sopenharmony_ci 99213498266Sopenharmony_ci case CURLOPT_MIME_OPTIONS: 99313498266Sopenharmony_ci arg = va_arg(param, long); 99413498266Sopenharmony_ci data->set.mime_formescape = !!(arg & CURLMIMEOPT_FORMESCAPE); 99513498266Sopenharmony_ci break; 99613498266Sopenharmony_ci# endif 99713498266Sopenharmony_ci#endif 99813498266Sopenharmony_ci 99913498266Sopenharmony_ci case CURLOPT_HTTPAUTH: 100013498266Sopenharmony_ci /* 100113498266Sopenharmony_ci * Set HTTP Authentication type BITMASK. 100213498266Sopenharmony_ci */ 100313498266Sopenharmony_ci { 100413498266Sopenharmony_ci int bitcheck; 100513498266Sopenharmony_ci bool authbits; 100613498266Sopenharmony_ci unsigned long auth = va_arg(param, unsigned long); 100713498266Sopenharmony_ci 100813498266Sopenharmony_ci if(auth == CURLAUTH_NONE) { 100913498266Sopenharmony_ci data->set.httpauth = auth; 101013498266Sopenharmony_ci break; 101113498266Sopenharmony_ci } 101213498266Sopenharmony_ci 101313498266Sopenharmony_ci /* the DIGEST_IE bit is only used to set a special marker, for all the 101413498266Sopenharmony_ci rest we need to handle it as normal DIGEST */ 101513498266Sopenharmony_ci data->state.authhost.iestyle = !!(auth & CURLAUTH_DIGEST_IE); 101613498266Sopenharmony_ci 101713498266Sopenharmony_ci if(auth & CURLAUTH_DIGEST_IE) { 101813498266Sopenharmony_ci auth |= CURLAUTH_DIGEST; /* set standard digest bit */ 101913498266Sopenharmony_ci auth &= ~CURLAUTH_DIGEST_IE; /* unset ie digest bit */ 102013498266Sopenharmony_ci } 102113498266Sopenharmony_ci 102213498266Sopenharmony_ci /* switch off bits we can't support */ 102313498266Sopenharmony_ci#ifndef USE_NTLM 102413498266Sopenharmony_ci auth &= ~CURLAUTH_NTLM; /* no NTLM support */ 102513498266Sopenharmony_ci auth &= ~CURLAUTH_NTLM_WB; /* no NTLM_WB support */ 102613498266Sopenharmony_ci#elif !defined(NTLM_WB_ENABLED) 102713498266Sopenharmony_ci auth &= ~CURLAUTH_NTLM_WB; /* no NTLM_WB support */ 102813498266Sopenharmony_ci#endif 102913498266Sopenharmony_ci#ifndef USE_SPNEGO 103013498266Sopenharmony_ci auth &= ~CURLAUTH_NEGOTIATE; /* no Negotiate (SPNEGO) auth without 103113498266Sopenharmony_ci GSS-API or SSPI */ 103213498266Sopenharmony_ci#endif 103313498266Sopenharmony_ci 103413498266Sopenharmony_ci /* check if any auth bit lower than CURLAUTH_ONLY is still set */ 103513498266Sopenharmony_ci bitcheck = 0; 103613498266Sopenharmony_ci authbits = FALSE; 103713498266Sopenharmony_ci while(bitcheck < 31) { 103813498266Sopenharmony_ci if(auth & (1UL << bitcheck++)) { 103913498266Sopenharmony_ci authbits = TRUE; 104013498266Sopenharmony_ci break; 104113498266Sopenharmony_ci } 104213498266Sopenharmony_ci } 104313498266Sopenharmony_ci if(!authbits) 104413498266Sopenharmony_ci return CURLE_NOT_BUILT_IN; /* no supported types left! */ 104513498266Sopenharmony_ci 104613498266Sopenharmony_ci data->set.httpauth = auth; 104713498266Sopenharmony_ci } 104813498266Sopenharmony_ci break; 104913498266Sopenharmony_ci 105013498266Sopenharmony_ci case CURLOPT_CUSTOMREQUEST: 105113498266Sopenharmony_ci /* 105213498266Sopenharmony_ci * Set a custom string to use as request 105313498266Sopenharmony_ci */ 105413498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_CUSTOMREQUEST], 105513498266Sopenharmony_ci va_arg(param, char *)); 105613498266Sopenharmony_ci 105713498266Sopenharmony_ci /* we don't set 105813498266Sopenharmony_ci data->set.method = HTTPREQ_CUSTOM; 105913498266Sopenharmony_ci here, we continue as if we were using the already set type 106013498266Sopenharmony_ci and this just changes the actual request keyword */ 106113498266Sopenharmony_ci break; 106213498266Sopenharmony_ci 106313498266Sopenharmony_ci#ifndef CURL_DISABLE_PROXY 106413498266Sopenharmony_ci case CURLOPT_HTTPPROXYTUNNEL: 106513498266Sopenharmony_ci /* 106613498266Sopenharmony_ci * Tunnel operations through the proxy instead of normal proxy use 106713498266Sopenharmony_ci */ 106813498266Sopenharmony_ci data->set.tunnel_thru_httpproxy = (0 != va_arg(param, long)); 106913498266Sopenharmony_ci break; 107013498266Sopenharmony_ci 107113498266Sopenharmony_ci case CURLOPT_PROXYPORT: 107213498266Sopenharmony_ci /* 107313498266Sopenharmony_ci * Explicitly set HTTP proxy port number. 107413498266Sopenharmony_ci */ 107513498266Sopenharmony_ci arg = va_arg(param, long); 107613498266Sopenharmony_ci if((arg < 0) || (arg > 65535)) 107713498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 107813498266Sopenharmony_ci data->set.proxyport = (unsigned short)arg; 107913498266Sopenharmony_ci break; 108013498266Sopenharmony_ci 108113498266Sopenharmony_ci case CURLOPT_PROXYAUTH: 108213498266Sopenharmony_ci /* 108313498266Sopenharmony_ci * Set HTTP Authentication type BITMASK. 108413498266Sopenharmony_ci */ 108513498266Sopenharmony_ci { 108613498266Sopenharmony_ci int bitcheck; 108713498266Sopenharmony_ci bool authbits; 108813498266Sopenharmony_ci unsigned long auth = va_arg(param, unsigned long); 108913498266Sopenharmony_ci 109013498266Sopenharmony_ci if(auth == CURLAUTH_NONE) { 109113498266Sopenharmony_ci data->set.proxyauth = auth; 109213498266Sopenharmony_ci break; 109313498266Sopenharmony_ci } 109413498266Sopenharmony_ci 109513498266Sopenharmony_ci /* the DIGEST_IE bit is only used to set a special marker, for all the 109613498266Sopenharmony_ci rest we need to handle it as normal DIGEST */ 109713498266Sopenharmony_ci data->state.authproxy.iestyle = !!(auth & CURLAUTH_DIGEST_IE); 109813498266Sopenharmony_ci 109913498266Sopenharmony_ci if(auth & CURLAUTH_DIGEST_IE) { 110013498266Sopenharmony_ci auth |= CURLAUTH_DIGEST; /* set standard digest bit */ 110113498266Sopenharmony_ci auth &= ~CURLAUTH_DIGEST_IE; /* unset ie digest bit */ 110213498266Sopenharmony_ci } 110313498266Sopenharmony_ci /* switch off bits we can't support */ 110413498266Sopenharmony_ci#ifndef USE_NTLM 110513498266Sopenharmony_ci auth &= ~CURLAUTH_NTLM; /* no NTLM support */ 110613498266Sopenharmony_ci auth &= ~CURLAUTH_NTLM_WB; /* no NTLM_WB support */ 110713498266Sopenharmony_ci#elif !defined(NTLM_WB_ENABLED) 110813498266Sopenharmony_ci auth &= ~CURLAUTH_NTLM_WB; /* no NTLM_WB support */ 110913498266Sopenharmony_ci#endif 111013498266Sopenharmony_ci#ifndef USE_SPNEGO 111113498266Sopenharmony_ci auth &= ~CURLAUTH_NEGOTIATE; /* no Negotiate (SPNEGO) auth without 111213498266Sopenharmony_ci GSS-API or SSPI */ 111313498266Sopenharmony_ci#endif 111413498266Sopenharmony_ci 111513498266Sopenharmony_ci /* check if any auth bit lower than CURLAUTH_ONLY is still set */ 111613498266Sopenharmony_ci bitcheck = 0; 111713498266Sopenharmony_ci authbits = FALSE; 111813498266Sopenharmony_ci while(bitcheck < 31) { 111913498266Sopenharmony_ci if(auth & (1UL << bitcheck++)) { 112013498266Sopenharmony_ci authbits = TRUE; 112113498266Sopenharmony_ci break; 112213498266Sopenharmony_ci } 112313498266Sopenharmony_ci } 112413498266Sopenharmony_ci if(!authbits) 112513498266Sopenharmony_ci return CURLE_NOT_BUILT_IN; /* no supported types left! */ 112613498266Sopenharmony_ci 112713498266Sopenharmony_ci data->set.proxyauth = auth; 112813498266Sopenharmony_ci } 112913498266Sopenharmony_ci break; 113013498266Sopenharmony_ci 113113498266Sopenharmony_ci case CURLOPT_PROXY: 113213498266Sopenharmony_ci /* 113313498266Sopenharmony_ci * Set proxy server:port to use as proxy. 113413498266Sopenharmony_ci * 113513498266Sopenharmony_ci * If the proxy is set to "" (and CURLOPT_SOCKS_PROXY is set to "" or NULL) 113613498266Sopenharmony_ci * we explicitly say that we don't want to use a proxy 113713498266Sopenharmony_ci * (even though there might be environment variables saying so). 113813498266Sopenharmony_ci * 113913498266Sopenharmony_ci * Setting it to NULL, means no proxy but allows the environment variables 114013498266Sopenharmony_ci * to decide for us (if CURLOPT_SOCKS_PROXY setting it to NULL). 114113498266Sopenharmony_ci */ 114213498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_PROXY], 114313498266Sopenharmony_ci va_arg(param, char *)); 114413498266Sopenharmony_ci break; 114513498266Sopenharmony_ci 114613498266Sopenharmony_ci case CURLOPT_PRE_PROXY: 114713498266Sopenharmony_ci /* 114813498266Sopenharmony_ci * Set proxy server:port to use as SOCKS proxy. 114913498266Sopenharmony_ci * 115013498266Sopenharmony_ci * If the proxy is set to "" or NULL we explicitly say that we don't want 115113498266Sopenharmony_ci * to use the socks proxy. 115213498266Sopenharmony_ci */ 115313498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_PRE_PROXY], 115413498266Sopenharmony_ci va_arg(param, char *)); 115513498266Sopenharmony_ci break; 115613498266Sopenharmony_ci 115713498266Sopenharmony_ci case CURLOPT_PROXYTYPE: 115813498266Sopenharmony_ci /* 115913498266Sopenharmony_ci * Set proxy type. 116013498266Sopenharmony_ci */ 116113498266Sopenharmony_ci arg = va_arg(param, long); 116213498266Sopenharmony_ci if((arg < CURLPROXY_HTTP) || (arg > CURLPROXY_SOCKS5_HOSTNAME)) 116313498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 116413498266Sopenharmony_ci data->set.proxytype = (unsigned char)(curl_proxytype)arg; 116513498266Sopenharmony_ci break; 116613498266Sopenharmony_ci 116713498266Sopenharmony_ci case CURLOPT_PROXY_TRANSFER_MODE: 116813498266Sopenharmony_ci /* 116913498266Sopenharmony_ci * set transfer mode (;type=<a|i>) when doing FTP via an HTTP proxy 117013498266Sopenharmony_ci */ 117113498266Sopenharmony_ci switch(va_arg(param, long)) { 117213498266Sopenharmony_ci case 0: 117313498266Sopenharmony_ci data->set.proxy_transfer_mode = FALSE; 117413498266Sopenharmony_ci break; 117513498266Sopenharmony_ci case 1: 117613498266Sopenharmony_ci data->set.proxy_transfer_mode = TRUE; 117713498266Sopenharmony_ci break; 117813498266Sopenharmony_ci default: 117913498266Sopenharmony_ci /* reserve other values for future use */ 118013498266Sopenharmony_ci result = CURLE_BAD_FUNCTION_ARGUMENT; 118113498266Sopenharmony_ci break; 118213498266Sopenharmony_ci } 118313498266Sopenharmony_ci break; 118413498266Sopenharmony_ci 118513498266Sopenharmony_ci case CURLOPT_SOCKS5_AUTH: 118613498266Sopenharmony_ci data->set.socks5auth = (unsigned char)va_arg(param, unsigned long); 118713498266Sopenharmony_ci if(data->set.socks5auth & ~(CURLAUTH_BASIC | CURLAUTH_GSSAPI)) 118813498266Sopenharmony_ci result = CURLE_NOT_BUILT_IN; 118913498266Sopenharmony_ci break; 119013498266Sopenharmony_ci#endif /* CURL_DISABLE_PROXY */ 119113498266Sopenharmony_ci 119213498266Sopenharmony_ci#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) 119313498266Sopenharmony_ci case CURLOPT_SOCKS5_GSSAPI_NEC: 119413498266Sopenharmony_ci /* 119513498266Sopenharmony_ci * Set flag for NEC SOCK5 support 119613498266Sopenharmony_ci */ 119713498266Sopenharmony_ci data->set.socks5_gssapi_nec = (0 != va_arg(param, long)); 119813498266Sopenharmony_ci break; 119913498266Sopenharmony_ci#endif 120013498266Sopenharmony_ci#ifndef CURL_DISABLE_PROXY 120113498266Sopenharmony_ci case CURLOPT_SOCKS5_GSSAPI_SERVICE: 120213498266Sopenharmony_ci case CURLOPT_PROXY_SERVICE_NAME: 120313498266Sopenharmony_ci /* 120413498266Sopenharmony_ci * Set proxy authentication service name for Kerberos 5 and SPNEGO 120513498266Sopenharmony_ci */ 120613498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_PROXY_SERVICE_NAME], 120713498266Sopenharmony_ci va_arg(param, char *)); 120813498266Sopenharmony_ci break; 120913498266Sopenharmony_ci#endif 121013498266Sopenharmony_ci case CURLOPT_SERVICE_NAME: 121113498266Sopenharmony_ci /* 121213498266Sopenharmony_ci * Set authentication service name for DIGEST-MD5, Kerberos 5 and SPNEGO 121313498266Sopenharmony_ci */ 121413498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_SERVICE_NAME], 121513498266Sopenharmony_ci va_arg(param, char *)); 121613498266Sopenharmony_ci break; 121713498266Sopenharmony_ci 121813498266Sopenharmony_ci case CURLOPT_HEADERDATA: 121913498266Sopenharmony_ci /* 122013498266Sopenharmony_ci * Custom pointer to pass the header write callback function 122113498266Sopenharmony_ci */ 122213498266Sopenharmony_ci data->set.writeheader = (void *)va_arg(param, void *); 122313498266Sopenharmony_ci break; 122413498266Sopenharmony_ci case CURLOPT_ERRORBUFFER: 122513498266Sopenharmony_ci /* 122613498266Sopenharmony_ci * Error buffer provided by the caller to get the human readable 122713498266Sopenharmony_ci * error string in. 122813498266Sopenharmony_ci */ 122913498266Sopenharmony_ci data->set.errorbuffer = va_arg(param, char *); 123013498266Sopenharmony_ci break; 123113498266Sopenharmony_ci case CURLOPT_WRITEDATA: 123213498266Sopenharmony_ci /* 123313498266Sopenharmony_ci * FILE pointer to write to. Or possibly 123413498266Sopenharmony_ci * used as argument to the write callback. 123513498266Sopenharmony_ci */ 123613498266Sopenharmony_ci data->set.out = va_arg(param, void *); 123713498266Sopenharmony_ci break; 123813498266Sopenharmony_ci 123913498266Sopenharmony_ci#ifdef CURL_LIST_ONLY_PROTOCOL 124013498266Sopenharmony_ci case CURLOPT_DIRLISTONLY: 124113498266Sopenharmony_ci /* 124213498266Sopenharmony_ci * An option that changes the command to one that asks for a list only, no 124313498266Sopenharmony_ci * file info details. Used for FTP, POP3 and SFTP. 124413498266Sopenharmony_ci */ 124513498266Sopenharmony_ci data->set.list_only = (0 != va_arg(param, long)); 124613498266Sopenharmony_ci break; 124713498266Sopenharmony_ci#endif 124813498266Sopenharmony_ci case CURLOPT_APPEND: 124913498266Sopenharmony_ci /* 125013498266Sopenharmony_ci * We want to upload and append to an existing file. Used for FTP and 125113498266Sopenharmony_ci * SFTP. 125213498266Sopenharmony_ci */ 125313498266Sopenharmony_ci data->set.remote_append = (0 != va_arg(param, long)); 125413498266Sopenharmony_ci break; 125513498266Sopenharmony_ci 125613498266Sopenharmony_ci#ifndef CURL_DISABLE_FTP 125713498266Sopenharmony_ci case CURLOPT_FTP_FILEMETHOD: 125813498266Sopenharmony_ci /* 125913498266Sopenharmony_ci * How do access files over FTP. 126013498266Sopenharmony_ci */ 126113498266Sopenharmony_ci arg = va_arg(param, long); 126213498266Sopenharmony_ci if((arg < CURLFTPMETHOD_DEFAULT) || (arg >= CURLFTPMETHOD_LAST)) 126313498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 126413498266Sopenharmony_ci data->set.ftp_filemethod = (unsigned char)arg; 126513498266Sopenharmony_ci break; 126613498266Sopenharmony_ci case CURLOPT_FTPPORT: 126713498266Sopenharmony_ci /* 126813498266Sopenharmony_ci * Use FTP PORT, this also specifies which IP address to use 126913498266Sopenharmony_ci */ 127013498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_FTPPORT], 127113498266Sopenharmony_ci va_arg(param, char *)); 127213498266Sopenharmony_ci data->set.ftp_use_port = !!(data->set.str[STRING_FTPPORT]); 127313498266Sopenharmony_ci break; 127413498266Sopenharmony_ci 127513498266Sopenharmony_ci case CURLOPT_FTP_USE_EPRT: 127613498266Sopenharmony_ci data->set.ftp_use_eprt = (0 != va_arg(param, long)); 127713498266Sopenharmony_ci break; 127813498266Sopenharmony_ci 127913498266Sopenharmony_ci case CURLOPT_FTP_USE_EPSV: 128013498266Sopenharmony_ci data->set.ftp_use_epsv = (0 != va_arg(param, long)); 128113498266Sopenharmony_ci break; 128213498266Sopenharmony_ci 128313498266Sopenharmony_ci case CURLOPT_FTP_USE_PRET: 128413498266Sopenharmony_ci data->set.ftp_use_pret = (0 != va_arg(param, long)); 128513498266Sopenharmony_ci break; 128613498266Sopenharmony_ci 128713498266Sopenharmony_ci case CURLOPT_FTP_SSL_CCC: 128813498266Sopenharmony_ci arg = va_arg(param, long); 128913498266Sopenharmony_ci if((arg < CURLFTPSSL_CCC_NONE) || (arg >= CURLFTPSSL_CCC_LAST)) 129013498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 129113498266Sopenharmony_ci data->set.ftp_ccc = (unsigned char)arg; 129213498266Sopenharmony_ci break; 129313498266Sopenharmony_ci 129413498266Sopenharmony_ci case CURLOPT_FTP_SKIP_PASV_IP: 129513498266Sopenharmony_ci /* 129613498266Sopenharmony_ci * Enable or disable FTP_SKIP_PASV_IP, which will disable/enable the 129713498266Sopenharmony_ci * bypass of the IP address in PASV responses. 129813498266Sopenharmony_ci */ 129913498266Sopenharmony_ci data->set.ftp_skip_ip = (0 != va_arg(param, long)); 130013498266Sopenharmony_ci break; 130113498266Sopenharmony_ci 130213498266Sopenharmony_ci case CURLOPT_FTP_ACCOUNT: 130313498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_FTP_ACCOUNT], 130413498266Sopenharmony_ci va_arg(param, char *)); 130513498266Sopenharmony_ci break; 130613498266Sopenharmony_ci 130713498266Sopenharmony_ci case CURLOPT_FTP_ALTERNATIVE_TO_USER: 130813498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_FTP_ALTERNATIVE_TO_USER], 130913498266Sopenharmony_ci va_arg(param, char *)); 131013498266Sopenharmony_ci break; 131113498266Sopenharmony_ci 131213498266Sopenharmony_ci case CURLOPT_FTPSSLAUTH: 131313498266Sopenharmony_ci /* 131413498266Sopenharmony_ci * Set a specific auth for FTP-SSL transfers. 131513498266Sopenharmony_ci */ 131613498266Sopenharmony_ci arg = va_arg(param, long); 131713498266Sopenharmony_ci if((arg < CURLFTPAUTH_DEFAULT) || (arg >= CURLFTPAUTH_LAST)) 131813498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 131913498266Sopenharmony_ci data->set.ftpsslauth = (unsigned char)(curl_ftpauth)arg; 132013498266Sopenharmony_ci break; 132113498266Sopenharmony_ci case CURLOPT_KRBLEVEL: 132213498266Sopenharmony_ci /* 132313498266Sopenharmony_ci * A string that defines the kerberos security level. 132413498266Sopenharmony_ci */ 132513498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_KRB_LEVEL], 132613498266Sopenharmony_ci va_arg(param, char *)); 132713498266Sopenharmony_ci data->set.krb = !!(data->set.str[STRING_KRB_LEVEL]); 132813498266Sopenharmony_ci break; 132913498266Sopenharmony_ci#endif 133013498266Sopenharmony_ci#if !defined(CURL_DISABLE_FTP) || defined(USE_SSH) 133113498266Sopenharmony_ci case CURLOPT_FTP_CREATE_MISSING_DIRS: 133213498266Sopenharmony_ci /* 133313498266Sopenharmony_ci * An FTP/SFTP option that modifies an upload to create missing 133413498266Sopenharmony_ci * directories on the server. 133513498266Sopenharmony_ci */ 133613498266Sopenharmony_ci arg = va_arg(param, long); 133713498266Sopenharmony_ci /* reserve other values for future use */ 133813498266Sopenharmony_ci if((arg < CURLFTP_CREATE_DIR_NONE) || 133913498266Sopenharmony_ci (arg > CURLFTP_CREATE_DIR_RETRY)) 134013498266Sopenharmony_ci result = CURLE_BAD_FUNCTION_ARGUMENT; 134113498266Sopenharmony_ci else 134213498266Sopenharmony_ci data->set.ftp_create_missing_dirs = (unsigned char)arg; 134313498266Sopenharmony_ci break; 134413498266Sopenharmony_ci 134513498266Sopenharmony_ci case CURLOPT_POSTQUOTE: 134613498266Sopenharmony_ci /* 134713498266Sopenharmony_ci * List of RAW FTP commands to use after a transfer 134813498266Sopenharmony_ci */ 134913498266Sopenharmony_ci data->set.postquote = va_arg(param, struct curl_slist *); 135013498266Sopenharmony_ci break; 135113498266Sopenharmony_ci case CURLOPT_PREQUOTE: 135213498266Sopenharmony_ci /* 135313498266Sopenharmony_ci * List of RAW FTP commands to use prior to RETR (Wesley Laxton) 135413498266Sopenharmony_ci */ 135513498266Sopenharmony_ci data->set.prequote = va_arg(param, struct curl_slist *); 135613498266Sopenharmony_ci break; 135713498266Sopenharmony_ci case CURLOPT_QUOTE: 135813498266Sopenharmony_ci /* 135913498266Sopenharmony_ci * List of RAW FTP commands to use before a transfer 136013498266Sopenharmony_ci */ 136113498266Sopenharmony_ci data->set.quote = va_arg(param, struct curl_slist *); 136213498266Sopenharmony_ci break; 136313498266Sopenharmony_ci#endif 136413498266Sopenharmony_ci case CURLOPT_READDATA: 136513498266Sopenharmony_ci /* 136613498266Sopenharmony_ci * FILE pointer to read the file to be uploaded from. Or possibly 136713498266Sopenharmony_ci * used as argument to the read callback. 136813498266Sopenharmony_ci */ 136913498266Sopenharmony_ci data->set.in_set = va_arg(param, void *); 137013498266Sopenharmony_ci break; 137113498266Sopenharmony_ci case CURLOPT_INFILESIZE: 137213498266Sopenharmony_ci /* 137313498266Sopenharmony_ci * If known, this should inform curl about the file size of the 137413498266Sopenharmony_ci * to-be-uploaded file. 137513498266Sopenharmony_ci */ 137613498266Sopenharmony_ci arg = va_arg(param, long); 137713498266Sopenharmony_ci if(arg < -1) 137813498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 137913498266Sopenharmony_ci data->set.filesize = arg; 138013498266Sopenharmony_ci break; 138113498266Sopenharmony_ci case CURLOPT_INFILESIZE_LARGE: 138213498266Sopenharmony_ci /* 138313498266Sopenharmony_ci * If known, this should inform curl about the file size of the 138413498266Sopenharmony_ci * to-be-uploaded file. 138513498266Sopenharmony_ci */ 138613498266Sopenharmony_ci bigsize = va_arg(param, curl_off_t); 138713498266Sopenharmony_ci if(bigsize < -1) 138813498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 138913498266Sopenharmony_ci data->set.filesize = bigsize; 139013498266Sopenharmony_ci break; 139113498266Sopenharmony_ci case CURLOPT_LOW_SPEED_LIMIT: 139213498266Sopenharmony_ci /* 139313498266Sopenharmony_ci * The low speed limit that if transfers are below this for 139413498266Sopenharmony_ci * CURLOPT_LOW_SPEED_TIME, the transfer is aborted. 139513498266Sopenharmony_ci */ 139613498266Sopenharmony_ci arg = va_arg(param, long); 139713498266Sopenharmony_ci if(arg < 0) 139813498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 139913498266Sopenharmony_ci data->set.low_speed_limit = arg; 140013498266Sopenharmony_ci break; 140113498266Sopenharmony_ci case CURLOPT_MAX_SEND_SPEED_LARGE: 140213498266Sopenharmony_ci /* 140313498266Sopenharmony_ci * When transfer uploads are faster then CURLOPT_MAX_SEND_SPEED_LARGE 140413498266Sopenharmony_ci * bytes per second the transfer is throttled.. 140513498266Sopenharmony_ci */ 140613498266Sopenharmony_ci bigsize = va_arg(param, curl_off_t); 140713498266Sopenharmony_ci if(bigsize < 0) 140813498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 140913498266Sopenharmony_ci data->set.max_send_speed = bigsize; 141013498266Sopenharmony_ci break; 141113498266Sopenharmony_ci case CURLOPT_MAX_RECV_SPEED_LARGE: 141213498266Sopenharmony_ci /* 141313498266Sopenharmony_ci * When receiving data faster than CURLOPT_MAX_RECV_SPEED_LARGE bytes per 141413498266Sopenharmony_ci * second the transfer is throttled.. 141513498266Sopenharmony_ci */ 141613498266Sopenharmony_ci bigsize = va_arg(param, curl_off_t); 141713498266Sopenharmony_ci if(bigsize < 0) 141813498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 141913498266Sopenharmony_ci data->set.max_recv_speed = bigsize; 142013498266Sopenharmony_ci break; 142113498266Sopenharmony_ci case CURLOPT_LOW_SPEED_TIME: 142213498266Sopenharmony_ci /* 142313498266Sopenharmony_ci * The low speed time that if transfers are below the set 142413498266Sopenharmony_ci * CURLOPT_LOW_SPEED_LIMIT during this time, the transfer is aborted. 142513498266Sopenharmony_ci */ 142613498266Sopenharmony_ci arg = va_arg(param, long); 142713498266Sopenharmony_ci if(arg < 0) 142813498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 142913498266Sopenharmony_ci data->set.low_speed_time = arg; 143013498266Sopenharmony_ci break; 143113498266Sopenharmony_ci case CURLOPT_CURLU: 143213498266Sopenharmony_ci /* 143313498266Sopenharmony_ci * pass CURLU to set URL 143413498266Sopenharmony_ci */ 143513498266Sopenharmony_ci data->set.uh = va_arg(param, CURLU *); 143613498266Sopenharmony_ci break; 143713498266Sopenharmony_ci case CURLOPT_URL: 143813498266Sopenharmony_ci /* 143913498266Sopenharmony_ci * The URL to fetch. 144013498266Sopenharmony_ci */ 144113498266Sopenharmony_ci if(data->state.url_alloc) { 144213498266Sopenharmony_ci /* the already set URL is allocated, free it first! */ 144313498266Sopenharmony_ci Curl_safefree(data->state.url); 144413498266Sopenharmony_ci data->state.url_alloc = FALSE; 144513498266Sopenharmony_ci } 144613498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_SET_URL], 144713498266Sopenharmony_ci va_arg(param, char *)); 144813498266Sopenharmony_ci data->state.url = data->set.str[STRING_SET_URL]; 144913498266Sopenharmony_ci break; 145013498266Sopenharmony_ci case CURLOPT_PORT: 145113498266Sopenharmony_ci /* 145213498266Sopenharmony_ci * The port number to use when getting the URL. 0 disables it. 145313498266Sopenharmony_ci */ 145413498266Sopenharmony_ci arg = va_arg(param, long); 145513498266Sopenharmony_ci if((arg < 0) || (arg > 65535)) 145613498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 145713498266Sopenharmony_ci data->set.use_port = (unsigned short)arg; 145813498266Sopenharmony_ci break; 145913498266Sopenharmony_ci case CURLOPT_TIMEOUT: 146013498266Sopenharmony_ci /* 146113498266Sopenharmony_ci * The maximum time you allow curl to use for a single transfer 146213498266Sopenharmony_ci * operation. 146313498266Sopenharmony_ci */ 146413498266Sopenharmony_ci arg = va_arg(param, long); 146513498266Sopenharmony_ci if((arg >= 0) && (arg <= (INT_MAX/1000))) 146613498266Sopenharmony_ci data->set.timeout = (unsigned int)arg * 1000; 146713498266Sopenharmony_ci else 146813498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 146913498266Sopenharmony_ci break; 147013498266Sopenharmony_ci 147113498266Sopenharmony_ci case CURLOPT_TIMEOUT_MS: 147213498266Sopenharmony_ci uarg = va_arg(param, unsigned long); 147313498266Sopenharmony_ci if(uarg > UINT_MAX) 147413498266Sopenharmony_ci uarg = UINT_MAX; 147513498266Sopenharmony_ci data->set.timeout = (unsigned int)uarg; 147613498266Sopenharmony_ci break; 147713498266Sopenharmony_ci 147813498266Sopenharmony_ci case CURLOPT_CONNECTTIMEOUT: 147913498266Sopenharmony_ci /* 148013498266Sopenharmony_ci * The maximum time you allow curl to use to connect. 148113498266Sopenharmony_ci */ 148213498266Sopenharmony_ci arg = va_arg(param, long); 148313498266Sopenharmony_ci if((arg >= 0) && (arg <= (INT_MAX/1000))) 148413498266Sopenharmony_ci data->set.connecttimeout = (unsigned int)arg * 1000; 148513498266Sopenharmony_ci else 148613498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 148713498266Sopenharmony_ci break; 148813498266Sopenharmony_ci 148913498266Sopenharmony_ci case CURLOPT_CONNECTTIMEOUT_MS: 149013498266Sopenharmony_ci uarg = va_arg(param, unsigned long); 149113498266Sopenharmony_ci if(uarg > UINT_MAX) 149213498266Sopenharmony_ci uarg = UINT_MAX; 149313498266Sopenharmony_ci data->set.connecttimeout = (unsigned int)uarg; 149413498266Sopenharmony_ci break; 149513498266Sopenharmony_ci 149613498266Sopenharmony_ci#ifndef CURL_DISABLE_FTP 149713498266Sopenharmony_ci case CURLOPT_ACCEPTTIMEOUT_MS: 149813498266Sopenharmony_ci /* 149913498266Sopenharmony_ci * The maximum time for curl to wait for FTP server connect 150013498266Sopenharmony_ci */ 150113498266Sopenharmony_ci uarg = va_arg(param, unsigned long); 150213498266Sopenharmony_ci if(uarg > UINT_MAX) 150313498266Sopenharmony_ci uarg = UINT_MAX; 150413498266Sopenharmony_ci data->set.accepttimeout = (unsigned int)uarg; 150513498266Sopenharmony_ci break; 150613498266Sopenharmony_ci#endif 150713498266Sopenharmony_ci 150813498266Sopenharmony_ci case CURLOPT_USERPWD: 150913498266Sopenharmony_ci /* 151013498266Sopenharmony_ci * user:password to use in the operation 151113498266Sopenharmony_ci */ 151213498266Sopenharmony_ci result = setstropt_userpwd(va_arg(param, char *), 151313498266Sopenharmony_ci &data->set.str[STRING_USERNAME], 151413498266Sopenharmony_ci &data->set.str[STRING_PASSWORD]); 151513498266Sopenharmony_ci break; 151613498266Sopenharmony_ci 151713498266Sopenharmony_ci case CURLOPT_USERNAME: 151813498266Sopenharmony_ci /* 151913498266Sopenharmony_ci * authentication user name to use in the operation 152013498266Sopenharmony_ci */ 152113498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_USERNAME], 152213498266Sopenharmony_ci va_arg(param, char *)); 152313498266Sopenharmony_ci break; 152413498266Sopenharmony_ci case CURLOPT_PASSWORD: 152513498266Sopenharmony_ci /* 152613498266Sopenharmony_ci * authentication password to use in the operation 152713498266Sopenharmony_ci */ 152813498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_PASSWORD], 152913498266Sopenharmony_ci va_arg(param, char *)); 153013498266Sopenharmony_ci break; 153113498266Sopenharmony_ci 153213498266Sopenharmony_ci case CURLOPT_LOGIN_OPTIONS: 153313498266Sopenharmony_ci /* 153413498266Sopenharmony_ci * authentication options to use in the operation 153513498266Sopenharmony_ci */ 153613498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_OPTIONS], 153713498266Sopenharmony_ci va_arg(param, char *)); 153813498266Sopenharmony_ci break; 153913498266Sopenharmony_ci 154013498266Sopenharmony_ci case CURLOPT_XOAUTH2_BEARER: 154113498266Sopenharmony_ci /* 154213498266Sopenharmony_ci * OAuth 2.0 bearer token to use in the operation 154313498266Sopenharmony_ci */ 154413498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_BEARER], 154513498266Sopenharmony_ci va_arg(param, char *)); 154613498266Sopenharmony_ci break; 154713498266Sopenharmony_ci 154813498266Sopenharmony_ci case CURLOPT_RESOLVE: 154913498266Sopenharmony_ci /* 155013498266Sopenharmony_ci * List of HOST:PORT:[addresses] strings to populate the DNS cache with 155113498266Sopenharmony_ci * Entries added this way will remain in the cache until explicitly 155213498266Sopenharmony_ci * removed or the handle is cleaned up. 155313498266Sopenharmony_ci * 155413498266Sopenharmony_ci * Prefix the HOST with plus sign (+) to have the entry expire just like 155513498266Sopenharmony_ci * automatically added entries. 155613498266Sopenharmony_ci * 155713498266Sopenharmony_ci * Prefix the HOST with dash (-) to _remove_ the entry from the cache. 155813498266Sopenharmony_ci * 155913498266Sopenharmony_ci * This API can remove any entry from the DNS cache, but only entries 156013498266Sopenharmony_ci * that aren't actually in use right now will be pruned immediately. 156113498266Sopenharmony_ci */ 156213498266Sopenharmony_ci data->set.resolve = va_arg(param, struct curl_slist *); 156313498266Sopenharmony_ci data->state.resolve = data->set.resolve; 156413498266Sopenharmony_ci break; 156513498266Sopenharmony_ci case CURLOPT_PROGRESSFUNCTION: 156613498266Sopenharmony_ci /* 156713498266Sopenharmony_ci * Progress callback function 156813498266Sopenharmony_ci */ 156913498266Sopenharmony_ci data->set.fprogress = va_arg(param, curl_progress_callback); 157013498266Sopenharmony_ci if(data->set.fprogress) 157113498266Sopenharmony_ci data->progress.callback = TRUE; /* no longer internal */ 157213498266Sopenharmony_ci else 157313498266Sopenharmony_ci data->progress.callback = FALSE; /* NULL enforces internal */ 157413498266Sopenharmony_ci break; 157513498266Sopenharmony_ci 157613498266Sopenharmony_ci case CURLOPT_XFERINFOFUNCTION: 157713498266Sopenharmony_ci /* 157813498266Sopenharmony_ci * Transfer info callback function 157913498266Sopenharmony_ci */ 158013498266Sopenharmony_ci data->set.fxferinfo = va_arg(param, curl_xferinfo_callback); 158113498266Sopenharmony_ci if(data->set.fxferinfo) 158213498266Sopenharmony_ci data->progress.callback = TRUE; /* no longer internal */ 158313498266Sopenharmony_ci else 158413498266Sopenharmony_ci data->progress.callback = FALSE; /* NULL enforces internal */ 158513498266Sopenharmony_ci 158613498266Sopenharmony_ci break; 158713498266Sopenharmony_ci 158813498266Sopenharmony_ci case CURLOPT_PROGRESSDATA: 158913498266Sopenharmony_ci /* 159013498266Sopenharmony_ci * Custom client data to pass to the progress callback 159113498266Sopenharmony_ci */ 159213498266Sopenharmony_ci data->set.progress_client = va_arg(param, void *); 159313498266Sopenharmony_ci break; 159413498266Sopenharmony_ci 159513498266Sopenharmony_ci#ifndef CURL_DISABLE_PROXY 159613498266Sopenharmony_ci case CURLOPT_PROXYUSERPWD: 159713498266Sopenharmony_ci /* 159813498266Sopenharmony_ci * user:password needed to use the proxy 159913498266Sopenharmony_ci */ 160013498266Sopenharmony_ci result = setstropt_userpwd(va_arg(param, char *), 160113498266Sopenharmony_ci &data->set.str[STRING_PROXYUSERNAME], 160213498266Sopenharmony_ci &data->set.str[STRING_PROXYPASSWORD]); 160313498266Sopenharmony_ci break; 160413498266Sopenharmony_ci case CURLOPT_PROXYUSERNAME: 160513498266Sopenharmony_ci /* 160613498266Sopenharmony_ci * authentication user name to use in the operation 160713498266Sopenharmony_ci */ 160813498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_PROXYUSERNAME], 160913498266Sopenharmony_ci va_arg(param, char *)); 161013498266Sopenharmony_ci break; 161113498266Sopenharmony_ci case CURLOPT_PROXYPASSWORD: 161213498266Sopenharmony_ci /* 161313498266Sopenharmony_ci * authentication password to use in the operation 161413498266Sopenharmony_ci */ 161513498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_PROXYPASSWORD], 161613498266Sopenharmony_ci va_arg(param, char *)); 161713498266Sopenharmony_ci break; 161813498266Sopenharmony_ci case CURLOPT_NOPROXY: 161913498266Sopenharmony_ci /* 162013498266Sopenharmony_ci * proxy exception list 162113498266Sopenharmony_ci */ 162213498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_NOPROXY], 162313498266Sopenharmony_ci va_arg(param, char *)); 162413498266Sopenharmony_ci break; 162513498266Sopenharmony_ci#endif 162613498266Sopenharmony_ci 162713498266Sopenharmony_ci case CURLOPT_RANGE: 162813498266Sopenharmony_ci /* 162913498266Sopenharmony_ci * What range of the file you want to transfer 163013498266Sopenharmony_ci */ 163113498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_SET_RANGE], 163213498266Sopenharmony_ci va_arg(param, char *)); 163313498266Sopenharmony_ci break; 163413498266Sopenharmony_ci case CURLOPT_RESUME_FROM: 163513498266Sopenharmony_ci /* 163613498266Sopenharmony_ci * Resume transfer at the given file position 163713498266Sopenharmony_ci */ 163813498266Sopenharmony_ci arg = va_arg(param, long); 163913498266Sopenharmony_ci if(arg < -1) 164013498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 164113498266Sopenharmony_ci data->set.set_resume_from = arg; 164213498266Sopenharmony_ci break; 164313498266Sopenharmony_ci case CURLOPT_RESUME_FROM_LARGE: 164413498266Sopenharmony_ci /* 164513498266Sopenharmony_ci * Resume transfer at the given file position 164613498266Sopenharmony_ci */ 164713498266Sopenharmony_ci bigsize = va_arg(param, curl_off_t); 164813498266Sopenharmony_ci if(bigsize < -1) 164913498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 165013498266Sopenharmony_ci data->set.set_resume_from = bigsize; 165113498266Sopenharmony_ci break; 165213498266Sopenharmony_ci case CURLOPT_DEBUGFUNCTION: 165313498266Sopenharmony_ci /* 165413498266Sopenharmony_ci * stderr write callback. 165513498266Sopenharmony_ci */ 165613498266Sopenharmony_ci data->set.fdebug = va_arg(param, curl_debug_callback); 165713498266Sopenharmony_ci /* 165813498266Sopenharmony_ci * if the callback provided is NULL, it'll use the default callback 165913498266Sopenharmony_ci */ 166013498266Sopenharmony_ci break; 166113498266Sopenharmony_ci case CURLOPT_DEBUGDATA: 166213498266Sopenharmony_ci /* 166313498266Sopenharmony_ci * Set to a void * that should receive all error writes. This 166413498266Sopenharmony_ci * defaults to CURLOPT_STDERR for normal operations. 166513498266Sopenharmony_ci */ 166613498266Sopenharmony_ci data->set.debugdata = va_arg(param, void *); 166713498266Sopenharmony_ci break; 166813498266Sopenharmony_ci case CURLOPT_STDERR: 166913498266Sopenharmony_ci /* 167013498266Sopenharmony_ci * Set to a FILE * that should receive all error writes. This 167113498266Sopenharmony_ci * defaults to stderr for normal operations. 167213498266Sopenharmony_ci */ 167313498266Sopenharmony_ci data->set.err = va_arg(param, FILE *); 167413498266Sopenharmony_ci if(!data->set.err) 167513498266Sopenharmony_ci data->set.err = stderr; 167613498266Sopenharmony_ci break; 167713498266Sopenharmony_ci case CURLOPT_HEADERFUNCTION: 167813498266Sopenharmony_ci /* 167913498266Sopenharmony_ci * Set header write callback 168013498266Sopenharmony_ci */ 168113498266Sopenharmony_ci data->set.fwrite_header = va_arg(param, curl_write_callback); 168213498266Sopenharmony_ci break; 168313498266Sopenharmony_ci case CURLOPT_WRITEFUNCTION: 168413498266Sopenharmony_ci /* 168513498266Sopenharmony_ci * Set data write callback 168613498266Sopenharmony_ci */ 168713498266Sopenharmony_ci data->set.fwrite_func = va_arg(param, curl_write_callback); 168813498266Sopenharmony_ci if(!data->set.fwrite_func) 168913498266Sopenharmony_ci /* When set to NULL, reset to our internal default function */ 169013498266Sopenharmony_ci data->set.fwrite_func = (curl_write_callback)fwrite; 169113498266Sopenharmony_ci break; 169213498266Sopenharmony_ci case CURLOPT_READFUNCTION: 169313498266Sopenharmony_ci /* 169413498266Sopenharmony_ci * Read data callback 169513498266Sopenharmony_ci */ 169613498266Sopenharmony_ci data->set.fread_func_set = va_arg(param, curl_read_callback); 169713498266Sopenharmony_ci if(!data->set.fread_func_set) { 169813498266Sopenharmony_ci data->set.is_fread_set = 0; 169913498266Sopenharmony_ci /* When set to NULL, reset to our internal default function */ 170013498266Sopenharmony_ci data->set.fread_func_set = (curl_read_callback)fread; 170113498266Sopenharmony_ci } 170213498266Sopenharmony_ci else 170313498266Sopenharmony_ci data->set.is_fread_set = 1; 170413498266Sopenharmony_ci break; 170513498266Sopenharmony_ci case CURLOPT_SEEKFUNCTION: 170613498266Sopenharmony_ci /* 170713498266Sopenharmony_ci * Seek callback. Might be NULL. 170813498266Sopenharmony_ci */ 170913498266Sopenharmony_ci data->set.seek_func = va_arg(param, curl_seek_callback); 171013498266Sopenharmony_ci break; 171113498266Sopenharmony_ci case CURLOPT_SEEKDATA: 171213498266Sopenharmony_ci /* 171313498266Sopenharmony_ci * Seek control callback. Might be NULL. 171413498266Sopenharmony_ci */ 171513498266Sopenharmony_ci data->set.seek_client = va_arg(param, void *); 171613498266Sopenharmony_ci break; 171713498266Sopenharmony_ci case CURLOPT_IOCTLFUNCTION: 171813498266Sopenharmony_ci /* 171913498266Sopenharmony_ci * I/O control callback. Might be NULL. 172013498266Sopenharmony_ci */ 172113498266Sopenharmony_ci data->set.ioctl_func = va_arg(param, curl_ioctl_callback); 172213498266Sopenharmony_ci break; 172313498266Sopenharmony_ci case CURLOPT_IOCTLDATA: 172413498266Sopenharmony_ci /* 172513498266Sopenharmony_ci * I/O control data pointer. Might be NULL. 172613498266Sopenharmony_ci */ 172713498266Sopenharmony_ci data->set.ioctl_client = va_arg(param, void *); 172813498266Sopenharmony_ci break; 172913498266Sopenharmony_ci case CURLOPT_SSLCERT: 173013498266Sopenharmony_ci /* 173113498266Sopenharmony_ci * String that holds file name of the SSL certificate to use 173213498266Sopenharmony_ci */ 173313498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_CERT], 173413498266Sopenharmony_ci va_arg(param, char *)); 173513498266Sopenharmony_ci break; 173613498266Sopenharmony_ci case CURLOPT_SSLCERT_BLOB: 173713498266Sopenharmony_ci /* 173813498266Sopenharmony_ci * Blob that holds file content of the SSL certificate to use 173913498266Sopenharmony_ci */ 174013498266Sopenharmony_ci result = Curl_setblobopt(&data->set.blobs[BLOB_CERT], 174113498266Sopenharmony_ci va_arg(param, struct curl_blob *)); 174213498266Sopenharmony_ci break; 174313498266Sopenharmony_ci#ifndef CURL_DISABLE_PROXY 174413498266Sopenharmony_ci case CURLOPT_PROXY_SSLCERT: 174513498266Sopenharmony_ci /* 174613498266Sopenharmony_ci * String that holds file name of the SSL certificate to use for proxy 174713498266Sopenharmony_ci */ 174813498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_CERT_PROXY], 174913498266Sopenharmony_ci va_arg(param, char *)); 175013498266Sopenharmony_ci break; 175113498266Sopenharmony_ci case CURLOPT_PROXY_SSLCERT_BLOB: 175213498266Sopenharmony_ci /* 175313498266Sopenharmony_ci * Blob that holds file content of the SSL certificate to use for proxy 175413498266Sopenharmony_ci */ 175513498266Sopenharmony_ci result = Curl_setblobopt(&data->set.blobs[BLOB_CERT_PROXY], 175613498266Sopenharmony_ci va_arg(param, struct curl_blob *)); 175713498266Sopenharmony_ci break; 175813498266Sopenharmony_ci#endif 175913498266Sopenharmony_ci case CURLOPT_SSLCERTTYPE: 176013498266Sopenharmony_ci /* 176113498266Sopenharmony_ci * String that holds file type of the SSL certificate to use 176213498266Sopenharmony_ci */ 176313498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_CERT_TYPE], 176413498266Sopenharmony_ci va_arg(param, char *)); 176513498266Sopenharmony_ci break; 176613498266Sopenharmony_ci#ifndef CURL_DISABLE_PROXY 176713498266Sopenharmony_ci case CURLOPT_PROXY_SSLCERTTYPE: 176813498266Sopenharmony_ci /* 176913498266Sopenharmony_ci * String that holds file type of the SSL certificate to use for proxy 177013498266Sopenharmony_ci */ 177113498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_CERT_TYPE_PROXY], 177213498266Sopenharmony_ci va_arg(param, char *)); 177313498266Sopenharmony_ci break; 177413498266Sopenharmony_ci#endif 177513498266Sopenharmony_ci case CURLOPT_SSLKEY: 177613498266Sopenharmony_ci /* 177713498266Sopenharmony_ci * String that holds file name of the SSL key to use 177813498266Sopenharmony_ci */ 177913498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_KEY], 178013498266Sopenharmony_ci va_arg(param, char *)); 178113498266Sopenharmony_ci break; 178213498266Sopenharmony_ci case CURLOPT_SSLKEY_BLOB: 178313498266Sopenharmony_ci /* 178413498266Sopenharmony_ci * Blob that holds file content of the SSL key to use 178513498266Sopenharmony_ci */ 178613498266Sopenharmony_ci result = Curl_setblobopt(&data->set.blobs[BLOB_KEY], 178713498266Sopenharmony_ci va_arg(param, struct curl_blob *)); 178813498266Sopenharmony_ci break; 178913498266Sopenharmony_ci#ifndef CURL_DISABLE_PROXY 179013498266Sopenharmony_ci case CURLOPT_PROXY_SSLKEY: 179113498266Sopenharmony_ci /* 179213498266Sopenharmony_ci * String that holds file name of the SSL key to use for proxy 179313498266Sopenharmony_ci */ 179413498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_KEY_PROXY], 179513498266Sopenharmony_ci va_arg(param, char *)); 179613498266Sopenharmony_ci break; 179713498266Sopenharmony_ci case CURLOPT_PROXY_SSLKEY_BLOB: 179813498266Sopenharmony_ci /* 179913498266Sopenharmony_ci * Blob that holds file content of the SSL key to use for proxy 180013498266Sopenharmony_ci */ 180113498266Sopenharmony_ci result = Curl_setblobopt(&data->set.blobs[BLOB_KEY_PROXY], 180213498266Sopenharmony_ci va_arg(param, struct curl_blob *)); 180313498266Sopenharmony_ci break; 180413498266Sopenharmony_ci#endif 180513498266Sopenharmony_ci case CURLOPT_SSLKEYTYPE: 180613498266Sopenharmony_ci /* 180713498266Sopenharmony_ci * String that holds file type of the SSL key to use 180813498266Sopenharmony_ci */ 180913498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_KEY_TYPE], 181013498266Sopenharmony_ci va_arg(param, char *)); 181113498266Sopenharmony_ci break; 181213498266Sopenharmony_ci#ifndef CURL_DISABLE_PROXY 181313498266Sopenharmony_ci case CURLOPT_PROXY_SSLKEYTYPE: 181413498266Sopenharmony_ci /* 181513498266Sopenharmony_ci * String that holds file type of the SSL key to use for proxy 181613498266Sopenharmony_ci */ 181713498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_KEY_TYPE_PROXY], 181813498266Sopenharmony_ci va_arg(param, char *)); 181913498266Sopenharmony_ci break; 182013498266Sopenharmony_ci#endif 182113498266Sopenharmony_ci case CURLOPT_KEYPASSWD: 182213498266Sopenharmony_ci /* 182313498266Sopenharmony_ci * String that holds the SSL or SSH private key password. 182413498266Sopenharmony_ci */ 182513498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_KEY_PASSWD], 182613498266Sopenharmony_ci va_arg(param, char *)); 182713498266Sopenharmony_ci break; 182813498266Sopenharmony_ci#ifndef CURL_DISABLE_PROXY 182913498266Sopenharmony_ci case CURLOPT_PROXY_KEYPASSWD: 183013498266Sopenharmony_ci /* 183113498266Sopenharmony_ci * String that holds the SSL private key password for proxy. 183213498266Sopenharmony_ci */ 183313498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_KEY_PASSWD_PROXY], 183413498266Sopenharmony_ci va_arg(param, char *)); 183513498266Sopenharmony_ci break; 183613498266Sopenharmony_ci#endif 183713498266Sopenharmony_ci case CURLOPT_SSLENGINE: 183813498266Sopenharmony_ci /* 183913498266Sopenharmony_ci * String that holds the SSL crypto engine. 184013498266Sopenharmony_ci */ 184113498266Sopenharmony_ci argptr = va_arg(param, char *); 184213498266Sopenharmony_ci if(argptr && argptr[0]) { 184313498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_SSL_ENGINE], argptr); 184413498266Sopenharmony_ci if(!result) { 184513498266Sopenharmony_ci result = Curl_ssl_set_engine(data, argptr); 184613498266Sopenharmony_ci } 184713498266Sopenharmony_ci } 184813498266Sopenharmony_ci break; 184913498266Sopenharmony_ci 185013498266Sopenharmony_ci case CURLOPT_SSLENGINE_DEFAULT: 185113498266Sopenharmony_ci /* 185213498266Sopenharmony_ci * flag to set engine as default. 185313498266Sopenharmony_ci */ 185413498266Sopenharmony_ci Curl_setstropt(&data->set.str[STRING_SSL_ENGINE], NULL); 185513498266Sopenharmony_ci result = Curl_ssl_set_engine_default(data); 185613498266Sopenharmony_ci break; 185713498266Sopenharmony_ci case CURLOPT_CRLF: 185813498266Sopenharmony_ci /* 185913498266Sopenharmony_ci * Kludgy option to enable CRLF conversions. Subject for removal. 186013498266Sopenharmony_ci */ 186113498266Sopenharmony_ci data->set.crlf = (0 != va_arg(param, long)); 186213498266Sopenharmony_ci break; 186313498266Sopenharmony_ci#ifndef CURL_DISABLE_PROXY 186413498266Sopenharmony_ci case CURLOPT_HAPROXYPROTOCOL: 186513498266Sopenharmony_ci /* 186613498266Sopenharmony_ci * Set to send the HAProxy Proxy Protocol header 186713498266Sopenharmony_ci */ 186813498266Sopenharmony_ci data->set.haproxyprotocol = (0 != va_arg(param, long)); 186913498266Sopenharmony_ci break; 187013498266Sopenharmony_ci case CURLOPT_HAPROXY_CLIENT_IP: 187113498266Sopenharmony_ci /* 187213498266Sopenharmony_ci * Set the client IP to send through HAProxy PROXY protocol 187313498266Sopenharmony_ci */ 187413498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_HAPROXY_CLIENT_IP], 187513498266Sopenharmony_ci va_arg(param, char *)); 187613498266Sopenharmony_ci /* We enable implicitly the HAProxy protocol if we use this flag. */ 187713498266Sopenharmony_ci data->set.haproxyprotocol = TRUE; 187813498266Sopenharmony_ci break; 187913498266Sopenharmony_ci#endif 188013498266Sopenharmony_ci case CURLOPT_INTERFACE: 188113498266Sopenharmony_ci /* 188213498266Sopenharmony_ci * Set what interface or address/hostname to bind the socket to when 188313498266Sopenharmony_ci * performing an operation and thus what from-IP your connection will use. 188413498266Sopenharmony_ci */ 188513498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_DEVICE], 188613498266Sopenharmony_ci va_arg(param, char *)); 188713498266Sopenharmony_ci break; 188813498266Sopenharmony_ci#ifndef CURL_DISABLE_BINDLOCAL 188913498266Sopenharmony_ci case CURLOPT_LOCALPORT: 189013498266Sopenharmony_ci /* 189113498266Sopenharmony_ci * Set what local port to bind the socket to when performing an operation. 189213498266Sopenharmony_ci */ 189313498266Sopenharmony_ci arg = va_arg(param, long); 189413498266Sopenharmony_ci if((arg < 0) || (arg > 65535)) 189513498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 189613498266Sopenharmony_ci data->set.localport = curlx_sltous(arg); 189713498266Sopenharmony_ci break; 189813498266Sopenharmony_ci case CURLOPT_LOCALPORTRANGE: 189913498266Sopenharmony_ci /* 190013498266Sopenharmony_ci * Set number of local ports to try, starting with CURLOPT_LOCALPORT. 190113498266Sopenharmony_ci */ 190213498266Sopenharmony_ci arg = va_arg(param, long); 190313498266Sopenharmony_ci if((arg < 0) || (arg > 65535)) 190413498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 190513498266Sopenharmony_ci data->set.localportrange = curlx_sltous(arg); 190613498266Sopenharmony_ci break; 190713498266Sopenharmony_ci#endif 190813498266Sopenharmony_ci case CURLOPT_GSSAPI_DELEGATION: 190913498266Sopenharmony_ci /* 191013498266Sopenharmony_ci * GSS-API credential delegation bitmask 191113498266Sopenharmony_ci */ 191213498266Sopenharmony_ci uarg = va_arg(param, unsigned long); 191313498266Sopenharmony_ci data->set.gssapi_delegation = (unsigned char)uarg& 191413498266Sopenharmony_ci (CURLGSSAPI_DELEGATION_POLICY_FLAG|CURLGSSAPI_DELEGATION_FLAG); 191513498266Sopenharmony_ci break; 191613498266Sopenharmony_ci case CURLOPT_SSL_VERIFYPEER: 191713498266Sopenharmony_ci /* 191813498266Sopenharmony_ci * Enable peer SSL verifying. 191913498266Sopenharmony_ci */ 192013498266Sopenharmony_ci data->set.ssl.primary.verifypeer = (0 != va_arg(param, long)); 192113498266Sopenharmony_ci 192213498266Sopenharmony_ci /* Update the current connection ssl_config. */ 192313498266Sopenharmony_ci Curl_ssl_conn_config_update(data, FALSE); 192413498266Sopenharmony_ci break; 192513498266Sopenharmony_ci#ifndef CURL_DISABLE_DOH 192613498266Sopenharmony_ci case CURLOPT_DOH_SSL_VERIFYPEER: 192713498266Sopenharmony_ci /* 192813498266Sopenharmony_ci * Enable peer SSL verifying for DoH. 192913498266Sopenharmony_ci */ 193013498266Sopenharmony_ci data->set.doh_verifypeer = (0 != va_arg(param, long)); 193113498266Sopenharmony_ci break; 193213498266Sopenharmony_ci#endif 193313498266Sopenharmony_ci#ifndef CURL_DISABLE_PROXY 193413498266Sopenharmony_ci case CURLOPT_PROXY_SSL_VERIFYPEER: 193513498266Sopenharmony_ci /* 193613498266Sopenharmony_ci * Enable peer SSL verifying for proxy. 193713498266Sopenharmony_ci */ 193813498266Sopenharmony_ci data->set.proxy_ssl.primary.verifypeer = 193913498266Sopenharmony_ci (0 != va_arg(param, long))?TRUE:FALSE; 194013498266Sopenharmony_ci 194113498266Sopenharmony_ci /* Update the current connection proxy_ssl_config. */ 194213498266Sopenharmony_ci Curl_ssl_conn_config_update(data, TRUE); 194313498266Sopenharmony_ci break; 194413498266Sopenharmony_ci#endif 194513498266Sopenharmony_ci case CURLOPT_SSL_VERIFYHOST: 194613498266Sopenharmony_ci /* 194713498266Sopenharmony_ci * Enable verification of the host name in the peer certificate 194813498266Sopenharmony_ci */ 194913498266Sopenharmony_ci arg = va_arg(param, long); 195013498266Sopenharmony_ci 195113498266Sopenharmony_ci /* Obviously people are not reading documentation and too many thought 195213498266Sopenharmony_ci this argument took a boolean when it wasn't and misused it. 195313498266Sopenharmony_ci Treat 1 and 2 the same */ 195413498266Sopenharmony_ci data->set.ssl.primary.verifyhost = !!(arg & 3); 195513498266Sopenharmony_ci 195613498266Sopenharmony_ci /* Update the current connection ssl_config. */ 195713498266Sopenharmony_ci Curl_ssl_conn_config_update(data, FALSE); 195813498266Sopenharmony_ci break; 195913498266Sopenharmony_ci#ifndef CURL_DISABLE_DOH 196013498266Sopenharmony_ci case CURLOPT_DOH_SSL_VERIFYHOST: 196113498266Sopenharmony_ci /* 196213498266Sopenharmony_ci * Enable verification of the host name in the peer certificate for DoH 196313498266Sopenharmony_ci */ 196413498266Sopenharmony_ci arg = va_arg(param, long); 196513498266Sopenharmony_ci 196613498266Sopenharmony_ci /* Treat both 1 and 2 as TRUE */ 196713498266Sopenharmony_ci data->set.doh_verifyhost = !!(arg & 3); 196813498266Sopenharmony_ci break; 196913498266Sopenharmony_ci#endif 197013498266Sopenharmony_ci#ifndef CURL_DISABLE_PROXY 197113498266Sopenharmony_ci case CURLOPT_PROXY_SSL_VERIFYHOST: 197213498266Sopenharmony_ci /* 197313498266Sopenharmony_ci * Enable verification of the host name in the peer certificate for proxy 197413498266Sopenharmony_ci */ 197513498266Sopenharmony_ci arg = va_arg(param, long); 197613498266Sopenharmony_ci 197713498266Sopenharmony_ci /* Treat both 1 and 2 as TRUE */ 197813498266Sopenharmony_ci data->set.proxy_ssl.primary.verifyhost = (bool)((arg & 3)?TRUE:FALSE); 197913498266Sopenharmony_ci /* Update the current connection proxy_ssl_config. */ 198013498266Sopenharmony_ci Curl_ssl_conn_config_update(data, TRUE); 198113498266Sopenharmony_ci break; 198213498266Sopenharmony_ci#endif 198313498266Sopenharmony_ci case CURLOPT_SSL_VERIFYSTATUS: 198413498266Sopenharmony_ci /* 198513498266Sopenharmony_ci * Enable certificate status verifying. 198613498266Sopenharmony_ci */ 198713498266Sopenharmony_ci if(!Curl_ssl_cert_status_request()) { 198813498266Sopenharmony_ci result = CURLE_NOT_BUILT_IN; 198913498266Sopenharmony_ci break; 199013498266Sopenharmony_ci } 199113498266Sopenharmony_ci 199213498266Sopenharmony_ci data->set.ssl.primary.verifystatus = (0 != va_arg(param, long)); 199313498266Sopenharmony_ci 199413498266Sopenharmony_ci /* Update the current connection ssl_config. */ 199513498266Sopenharmony_ci Curl_ssl_conn_config_update(data, FALSE); 199613498266Sopenharmony_ci break; 199713498266Sopenharmony_ci#ifndef CURL_DISABLE_DOH 199813498266Sopenharmony_ci case CURLOPT_DOH_SSL_VERIFYSTATUS: 199913498266Sopenharmony_ci /* 200013498266Sopenharmony_ci * Enable certificate status verifying for DoH. 200113498266Sopenharmony_ci */ 200213498266Sopenharmony_ci if(!Curl_ssl_cert_status_request()) { 200313498266Sopenharmony_ci result = CURLE_NOT_BUILT_IN; 200413498266Sopenharmony_ci break; 200513498266Sopenharmony_ci } 200613498266Sopenharmony_ci 200713498266Sopenharmony_ci data->set.doh_verifystatus = (0 != va_arg(param, long)); 200813498266Sopenharmony_ci break; 200913498266Sopenharmony_ci#endif 201013498266Sopenharmony_ci case CURLOPT_SSL_CTX_FUNCTION: 201113498266Sopenharmony_ci /* 201213498266Sopenharmony_ci * Set a SSL_CTX callback 201313498266Sopenharmony_ci */ 201413498266Sopenharmony_ci#ifdef USE_SSL 201513498266Sopenharmony_ci if(Curl_ssl_supports(data, SSLSUPP_SSL_CTX)) 201613498266Sopenharmony_ci data->set.ssl.fsslctx = va_arg(param, curl_ssl_ctx_callback); 201713498266Sopenharmony_ci else 201813498266Sopenharmony_ci#endif 201913498266Sopenharmony_ci result = CURLE_NOT_BUILT_IN; 202013498266Sopenharmony_ci break; 202113498266Sopenharmony_ci case CURLOPT_SSL_CTX_DATA: 202213498266Sopenharmony_ci /* 202313498266Sopenharmony_ci * Set a SSL_CTX callback parameter pointer 202413498266Sopenharmony_ci */ 202513498266Sopenharmony_ci#ifdef USE_SSL 202613498266Sopenharmony_ci if(Curl_ssl_supports(data, SSLSUPP_SSL_CTX)) 202713498266Sopenharmony_ci data->set.ssl.fsslctxp = va_arg(param, void *); 202813498266Sopenharmony_ci else 202913498266Sopenharmony_ci#endif 203013498266Sopenharmony_ci result = CURLE_NOT_BUILT_IN; 203113498266Sopenharmony_ci break; 203213498266Sopenharmony_ci case CURLOPT_SSL_FALSESTART: 203313498266Sopenharmony_ci /* 203413498266Sopenharmony_ci * Enable TLS false start. 203513498266Sopenharmony_ci */ 203613498266Sopenharmony_ci if(!Curl_ssl_false_start(data)) { 203713498266Sopenharmony_ci result = CURLE_NOT_BUILT_IN; 203813498266Sopenharmony_ci break; 203913498266Sopenharmony_ci } 204013498266Sopenharmony_ci 204113498266Sopenharmony_ci data->set.ssl.falsestart = (0 != va_arg(param, long)); 204213498266Sopenharmony_ci break; 204313498266Sopenharmony_ci case CURLOPT_CERTINFO: 204413498266Sopenharmony_ci#ifdef USE_SSL 204513498266Sopenharmony_ci if(Curl_ssl_supports(data, SSLSUPP_CERTINFO)) 204613498266Sopenharmony_ci data->set.ssl.certinfo = (0 != va_arg(param, long)); 204713498266Sopenharmony_ci else 204813498266Sopenharmony_ci#endif 204913498266Sopenharmony_ci result = CURLE_NOT_BUILT_IN; 205013498266Sopenharmony_ci break; 205113498266Sopenharmony_ci case CURLOPT_PINNEDPUBLICKEY: 205213498266Sopenharmony_ci /* 205313498266Sopenharmony_ci * Set pinned public key for SSL connection. 205413498266Sopenharmony_ci * Specify file name of the public key in DER format. 205513498266Sopenharmony_ci */ 205613498266Sopenharmony_ci#ifdef USE_SSL 205713498266Sopenharmony_ci if(Curl_ssl_supports(data, SSLSUPP_PINNEDPUBKEY)) 205813498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_SSL_PINNEDPUBLICKEY], 205913498266Sopenharmony_ci va_arg(param, char *)); 206013498266Sopenharmony_ci else 206113498266Sopenharmony_ci#endif 206213498266Sopenharmony_ci result = CURLE_NOT_BUILT_IN; 206313498266Sopenharmony_ci break; 206413498266Sopenharmony_ci#ifndef CURL_DISABLE_PROXY 206513498266Sopenharmony_ci case CURLOPT_PROXY_PINNEDPUBLICKEY: 206613498266Sopenharmony_ci /* 206713498266Sopenharmony_ci * Set pinned public key for SSL connection. 206813498266Sopenharmony_ci * Specify file name of the public key in DER format. 206913498266Sopenharmony_ci */ 207013498266Sopenharmony_ci#ifdef USE_SSL 207113498266Sopenharmony_ci if(Curl_ssl_supports(data, SSLSUPP_PINNEDPUBKEY)) 207213498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_SSL_PINNEDPUBLICKEY_PROXY], 207313498266Sopenharmony_ci va_arg(param, char *)); 207413498266Sopenharmony_ci else 207513498266Sopenharmony_ci#endif 207613498266Sopenharmony_ci result = CURLE_NOT_BUILT_IN; 207713498266Sopenharmony_ci break; 207813498266Sopenharmony_ci#endif 207913498266Sopenharmony_ci case CURLOPT_CAINFO: 208013498266Sopenharmony_ci /* 208113498266Sopenharmony_ci * Set CA info for SSL connection. Specify file name of the CA certificate 208213498266Sopenharmony_ci */ 208313498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_SSL_CAFILE], 208413498266Sopenharmony_ci va_arg(param, char *)); 208513498266Sopenharmony_ci break; 208613498266Sopenharmony_ci case CURLOPT_CAINFO_BLOB: 208713498266Sopenharmony_ci /* 208813498266Sopenharmony_ci * Blob that holds CA info for SSL connection. 208913498266Sopenharmony_ci * Specify entire PEM of the CA certificate 209013498266Sopenharmony_ci */ 209113498266Sopenharmony_ci#ifdef USE_SSL 209213498266Sopenharmony_ci if(Curl_ssl_supports(data, SSLSUPP_CAINFO_BLOB)) { 209313498266Sopenharmony_ci result = Curl_setblobopt(&data->set.blobs[BLOB_CAINFO], 209413498266Sopenharmony_ci va_arg(param, struct curl_blob *)); 209513498266Sopenharmony_ci break; 209613498266Sopenharmony_ci } 209713498266Sopenharmony_ci else 209813498266Sopenharmony_ci#endif 209913498266Sopenharmony_ci return CURLE_NOT_BUILT_IN; 210013498266Sopenharmony_ci#ifndef CURL_DISABLE_PROXY 210113498266Sopenharmony_ci case CURLOPT_PROXY_CAINFO: 210213498266Sopenharmony_ci /* 210313498266Sopenharmony_ci * Set CA info SSL connection for proxy. Specify file name of the 210413498266Sopenharmony_ci * CA certificate 210513498266Sopenharmony_ci */ 210613498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_SSL_CAFILE_PROXY], 210713498266Sopenharmony_ci va_arg(param, char *)); 210813498266Sopenharmony_ci break; 210913498266Sopenharmony_ci case CURLOPT_PROXY_CAINFO_BLOB: 211013498266Sopenharmony_ci /* 211113498266Sopenharmony_ci * Blob that holds CA info for SSL connection proxy. 211213498266Sopenharmony_ci * Specify entire PEM of the CA certificate 211313498266Sopenharmony_ci */ 211413498266Sopenharmony_ci#ifdef USE_SSL 211513498266Sopenharmony_ci if(Curl_ssl_supports(data, SSLSUPP_CAINFO_BLOB)) { 211613498266Sopenharmony_ci result = Curl_setblobopt(&data->set.blobs[BLOB_CAINFO_PROXY], 211713498266Sopenharmony_ci va_arg(param, struct curl_blob *)); 211813498266Sopenharmony_ci break; 211913498266Sopenharmony_ci } 212013498266Sopenharmony_ci else 212113498266Sopenharmony_ci#endif 212213498266Sopenharmony_ci return CURLE_NOT_BUILT_IN; 212313498266Sopenharmony_ci#endif 212413498266Sopenharmony_ci case CURLOPT_CAPATH: 212513498266Sopenharmony_ci /* 212613498266Sopenharmony_ci * Set CA path info for SSL connection. Specify directory name of the CA 212713498266Sopenharmony_ci * certificates which have been prepared using openssl c_rehash utility. 212813498266Sopenharmony_ci */ 212913498266Sopenharmony_ci#ifdef USE_SSL 213013498266Sopenharmony_ci if(Curl_ssl_supports(data, SSLSUPP_CA_PATH)) 213113498266Sopenharmony_ci /* This does not work on windows. */ 213213498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_SSL_CAPATH], 213313498266Sopenharmony_ci va_arg(param, char *)); 213413498266Sopenharmony_ci else 213513498266Sopenharmony_ci#endif 213613498266Sopenharmony_ci result = CURLE_NOT_BUILT_IN; 213713498266Sopenharmony_ci break; 213813498266Sopenharmony_ci#ifndef CURL_DISABLE_PROXY 213913498266Sopenharmony_ci case CURLOPT_PROXY_CAPATH: 214013498266Sopenharmony_ci /* 214113498266Sopenharmony_ci * Set CA path info for SSL connection proxy. Specify directory name of the 214213498266Sopenharmony_ci * CA certificates which have been prepared using openssl c_rehash utility. 214313498266Sopenharmony_ci */ 214413498266Sopenharmony_ci#ifdef USE_SSL 214513498266Sopenharmony_ci if(Curl_ssl_supports(data, SSLSUPP_CA_PATH)) 214613498266Sopenharmony_ci /* This does not work on windows. */ 214713498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_SSL_CAPATH_PROXY], 214813498266Sopenharmony_ci va_arg(param, char *)); 214913498266Sopenharmony_ci else 215013498266Sopenharmony_ci#endif 215113498266Sopenharmony_ci result = CURLE_NOT_BUILT_IN; 215213498266Sopenharmony_ci break; 215313498266Sopenharmony_ci#endif 215413498266Sopenharmony_ci case CURLOPT_CRLFILE: 215513498266Sopenharmony_ci /* 215613498266Sopenharmony_ci * Set CRL file info for SSL connection. Specify file name of the CRL 215713498266Sopenharmony_ci * to check certificates revocation 215813498266Sopenharmony_ci */ 215913498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_SSL_CRLFILE], 216013498266Sopenharmony_ci va_arg(param, char *)); 216113498266Sopenharmony_ci break; 216213498266Sopenharmony_ci#ifndef CURL_DISABLE_PROXY 216313498266Sopenharmony_ci case CURLOPT_PROXY_CRLFILE: 216413498266Sopenharmony_ci /* 216513498266Sopenharmony_ci * Set CRL file info for SSL connection for proxy. Specify file name of the 216613498266Sopenharmony_ci * CRL to check certificates revocation 216713498266Sopenharmony_ci */ 216813498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_SSL_CRLFILE_PROXY], 216913498266Sopenharmony_ci va_arg(param, char *)); 217013498266Sopenharmony_ci break; 217113498266Sopenharmony_ci#endif 217213498266Sopenharmony_ci case CURLOPT_ISSUERCERT: 217313498266Sopenharmony_ci /* 217413498266Sopenharmony_ci * Set Issuer certificate file 217513498266Sopenharmony_ci * to check certificates issuer 217613498266Sopenharmony_ci */ 217713498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_SSL_ISSUERCERT], 217813498266Sopenharmony_ci va_arg(param, char *)); 217913498266Sopenharmony_ci break; 218013498266Sopenharmony_ci case CURLOPT_ISSUERCERT_BLOB: 218113498266Sopenharmony_ci /* 218213498266Sopenharmony_ci * Blob that holds Issuer certificate to check certificates issuer 218313498266Sopenharmony_ci */ 218413498266Sopenharmony_ci result = Curl_setblobopt(&data->set.blobs[BLOB_SSL_ISSUERCERT], 218513498266Sopenharmony_ci va_arg(param, struct curl_blob *)); 218613498266Sopenharmony_ci break; 218713498266Sopenharmony_ci#ifndef CURL_DISABLE_PROXY 218813498266Sopenharmony_ci case CURLOPT_PROXY_ISSUERCERT: 218913498266Sopenharmony_ci /* 219013498266Sopenharmony_ci * Set Issuer certificate file 219113498266Sopenharmony_ci * to check certificates issuer 219213498266Sopenharmony_ci */ 219313498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_SSL_ISSUERCERT_PROXY], 219413498266Sopenharmony_ci va_arg(param, char *)); 219513498266Sopenharmony_ci break; 219613498266Sopenharmony_ci case CURLOPT_PROXY_ISSUERCERT_BLOB: 219713498266Sopenharmony_ci /* 219813498266Sopenharmony_ci * Blob that holds Issuer certificate to check certificates issuer 219913498266Sopenharmony_ci */ 220013498266Sopenharmony_ci result = Curl_setblobopt(&data->set.blobs[BLOB_SSL_ISSUERCERT_PROXY], 220113498266Sopenharmony_ci va_arg(param, struct curl_blob *)); 220213498266Sopenharmony_ci break; 220313498266Sopenharmony_ci#endif 220413498266Sopenharmony_ci#ifndef CURL_DISABLE_TELNET 220513498266Sopenharmony_ci case CURLOPT_TELNETOPTIONS: 220613498266Sopenharmony_ci /* 220713498266Sopenharmony_ci * Set a linked list of telnet options 220813498266Sopenharmony_ci */ 220913498266Sopenharmony_ci data->set.telnet_options = va_arg(param, struct curl_slist *); 221013498266Sopenharmony_ci break; 221113498266Sopenharmony_ci#endif 221213498266Sopenharmony_ci case CURLOPT_BUFFERSIZE: 221313498266Sopenharmony_ci /* 221413498266Sopenharmony_ci * The application kindly asks for a differently sized receive buffer. 221513498266Sopenharmony_ci * If it seems reasonable, we'll use it. 221613498266Sopenharmony_ci */ 221713498266Sopenharmony_ci if(data->state.buffer) 221813498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 221913498266Sopenharmony_ci 222013498266Sopenharmony_ci arg = va_arg(param, long); 222113498266Sopenharmony_ci 222213498266Sopenharmony_ci if(arg > READBUFFER_MAX) 222313498266Sopenharmony_ci arg = READBUFFER_MAX; 222413498266Sopenharmony_ci else if(arg < 1) 222513498266Sopenharmony_ci arg = READBUFFER_SIZE; 222613498266Sopenharmony_ci else if(arg < READBUFFER_MIN) 222713498266Sopenharmony_ci arg = READBUFFER_MIN; 222813498266Sopenharmony_ci 222913498266Sopenharmony_ci data->set.buffer_size = (unsigned int)arg; 223013498266Sopenharmony_ci break; 223113498266Sopenharmony_ci 223213498266Sopenharmony_ci case CURLOPT_UPLOAD_BUFFERSIZE: 223313498266Sopenharmony_ci /* 223413498266Sopenharmony_ci * The application kindly asks for a differently sized upload buffer. 223513498266Sopenharmony_ci * Cap it to sensible. 223613498266Sopenharmony_ci */ 223713498266Sopenharmony_ci arg = va_arg(param, long); 223813498266Sopenharmony_ci 223913498266Sopenharmony_ci if(arg > UPLOADBUFFER_MAX) 224013498266Sopenharmony_ci arg = UPLOADBUFFER_MAX; 224113498266Sopenharmony_ci else if(arg < UPLOADBUFFER_MIN) 224213498266Sopenharmony_ci arg = UPLOADBUFFER_MIN; 224313498266Sopenharmony_ci 224413498266Sopenharmony_ci data->set.upload_buffer_size = (unsigned int)arg; 224513498266Sopenharmony_ci Curl_safefree(data->state.ulbuf); /* force a realloc next opportunity */ 224613498266Sopenharmony_ci break; 224713498266Sopenharmony_ci 224813498266Sopenharmony_ci case CURLOPT_NOSIGNAL: 224913498266Sopenharmony_ci /* 225013498266Sopenharmony_ci * The application asks not to set any signal() or alarm() handlers, 225113498266Sopenharmony_ci * even when using a timeout. 225213498266Sopenharmony_ci */ 225313498266Sopenharmony_ci data->set.no_signal = (0 != va_arg(param, long)); 225413498266Sopenharmony_ci break; 225513498266Sopenharmony_ci 225613498266Sopenharmony_ci case CURLOPT_SHARE: 225713498266Sopenharmony_ci { 225813498266Sopenharmony_ci struct Curl_share *set; 225913498266Sopenharmony_ci set = va_arg(param, struct Curl_share *); 226013498266Sopenharmony_ci 226113498266Sopenharmony_ci /* disconnect from old share, if any */ 226213498266Sopenharmony_ci if(data->share) { 226313498266Sopenharmony_ci Curl_share_lock(data, CURL_LOCK_DATA_SHARE, CURL_LOCK_ACCESS_SINGLE); 226413498266Sopenharmony_ci 226513498266Sopenharmony_ci if(data->dns.hostcachetype == HCACHE_SHARED) { 226613498266Sopenharmony_ci data->dns.hostcache = NULL; 226713498266Sopenharmony_ci data->dns.hostcachetype = HCACHE_NONE; 226813498266Sopenharmony_ci } 226913498266Sopenharmony_ci 227013498266Sopenharmony_ci#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES) 227113498266Sopenharmony_ci if(data->share->cookies == data->cookies) 227213498266Sopenharmony_ci data->cookies = NULL; 227313498266Sopenharmony_ci#endif 227413498266Sopenharmony_ci 227513498266Sopenharmony_ci#ifndef CURL_DISABLE_HSTS 227613498266Sopenharmony_ci if(data->share->hsts == data->hsts) 227713498266Sopenharmony_ci data->hsts = NULL; 227813498266Sopenharmony_ci#endif 227913498266Sopenharmony_ci#ifdef USE_SSL 228013498266Sopenharmony_ci if(data->share->sslsession == data->state.session) 228113498266Sopenharmony_ci data->state.session = NULL; 228213498266Sopenharmony_ci#endif 228313498266Sopenharmony_ci#ifdef USE_LIBPSL 228413498266Sopenharmony_ci if(data->psl == &data->share->psl) 228513498266Sopenharmony_ci data->psl = data->multi? &data->multi->psl: NULL; 228613498266Sopenharmony_ci#endif 228713498266Sopenharmony_ci 228813498266Sopenharmony_ci data->share->dirty--; 228913498266Sopenharmony_ci 229013498266Sopenharmony_ci Curl_share_unlock(data, CURL_LOCK_DATA_SHARE); 229113498266Sopenharmony_ci data->share = NULL; 229213498266Sopenharmony_ci } 229313498266Sopenharmony_ci 229413498266Sopenharmony_ci if(GOOD_SHARE_HANDLE(set)) 229513498266Sopenharmony_ci /* use new share if it set */ 229613498266Sopenharmony_ci data->share = set; 229713498266Sopenharmony_ci if(data->share) { 229813498266Sopenharmony_ci 229913498266Sopenharmony_ci Curl_share_lock(data, CURL_LOCK_DATA_SHARE, CURL_LOCK_ACCESS_SINGLE); 230013498266Sopenharmony_ci 230113498266Sopenharmony_ci data->share->dirty++; 230213498266Sopenharmony_ci 230313498266Sopenharmony_ci if(data->share->specifier & (1<< CURL_LOCK_DATA_DNS)) { 230413498266Sopenharmony_ci /* use shared host cache */ 230513498266Sopenharmony_ci data->dns.hostcache = &data->share->hostcache; 230613498266Sopenharmony_ci data->dns.hostcachetype = HCACHE_SHARED; 230713498266Sopenharmony_ci } 230813498266Sopenharmony_ci#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES) 230913498266Sopenharmony_ci if(data->share->cookies) { 231013498266Sopenharmony_ci /* use shared cookie list, first free own one if any */ 231113498266Sopenharmony_ci Curl_cookie_cleanup(data->cookies); 231213498266Sopenharmony_ci /* enable cookies since we now use a share that uses cookies! */ 231313498266Sopenharmony_ci data->cookies = data->share->cookies; 231413498266Sopenharmony_ci } 231513498266Sopenharmony_ci#endif /* CURL_DISABLE_HTTP */ 231613498266Sopenharmony_ci#ifndef CURL_DISABLE_HSTS 231713498266Sopenharmony_ci if(data->share->hsts) { 231813498266Sopenharmony_ci /* first free the private one if any */ 231913498266Sopenharmony_ci Curl_hsts_cleanup(&data->hsts); 232013498266Sopenharmony_ci data->hsts = data->share->hsts; 232113498266Sopenharmony_ci } 232213498266Sopenharmony_ci#endif /* CURL_DISABLE_HTTP */ 232313498266Sopenharmony_ci#ifdef USE_SSL 232413498266Sopenharmony_ci if(data->share->sslsession) { 232513498266Sopenharmony_ci data->set.general_ssl.max_ssl_sessions = data->share->max_ssl_sessions; 232613498266Sopenharmony_ci data->state.session = data->share->sslsession; 232713498266Sopenharmony_ci } 232813498266Sopenharmony_ci#endif 232913498266Sopenharmony_ci#ifdef USE_LIBPSL 233013498266Sopenharmony_ci if(data->share->specifier & (1 << CURL_LOCK_DATA_PSL)) 233113498266Sopenharmony_ci data->psl = &data->share->psl; 233213498266Sopenharmony_ci#endif 233313498266Sopenharmony_ci 233413498266Sopenharmony_ci Curl_share_unlock(data, CURL_LOCK_DATA_SHARE); 233513498266Sopenharmony_ci } 233613498266Sopenharmony_ci /* check for host cache not needed, 233713498266Sopenharmony_ci * it will be done by curl_easy_perform */ 233813498266Sopenharmony_ci } 233913498266Sopenharmony_ci break; 234013498266Sopenharmony_ci 234113498266Sopenharmony_ci case CURLOPT_PRIVATE: 234213498266Sopenharmony_ci /* 234313498266Sopenharmony_ci * Set private data pointer. 234413498266Sopenharmony_ci */ 234513498266Sopenharmony_ci data->set.private_data = va_arg(param, void *); 234613498266Sopenharmony_ci break; 234713498266Sopenharmony_ci 234813498266Sopenharmony_ci case CURLOPT_MAXFILESIZE: 234913498266Sopenharmony_ci /* 235013498266Sopenharmony_ci * Set the maximum size of a file to download. 235113498266Sopenharmony_ci */ 235213498266Sopenharmony_ci arg = va_arg(param, long); 235313498266Sopenharmony_ci if(arg < 0) 235413498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 235513498266Sopenharmony_ci data->set.max_filesize = arg; 235613498266Sopenharmony_ci break; 235713498266Sopenharmony_ci 235813498266Sopenharmony_ci#ifdef USE_SSL 235913498266Sopenharmony_ci case CURLOPT_USE_SSL: 236013498266Sopenharmony_ci /* 236113498266Sopenharmony_ci * Make transfers attempt to use SSL/TLS. 236213498266Sopenharmony_ci */ 236313498266Sopenharmony_ci arg = va_arg(param, long); 236413498266Sopenharmony_ci if((arg < CURLUSESSL_NONE) || (arg >= CURLUSESSL_LAST)) 236513498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 236613498266Sopenharmony_ci data->set.use_ssl = (unsigned char)arg; 236713498266Sopenharmony_ci break; 236813498266Sopenharmony_ci 236913498266Sopenharmony_ci case CURLOPT_SSL_OPTIONS: 237013498266Sopenharmony_ci arg = va_arg(param, long); 237113498266Sopenharmony_ci data->set.ssl.primary.ssl_options = (unsigned char)(arg & 0xff); 237213498266Sopenharmony_ci data->set.ssl.enable_beast = !!(arg & CURLSSLOPT_ALLOW_BEAST); 237313498266Sopenharmony_ci data->set.ssl.no_revoke = !!(arg & CURLSSLOPT_NO_REVOKE); 237413498266Sopenharmony_ci data->set.ssl.no_partialchain = !!(arg & CURLSSLOPT_NO_PARTIALCHAIN); 237513498266Sopenharmony_ci data->set.ssl.revoke_best_effort = !!(arg & CURLSSLOPT_REVOKE_BEST_EFFORT); 237613498266Sopenharmony_ci data->set.ssl.native_ca_store = !!(arg & CURLSSLOPT_NATIVE_CA); 237713498266Sopenharmony_ci data->set.ssl.auto_client_cert = !!(arg & CURLSSLOPT_AUTO_CLIENT_CERT); 237813498266Sopenharmony_ci /* If a setting is added here it should also be added in dohprobe() 237913498266Sopenharmony_ci which sets its own CURLOPT_SSL_OPTIONS based on these settings. */ 238013498266Sopenharmony_ci break; 238113498266Sopenharmony_ci 238213498266Sopenharmony_ci#ifndef CURL_DISABLE_PROXY 238313498266Sopenharmony_ci case CURLOPT_PROXY_SSL_OPTIONS: 238413498266Sopenharmony_ci arg = va_arg(param, long); 238513498266Sopenharmony_ci data->set.proxy_ssl.primary.ssl_options = (unsigned char)(arg & 0xff); 238613498266Sopenharmony_ci data->set.proxy_ssl.enable_beast = !!(arg & CURLSSLOPT_ALLOW_BEAST); 238713498266Sopenharmony_ci data->set.proxy_ssl.no_revoke = !!(arg & CURLSSLOPT_NO_REVOKE); 238813498266Sopenharmony_ci data->set.proxy_ssl.no_partialchain = !!(arg & CURLSSLOPT_NO_PARTIALCHAIN); 238913498266Sopenharmony_ci data->set.proxy_ssl.revoke_best_effort = 239013498266Sopenharmony_ci !!(arg & CURLSSLOPT_REVOKE_BEST_EFFORT); 239113498266Sopenharmony_ci data->set.proxy_ssl.native_ca_store = !!(arg & CURLSSLOPT_NATIVE_CA); 239213498266Sopenharmony_ci data->set.proxy_ssl.auto_client_cert = 239313498266Sopenharmony_ci !!(arg & CURLSSLOPT_AUTO_CLIENT_CERT); 239413498266Sopenharmony_ci break; 239513498266Sopenharmony_ci#endif 239613498266Sopenharmony_ci 239713498266Sopenharmony_ci case CURLOPT_SSL_EC_CURVES: 239813498266Sopenharmony_ci /* 239913498266Sopenharmony_ci * Set accepted curves in SSL connection setup. 240013498266Sopenharmony_ci * Specify colon-delimited list of curve algorithm names. 240113498266Sopenharmony_ci */ 240213498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_SSL_EC_CURVES], 240313498266Sopenharmony_ci va_arg(param, char *)); 240413498266Sopenharmony_ci break; 240513498266Sopenharmony_ci#endif 240613498266Sopenharmony_ci case CURLOPT_IPRESOLVE: 240713498266Sopenharmony_ci arg = va_arg(param, long); 240813498266Sopenharmony_ci if((arg < CURL_IPRESOLVE_WHATEVER) || (arg > CURL_IPRESOLVE_V6)) 240913498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 241013498266Sopenharmony_ci data->set.ipver = (unsigned char) arg; 241113498266Sopenharmony_ci break; 241213498266Sopenharmony_ci 241313498266Sopenharmony_ci case CURLOPT_MAXFILESIZE_LARGE: 241413498266Sopenharmony_ci /* 241513498266Sopenharmony_ci * Set the maximum size of a file to download. 241613498266Sopenharmony_ci */ 241713498266Sopenharmony_ci bigsize = va_arg(param, curl_off_t); 241813498266Sopenharmony_ci if(bigsize < 0) 241913498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 242013498266Sopenharmony_ci data->set.max_filesize = bigsize; 242113498266Sopenharmony_ci break; 242213498266Sopenharmony_ci 242313498266Sopenharmony_ci case CURLOPT_TCP_NODELAY: 242413498266Sopenharmony_ci /* 242513498266Sopenharmony_ci * Enable or disable TCP_NODELAY, which will disable/enable the Nagle 242613498266Sopenharmony_ci * algorithm 242713498266Sopenharmony_ci */ 242813498266Sopenharmony_ci data->set.tcp_nodelay = (0 != va_arg(param, long)); 242913498266Sopenharmony_ci break; 243013498266Sopenharmony_ci 243113498266Sopenharmony_ci case CURLOPT_IGNORE_CONTENT_LENGTH: 243213498266Sopenharmony_ci data->set.ignorecl = (0 != va_arg(param, long)); 243313498266Sopenharmony_ci break; 243413498266Sopenharmony_ci 243513498266Sopenharmony_ci case CURLOPT_CONNECT_ONLY: 243613498266Sopenharmony_ci /* 243713498266Sopenharmony_ci * No data transfer. 243813498266Sopenharmony_ci * (1) - only do connection 243913498266Sopenharmony_ci * (2) - do first get request but get no content 244013498266Sopenharmony_ci */ 244113498266Sopenharmony_ci arg = va_arg(param, long); 244213498266Sopenharmony_ci if(arg > 2) 244313498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 244413498266Sopenharmony_ci data->set.connect_only = (unsigned char)arg; 244513498266Sopenharmony_ci break; 244613498266Sopenharmony_ci 244713498266Sopenharmony_ci case CURLOPT_SOCKOPTFUNCTION: 244813498266Sopenharmony_ci /* 244913498266Sopenharmony_ci * socket callback function: called after socket() but before connect() 245013498266Sopenharmony_ci */ 245113498266Sopenharmony_ci data->set.fsockopt = va_arg(param, curl_sockopt_callback); 245213498266Sopenharmony_ci break; 245313498266Sopenharmony_ci 245413498266Sopenharmony_ci case CURLOPT_SOCKOPTDATA: 245513498266Sopenharmony_ci /* 245613498266Sopenharmony_ci * socket callback data pointer. Might be NULL. 245713498266Sopenharmony_ci */ 245813498266Sopenharmony_ci data->set.sockopt_client = va_arg(param, void *); 245913498266Sopenharmony_ci break; 246013498266Sopenharmony_ci 246113498266Sopenharmony_ci case CURLOPT_OPENSOCKETFUNCTION: 246213498266Sopenharmony_ci /* 246313498266Sopenharmony_ci * open/create socket callback function: called instead of socket(), 246413498266Sopenharmony_ci * before connect() 246513498266Sopenharmony_ci */ 246613498266Sopenharmony_ci data->set.fopensocket = va_arg(param, curl_opensocket_callback); 246713498266Sopenharmony_ci break; 246813498266Sopenharmony_ci 246913498266Sopenharmony_ci case CURLOPT_OPENSOCKETDATA: 247013498266Sopenharmony_ci /* 247113498266Sopenharmony_ci * socket callback data pointer. Might be NULL. 247213498266Sopenharmony_ci */ 247313498266Sopenharmony_ci data->set.opensocket_client = va_arg(param, void *); 247413498266Sopenharmony_ci break; 247513498266Sopenharmony_ci 247613498266Sopenharmony_ci case CURLOPT_CLOSESOCKETFUNCTION: 247713498266Sopenharmony_ci /* 247813498266Sopenharmony_ci * close socket callback function: called instead of close() 247913498266Sopenharmony_ci * when shutting down a connection 248013498266Sopenharmony_ci */ 248113498266Sopenharmony_ci data->set.fclosesocket = va_arg(param, curl_closesocket_callback); 248213498266Sopenharmony_ci break; 248313498266Sopenharmony_ci 248413498266Sopenharmony_ci case CURLOPT_RESOLVER_START_FUNCTION: 248513498266Sopenharmony_ci /* 248613498266Sopenharmony_ci * resolver start callback function: called before a new resolver request 248713498266Sopenharmony_ci * is started 248813498266Sopenharmony_ci */ 248913498266Sopenharmony_ci data->set.resolver_start = va_arg(param, curl_resolver_start_callback); 249013498266Sopenharmony_ci break; 249113498266Sopenharmony_ci 249213498266Sopenharmony_ci case CURLOPT_RESOLVER_START_DATA: 249313498266Sopenharmony_ci /* 249413498266Sopenharmony_ci * resolver start callback data pointer. Might be NULL. 249513498266Sopenharmony_ci */ 249613498266Sopenharmony_ci data->set.resolver_start_client = va_arg(param, void *); 249713498266Sopenharmony_ci break; 249813498266Sopenharmony_ci 249913498266Sopenharmony_ci case CURLOPT_CLOSESOCKETDATA: 250013498266Sopenharmony_ci /* 250113498266Sopenharmony_ci * socket callback data pointer. Might be NULL. 250213498266Sopenharmony_ci */ 250313498266Sopenharmony_ci data->set.closesocket_client = va_arg(param, void *); 250413498266Sopenharmony_ci break; 250513498266Sopenharmony_ci 250613498266Sopenharmony_ci case CURLOPT_SSL_SESSIONID_CACHE: 250713498266Sopenharmony_ci data->set.ssl.primary.sessionid = (0 != va_arg(param, long)); 250813498266Sopenharmony_ci#ifndef CURL_DISABLE_PROXY 250913498266Sopenharmony_ci data->set.proxy_ssl.primary.sessionid = data->set.ssl.primary.sessionid; 251013498266Sopenharmony_ci#endif 251113498266Sopenharmony_ci break; 251213498266Sopenharmony_ci 251313498266Sopenharmony_ci#ifdef USE_SSH 251413498266Sopenharmony_ci /* we only include SSH options if explicitly built to support SSH */ 251513498266Sopenharmony_ci case CURLOPT_SSH_AUTH_TYPES: 251613498266Sopenharmony_ci data->set.ssh_auth_types = (unsigned int)va_arg(param, long); 251713498266Sopenharmony_ci break; 251813498266Sopenharmony_ci 251913498266Sopenharmony_ci case CURLOPT_SSH_PUBLIC_KEYFILE: 252013498266Sopenharmony_ci /* 252113498266Sopenharmony_ci * Use this file instead of the $HOME/.ssh/id_dsa.pub file 252213498266Sopenharmony_ci */ 252313498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_SSH_PUBLIC_KEY], 252413498266Sopenharmony_ci va_arg(param, char *)); 252513498266Sopenharmony_ci break; 252613498266Sopenharmony_ci 252713498266Sopenharmony_ci case CURLOPT_SSH_PRIVATE_KEYFILE: 252813498266Sopenharmony_ci /* 252913498266Sopenharmony_ci * Use this file instead of the $HOME/.ssh/id_dsa file 253013498266Sopenharmony_ci */ 253113498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_SSH_PRIVATE_KEY], 253213498266Sopenharmony_ci va_arg(param, char *)); 253313498266Sopenharmony_ci break; 253413498266Sopenharmony_ci case CURLOPT_SSH_HOST_PUBLIC_KEY_MD5: 253513498266Sopenharmony_ci /* 253613498266Sopenharmony_ci * Option to allow for the MD5 of the host public key to be checked 253713498266Sopenharmony_ci * for validation purposes. 253813498266Sopenharmony_ci */ 253913498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_SSH_HOST_PUBLIC_KEY_MD5], 254013498266Sopenharmony_ci va_arg(param, char *)); 254113498266Sopenharmony_ci break; 254213498266Sopenharmony_ci 254313498266Sopenharmony_ci case CURLOPT_SSH_KNOWNHOSTS: 254413498266Sopenharmony_ci /* 254513498266Sopenharmony_ci * Store the file name to read known hosts from. 254613498266Sopenharmony_ci */ 254713498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_SSH_KNOWNHOSTS], 254813498266Sopenharmony_ci va_arg(param, char *)); 254913498266Sopenharmony_ci break; 255013498266Sopenharmony_ci#ifdef USE_LIBSSH2 255113498266Sopenharmony_ci case CURLOPT_SSH_HOST_PUBLIC_KEY_SHA256: 255213498266Sopenharmony_ci /* 255313498266Sopenharmony_ci * Option to allow for the SHA256 of the host public key to be checked 255413498266Sopenharmony_ci * for validation purposes. 255513498266Sopenharmony_ci */ 255613498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_SSH_HOST_PUBLIC_KEY_SHA256], 255713498266Sopenharmony_ci va_arg(param, char *)); 255813498266Sopenharmony_ci break; 255913498266Sopenharmony_ci 256013498266Sopenharmony_ci case CURLOPT_SSH_HOSTKEYFUNCTION: 256113498266Sopenharmony_ci /* the callback to check the hostkey without the knownhost file */ 256213498266Sopenharmony_ci data->set.ssh_hostkeyfunc = va_arg(param, curl_sshhostkeycallback); 256313498266Sopenharmony_ci break; 256413498266Sopenharmony_ci 256513498266Sopenharmony_ci case CURLOPT_SSH_HOSTKEYDATA: 256613498266Sopenharmony_ci /* 256713498266Sopenharmony_ci * Custom client data to pass to the SSH keyfunc callback 256813498266Sopenharmony_ci */ 256913498266Sopenharmony_ci data->set.ssh_hostkeyfunc_userp = va_arg(param, void *); 257013498266Sopenharmony_ci break; 257113498266Sopenharmony_ci#endif 257213498266Sopenharmony_ci 257313498266Sopenharmony_ci case CURLOPT_SSH_KEYFUNCTION: 257413498266Sopenharmony_ci /* setting to NULL is fine since the ssh.c functions themselves will 257513498266Sopenharmony_ci then revert to use the internal default */ 257613498266Sopenharmony_ci data->set.ssh_keyfunc = va_arg(param, curl_sshkeycallback); 257713498266Sopenharmony_ci break; 257813498266Sopenharmony_ci 257913498266Sopenharmony_ci case CURLOPT_SSH_KEYDATA: 258013498266Sopenharmony_ci /* 258113498266Sopenharmony_ci * Custom client data to pass to the SSH keyfunc callback 258213498266Sopenharmony_ci */ 258313498266Sopenharmony_ci data->set.ssh_keyfunc_userp = va_arg(param, void *); 258413498266Sopenharmony_ci break; 258513498266Sopenharmony_ci 258613498266Sopenharmony_ci case CURLOPT_SSH_COMPRESSION: 258713498266Sopenharmony_ci data->set.ssh_compression = (0 != va_arg(param, long))?TRUE:FALSE; 258813498266Sopenharmony_ci break; 258913498266Sopenharmony_ci#endif /* USE_SSH */ 259013498266Sopenharmony_ci 259113498266Sopenharmony_ci case CURLOPT_HTTP_TRANSFER_DECODING: 259213498266Sopenharmony_ci /* 259313498266Sopenharmony_ci * disable libcurl transfer encoding is used 259413498266Sopenharmony_ci */ 259513498266Sopenharmony_ci#ifndef USE_HYPER 259613498266Sopenharmony_ci data->set.http_te_skip = (0 == va_arg(param, long)); 259713498266Sopenharmony_ci break; 259813498266Sopenharmony_ci#else 259913498266Sopenharmony_ci return CURLE_NOT_BUILT_IN; /* hyper doesn't support */ 260013498266Sopenharmony_ci#endif 260113498266Sopenharmony_ci 260213498266Sopenharmony_ci case CURLOPT_HTTP_CONTENT_DECODING: 260313498266Sopenharmony_ci /* 260413498266Sopenharmony_ci * raw data passed to the application when content encoding is used 260513498266Sopenharmony_ci */ 260613498266Sopenharmony_ci data->set.http_ce_skip = (0 == va_arg(param, long)); 260713498266Sopenharmony_ci break; 260813498266Sopenharmony_ci 260913498266Sopenharmony_ci#if !defined(CURL_DISABLE_FTP) || defined(USE_SSH) 261013498266Sopenharmony_ci case CURLOPT_NEW_FILE_PERMS: 261113498266Sopenharmony_ci /* 261213498266Sopenharmony_ci * Uses these permissions instead of 0644 261313498266Sopenharmony_ci */ 261413498266Sopenharmony_ci arg = va_arg(param, long); 261513498266Sopenharmony_ci if((arg < 0) || (arg > 0777)) 261613498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 261713498266Sopenharmony_ci data->set.new_file_perms = (unsigned int)arg; 261813498266Sopenharmony_ci break; 261913498266Sopenharmony_ci#endif 262013498266Sopenharmony_ci#ifdef USE_SSH 262113498266Sopenharmony_ci case CURLOPT_NEW_DIRECTORY_PERMS: 262213498266Sopenharmony_ci /* 262313498266Sopenharmony_ci * Uses these permissions instead of 0755 262413498266Sopenharmony_ci */ 262513498266Sopenharmony_ci arg = va_arg(param, long); 262613498266Sopenharmony_ci if((arg < 0) || (arg > 0777)) 262713498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 262813498266Sopenharmony_ci data->set.new_directory_perms = (unsigned int)arg; 262913498266Sopenharmony_ci break; 263013498266Sopenharmony_ci#endif 263113498266Sopenharmony_ci 263213498266Sopenharmony_ci#ifdef ENABLE_IPV6 263313498266Sopenharmony_ci case CURLOPT_ADDRESS_SCOPE: 263413498266Sopenharmony_ci /* 263513498266Sopenharmony_ci * Use this scope id when using IPv6 263613498266Sopenharmony_ci * We always get longs when passed plain numericals so we should check 263713498266Sopenharmony_ci * that the value fits into an unsigned 32 bit integer. 263813498266Sopenharmony_ci */ 263913498266Sopenharmony_ci uarg = va_arg(param, unsigned long); 264013498266Sopenharmony_ci#if SIZEOF_LONG > 4 264113498266Sopenharmony_ci if(uarg > UINT_MAX) 264213498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 264313498266Sopenharmony_ci#endif 264413498266Sopenharmony_ci data->set.scope_id = (unsigned int)uarg; 264513498266Sopenharmony_ci break; 264613498266Sopenharmony_ci#endif 264713498266Sopenharmony_ci 264813498266Sopenharmony_ci case CURLOPT_PROTOCOLS: 264913498266Sopenharmony_ci /* set the bitmask for the protocols that are allowed to be used for the 265013498266Sopenharmony_ci transfer, which thus helps the app which takes URLs from users or other 265113498266Sopenharmony_ci external inputs and want to restrict what protocol(s) to deal 265213498266Sopenharmony_ci with. Defaults to CURLPROTO_ALL. */ 265313498266Sopenharmony_ci data->set.allowed_protocols = (curl_prot_t)va_arg(param, long); 265413498266Sopenharmony_ci break; 265513498266Sopenharmony_ci 265613498266Sopenharmony_ci case CURLOPT_REDIR_PROTOCOLS: 265713498266Sopenharmony_ci /* set the bitmask for the protocols that libcurl is allowed to follow to, 265813498266Sopenharmony_ci as a subset of the CURLOPT_PROTOCOLS ones. That means the protocol needs 265913498266Sopenharmony_ci to be set in both bitmasks to be allowed to get redirected to. */ 266013498266Sopenharmony_ci data->set.redir_protocols = (curl_prot_t)va_arg(param, long); 266113498266Sopenharmony_ci break; 266213498266Sopenharmony_ci 266313498266Sopenharmony_ci case CURLOPT_PROTOCOLS_STR: { 266413498266Sopenharmony_ci argptr = va_arg(param, char *); 266513498266Sopenharmony_ci result = protocol2num(argptr, &data->set.allowed_protocols); 266613498266Sopenharmony_ci if(result) 266713498266Sopenharmony_ci return result; 266813498266Sopenharmony_ci break; 266913498266Sopenharmony_ci } 267013498266Sopenharmony_ci 267113498266Sopenharmony_ci case CURLOPT_REDIR_PROTOCOLS_STR: { 267213498266Sopenharmony_ci argptr = va_arg(param, char *); 267313498266Sopenharmony_ci result = protocol2num(argptr, &data->set.redir_protocols); 267413498266Sopenharmony_ci if(result) 267513498266Sopenharmony_ci return result; 267613498266Sopenharmony_ci break; 267713498266Sopenharmony_ci } 267813498266Sopenharmony_ci 267913498266Sopenharmony_ci case CURLOPT_DEFAULT_PROTOCOL: 268013498266Sopenharmony_ci /* Set the protocol to use when the URL doesn't include any protocol */ 268113498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_DEFAULT_PROTOCOL], 268213498266Sopenharmony_ci va_arg(param, char *)); 268313498266Sopenharmony_ci break; 268413498266Sopenharmony_ci#ifndef CURL_DISABLE_SMTP 268513498266Sopenharmony_ci case CURLOPT_MAIL_FROM: 268613498266Sopenharmony_ci /* Set the SMTP mail originator */ 268713498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_MAIL_FROM], 268813498266Sopenharmony_ci va_arg(param, char *)); 268913498266Sopenharmony_ci break; 269013498266Sopenharmony_ci 269113498266Sopenharmony_ci case CURLOPT_MAIL_AUTH: 269213498266Sopenharmony_ci /* Set the SMTP auth originator */ 269313498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_MAIL_AUTH], 269413498266Sopenharmony_ci va_arg(param, char *)); 269513498266Sopenharmony_ci break; 269613498266Sopenharmony_ci 269713498266Sopenharmony_ci case CURLOPT_MAIL_RCPT: 269813498266Sopenharmony_ci /* Set the list of mail recipients */ 269913498266Sopenharmony_ci data->set.mail_rcpt = va_arg(param, struct curl_slist *); 270013498266Sopenharmony_ci break; 270113498266Sopenharmony_ci case CURLOPT_MAIL_RCPT_ALLOWFAILS: 270213498266Sopenharmony_ci /* allow RCPT TO command to fail for some recipients */ 270313498266Sopenharmony_ci data->set.mail_rcpt_allowfails = (0 != va_arg(param, long)); 270413498266Sopenharmony_ci break; 270513498266Sopenharmony_ci#endif 270613498266Sopenharmony_ci 270713498266Sopenharmony_ci case CURLOPT_SASL_AUTHZID: 270813498266Sopenharmony_ci /* Authorization identity (identity to act as) */ 270913498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_SASL_AUTHZID], 271013498266Sopenharmony_ci va_arg(param, char *)); 271113498266Sopenharmony_ci break; 271213498266Sopenharmony_ci 271313498266Sopenharmony_ci case CURLOPT_SASL_IR: 271413498266Sopenharmony_ci /* Enable/disable SASL initial response */ 271513498266Sopenharmony_ci data->set.sasl_ir = (0 != va_arg(param, long)); 271613498266Sopenharmony_ci break; 271713498266Sopenharmony_ci#ifndef CURL_DISABLE_RTSP 271813498266Sopenharmony_ci case CURLOPT_RTSP_REQUEST: 271913498266Sopenharmony_ci { 272013498266Sopenharmony_ci /* 272113498266Sopenharmony_ci * Set the RTSP request method (OPTIONS, SETUP, PLAY, etc...) 272213498266Sopenharmony_ci * Would this be better if the RTSPREQ_* were just moved into here? 272313498266Sopenharmony_ci */ 272413498266Sopenharmony_ci long in_rtspreq = va_arg(param, long); 272513498266Sopenharmony_ci Curl_RtspReq rtspreq = RTSPREQ_NONE; 272613498266Sopenharmony_ci switch(in_rtspreq) { 272713498266Sopenharmony_ci case CURL_RTSPREQ_OPTIONS: 272813498266Sopenharmony_ci rtspreq = RTSPREQ_OPTIONS; 272913498266Sopenharmony_ci break; 273013498266Sopenharmony_ci 273113498266Sopenharmony_ci case CURL_RTSPREQ_DESCRIBE: 273213498266Sopenharmony_ci rtspreq = RTSPREQ_DESCRIBE; 273313498266Sopenharmony_ci break; 273413498266Sopenharmony_ci 273513498266Sopenharmony_ci case CURL_RTSPREQ_ANNOUNCE: 273613498266Sopenharmony_ci rtspreq = RTSPREQ_ANNOUNCE; 273713498266Sopenharmony_ci break; 273813498266Sopenharmony_ci 273913498266Sopenharmony_ci case CURL_RTSPREQ_SETUP: 274013498266Sopenharmony_ci rtspreq = RTSPREQ_SETUP; 274113498266Sopenharmony_ci break; 274213498266Sopenharmony_ci 274313498266Sopenharmony_ci case CURL_RTSPREQ_PLAY: 274413498266Sopenharmony_ci rtspreq = RTSPREQ_PLAY; 274513498266Sopenharmony_ci break; 274613498266Sopenharmony_ci 274713498266Sopenharmony_ci case CURL_RTSPREQ_PAUSE: 274813498266Sopenharmony_ci rtspreq = RTSPREQ_PAUSE; 274913498266Sopenharmony_ci break; 275013498266Sopenharmony_ci 275113498266Sopenharmony_ci case CURL_RTSPREQ_TEARDOWN: 275213498266Sopenharmony_ci rtspreq = RTSPREQ_TEARDOWN; 275313498266Sopenharmony_ci break; 275413498266Sopenharmony_ci 275513498266Sopenharmony_ci case CURL_RTSPREQ_GET_PARAMETER: 275613498266Sopenharmony_ci rtspreq = RTSPREQ_GET_PARAMETER; 275713498266Sopenharmony_ci break; 275813498266Sopenharmony_ci 275913498266Sopenharmony_ci case CURL_RTSPREQ_SET_PARAMETER: 276013498266Sopenharmony_ci rtspreq = RTSPREQ_SET_PARAMETER; 276113498266Sopenharmony_ci break; 276213498266Sopenharmony_ci 276313498266Sopenharmony_ci case CURL_RTSPREQ_RECORD: 276413498266Sopenharmony_ci rtspreq = RTSPREQ_RECORD; 276513498266Sopenharmony_ci break; 276613498266Sopenharmony_ci 276713498266Sopenharmony_ci case CURL_RTSPREQ_RECEIVE: 276813498266Sopenharmony_ci rtspreq = RTSPREQ_RECEIVE; 276913498266Sopenharmony_ci break; 277013498266Sopenharmony_ci default: 277113498266Sopenharmony_ci rtspreq = RTSPREQ_NONE; 277213498266Sopenharmony_ci } 277313498266Sopenharmony_ci 277413498266Sopenharmony_ci data->set.rtspreq = rtspreq; 277513498266Sopenharmony_ci break; 277613498266Sopenharmony_ci } 277713498266Sopenharmony_ci 277813498266Sopenharmony_ci 277913498266Sopenharmony_ci case CURLOPT_RTSP_SESSION_ID: 278013498266Sopenharmony_ci /* 278113498266Sopenharmony_ci * Set the RTSP Session ID manually. Useful if the application is 278213498266Sopenharmony_ci * resuming a previously established RTSP session 278313498266Sopenharmony_ci */ 278413498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_RTSP_SESSION_ID], 278513498266Sopenharmony_ci va_arg(param, char *)); 278613498266Sopenharmony_ci break; 278713498266Sopenharmony_ci 278813498266Sopenharmony_ci case CURLOPT_RTSP_STREAM_URI: 278913498266Sopenharmony_ci /* 279013498266Sopenharmony_ci * Set the Stream URI for the RTSP request. Unless the request is 279113498266Sopenharmony_ci * for generic server options, the application will need to set this. 279213498266Sopenharmony_ci */ 279313498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_RTSP_STREAM_URI], 279413498266Sopenharmony_ci va_arg(param, char *)); 279513498266Sopenharmony_ci break; 279613498266Sopenharmony_ci 279713498266Sopenharmony_ci case CURLOPT_RTSP_TRANSPORT: 279813498266Sopenharmony_ci /* 279913498266Sopenharmony_ci * The content of the Transport: header for the RTSP request 280013498266Sopenharmony_ci */ 280113498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_RTSP_TRANSPORT], 280213498266Sopenharmony_ci va_arg(param, char *)); 280313498266Sopenharmony_ci break; 280413498266Sopenharmony_ci 280513498266Sopenharmony_ci case CURLOPT_RTSP_CLIENT_CSEQ: 280613498266Sopenharmony_ci /* 280713498266Sopenharmony_ci * Set the CSEQ number to issue for the next RTSP request. Useful if the 280813498266Sopenharmony_ci * application is resuming a previously broken connection. The CSEQ 280913498266Sopenharmony_ci * will increment from this new number henceforth. 281013498266Sopenharmony_ci */ 281113498266Sopenharmony_ci data->state.rtsp_next_client_CSeq = va_arg(param, long); 281213498266Sopenharmony_ci break; 281313498266Sopenharmony_ci 281413498266Sopenharmony_ci case CURLOPT_RTSP_SERVER_CSEQ: 281513498266Sopenharmony_ci /* Same as the above, but for server-initiated requests */ 281613498266Sopenharmony_ci data->state.rtsp_next_server_CSeq = va_arg(param, long); 281713498266Sopenharmony_ci break; 281813498266Sopenharmony_ci 281913498266Sopenharmony_ci case CURLOPT_INTERLEAVEDATA: 282013498266Sopenharmony_ci data->set.rtp_out = va_arg(param, void *); 282113498266Sopenharmony_ci break; 282213498266Sopenharmony_ci case CURLOPT_INTERLEAVEFUNCTION: 282313498266Sopenharmony_ci /* Set the user defined RTP write function */ 282413498266Sopenharmony_ci data->set.fwrite_rtp = va_arg(param, curl_write_callback); 282513498266Sopenharmony_ci break; 282613498266Sopenharmony_ci#endif 282713498266Sopenharmony_ci#ifndef CURL_DISABLE_FTP 282813498266Sopenharmony_ci case CURLOPT_WILDCARDMATCH: 282913498266Sopenharmony_ci data->set.wildcard_enabled = (0 != va_arg(param, long)); 283013498266Sopenharmony_ci break; 283113498266Sopenharmony_ci case CURLOPT_CHUNK_BGN_FUNCTION: 283213498266Sopenharmony_ci data->set.chunk_bgn = va_arg(param, curl_chunk_bgn_callback); 283313498266Sopenharmony_ci break; 283413498266Sopenharmony_ci case CURLOPT_CHUNK_END_FUNCTION: 283513498266Sopenharmony_ci data->set.chunk_end = va_arg(param, curl_chunk_end_callback); 283613498266Sopenharmony_ci break; 283713498266Sopenharmony_ci case CURLOPT_FNMATCH_FUNCTION: 283813498266Sopenharmony_ci data->set.fnmatch = va_arg(param, curl_fnmatch_callback); 283913498266Sopenharmony_ci break; 284013498266Sopenharmony_ci case CURLOPT_CHUNK_DATA: 284113498266Sopenharmony_ci data->set.wildcardptr = va_arg(param, void *); 284213498266Sopenharmony_ci break; 284313498266Sopenharmony_ci case CURLOPT_FNMATCH_DATA: 284413498266Sopenharmony_ci data->set.fnmatch_data = va_arg(param, void *); 284513498266Sopenharmony_ci break; 284613498266Sopenharmony_ci#endif 284713498266Sopenharmony_ci#ifdef USE_TLS_SRP 284813498266Sopenharmony_ci case CURLOPT_TLSAUTH_USERNAME: 284913498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_TLSAUTH_USERNAME], 285013498266Sopenharmony_ci va_arg(param, char *)); 285113498266Sopenharmony_ci break; 285213498266Sopenharmony_ci#ifndef CURL_DISABLE_PROXY 285313498266Sopenharmony_ci case CURLOPT_PROXY_TLSAUTH_USERNAME: 285413498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_TLSAUTH_USERNAME_PROXY], 285513498266Sopenharmony_ci va_arg(param, char *)); 285613498266Sopenharmony_ci break; 285713498266Sopenharmony_ci#endif 285813498266Sopenharmony_ci case CURLOPT_TLSAUTH_PASSWORD: 285913498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_TLSAUTH_PASSWORD], 286013498266Sopenharmony_ci va_arg(param, char *)); 286113498266Sopenharmony_ci break; 286213498266Sopenharmony_ci#ifndef CURL_DISABLE_PROXY 286313498266Sopenharmony_ci case CURLOPT_PROXY_TLSAUTH_PASSWORD: 286413498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_TLSAUTH_PASSWORD_PROXY], 286513498266Sopenharmony_ci va_arg(param, char *)); 286613498266Sopenharmony_ci break; 286713498266Sopenharmony_ci#endif 286813498266Sopenharmony_ci case CURLOPT_TLSAUTH_TYPE: 286913498266Sopenharmony_ci argptr = va_arg(param, char *); 287013498266Sopenharmony_ci if(argptr && !strncasecompare(argptr, "SRP", strlen("SRP"))) 287113498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 287213498266Sopenharmony_ci break; 287313498266Sopenharmony_ci#ifndef CURL_DISABLE_PROXY 287413498266Sopenharmony_ci case CURLOPT_PROXY_TLSAUTH_TYPE: 287513498266Sopenharmony_ci argptr = va_arg(param, char *); 287613498266Sopenharmony_ci if(argptr || !strncasecompare(argptr, "SRP", strlen("SRP"))) 287713498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 287813498266Sopenharmony_ci break; 287913498266Sopenharmony_ci#endif 288013498266Sopenharmony_ci#endif 288113498266Sopenharmony_ci#ifdef USE_ARES 288213498266Sopenharmony_ci case CURLOPT_DNS_SERVERS: 288313498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_DNS_SERVERS], 288413498266Sopenharmony_ci va_arg(param, char *)); 288513498266Sopenharmony_ci if(result) 288613498266Sopenharmony_ci return result; 288713498266Sopenharmony_ci result = Curl_set_dns_servers(data, data->set.str[STRING_DNS_SERVERS]); 288813498266Sopenharmony_ci break; 288913498266Sopenharmony_ci case CURLOPT_DNS_INTERFACE: 289013498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_DNS_INTERFACE], 289113498266Sopenharmony_ci va_arg(param, char *)); 289213498266Sopenharmony_ci if(result) 289313498266Sopenharmony_ci return result; 289413498266Sopenharmony_ci result = Curl_set_dns_interface(data, data->set.str[STRING_DNS_INTERFACE]); 289513498266Sopenharmony_ci break; 289613498266Sopenharmony_ci case CURLOPT_DNS_LOCAL_IP4: 289713498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_DNS_LOCAL_IP4], 289813498266Sopenharmony_ci va_arg(param, char *)); 289913498266Sopenharmony_ci if(result) 290013498266Sopenharmony_ci return result; 290113498266Sopenharmony_ci result = Curl_set_dns_local_ip4(data, data->set.str[STRING_DNS_LOCAL_IP4]); 290213498266Sopenharmony_ci break; 290313498266Sopenharmony_ci case CURLOPT_DNS_LOCAL_IP6: 290413498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_DNS_LOCAL_IP6], 290513498266Sopenharmony_ci va_arg(param, char *)); 290613498266Sopenharmony_ci if(result) 290713498266Sopenharmony_ci return result; 290813498266Sopenharmony_ci result = Curl_set_dns_local_ip6(data, data->set.str[STRING_DNS_LOCAL_IP6]); 290913498266Sopenharmony_ci break; 291013498266Sopenharmony_ci#endif 291113498266Sopenharmony_ci case CURLOPT_TCP_KEEPALIVE: 291213498266Sopenharmony_ci data->set.tcp_keepalive = (0 != va_arg(param, long)); 291313498266Sopenharmony_ci break; 291413498266Sopenharmony_ci case CURLOPT_TCP_KEEPIDLE: 291513498266Sopenharmony_ci arg = va_arg(param, long); 291613498266Sopenharmony_ci if(arg < 0) 291713498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 291813498266Sopenharmony_ci else if(arg > INT_MAX) 291913498266Sopenharmony_ci arg = INT_MAX; 292013498266Sopenharmony_ci data->set.tcp_keepidle = (int)arg; 292113498266Sopenharmony_ci break; 292213498266Sopenharmony_ci case CURLOPT_TCP_KEEPINTVL: 292313498266Sopenharmony_ci arg = va_arg(param, long); 292413498266Sopenharmony_ci if(arg < 0) 292513498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 292613498266Sopenharmony_ci else if(arg > INT_MAX) 292713498266Sopenharmony_ci arg = INT_MAX; 292813498266Sopenharmony_ci data->set.tcp_keepintvl = (int)arg; 292913498266Sopenharmony_ci break; 293013498266Sopenharmony_ci case CURLOPT_TCP_FASTOPEN: 293113498266Sopenharmony_ci#if defined(CONNECT_DATA_IDEMPOTENT) || defined(MSG_FASTOPEN) || \ 293213498266Sopenharmony_ci defined(TCP_FASTOPEN_CONNECT) 293313498266Sopenharmony_ci data->set.tcp_fastopen = (0 != va_arg(param, long))?TRUE:FALSE; 293413498266Sopenharmony_ci#else 293513498266Sopenharmony_ci result = CURLE_NOT_BUILT_IN; 293613498266Sopenharmony_ci#endif 293713498266Sopenharmony_ci break; 293813498266Sopenharmony_ci case CURLOPT_SSL_ENABLE_NPN: 293913498266Sopenharmony_ci break; 294013498266Sopenharmony_ci case CURLOPT_SSL_ENABLE_ALPN: 294113498266Sopenharmony_ci data->set.ssl_enable_alpn = (0 != va_arg(param, long)); 294213498266Sopenharmony_ci break; 294313498266Sopenharmony_ci#ifdef USE_UNIX_SOCKETS 294413498266Sopenharmony_ci case CURLOPT_UNIX_SOCKET_PATH: 294513498266Sopenharmony_ci data->set.abstract_unix_socket = FALSE; 294613498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_UNIX_SOCKET_PATH], 294713498266Sopenharmony_ci va_arg(param, char *)); 294813498266Sopenharmony_ci break; 294913498266Sopenharmony_ci case CURLOPT_ABSTRACT_UNIX_SOCKET: 295013498266Sopenharmony_ci data->set.abstract_unix_socket = TRUE; 295113498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_UNIX_SOCKET_PATH], 295213498266Sopenharmony_ci va_arg(param, char *)); 295313498266Sopenharmony_ci break; 295413498266Sopenharmony_ci#endif 295513498266Sopenharmony_ci 295613498266Sopenharmony_ci case CURLOPT_PATH_AS_IS: 295713498266Sopenharmony_ci data->set.path_as_is = (0 != va_arg(param, long)); 295813498266Sopenharmony_ci break; 295913498266Sopenharmony_ci case CURLOPT_PIPEWAIT: 296013498266Sopenharmony_ci data->set.pipewait = (0 != va_arg(param, long)); 296113498266Sopenharmony_ci break; 296213498266Sopenharmony_ci case CURLOPT_STREAM_WEIGHT: 296313498266Sopenharmony_ci#if defined(USE_HTTP2) || defined(USE_HTTP3) 296413498266Sopenharmony_ci arg = va_arg(param, long); 296513498266Sopenharmony_ci if((arg >= 1) && (arg <= 256)) 296613498266Sopenharmony_ci data->set.priority.weight = (int)arg; 296713498266Sopenharmony_ci break; 296813498266Sopenharmony_ci#else 296913498266Sopenharmony_ci return CURLE_NOT_BUILT_IN; 297013498266Sopenharmony_ci#endif 297113498266Sopenharmony_ci case CURLOPT_STREAM_DEPENDS: 297213498266Sopenharmony_ci case CURLOPT_STREAM_DEPENDS_E: 297313498266Sopenharmony_ci { 297413498266Sopenharmony_ci struct Curl_easy *dep = va_arg(param, struct Curl_easy *); 297513498266Sopenharmony_ci if(!dep || GOOD_EASY_HANDLE(dep)) { 297613498266Sopenharmony_ci return Curl_data_priority_add_child(dep, data, 297713498266Sopenharmony_ci option == CURLOPT_STREAM_DEPENDS_E); 297813498266Sopenharmony_ci } 297913498266Sopenharmony_ci break; 298013498266Sopenharmony_ci } 298113498266Sopenharmony_ci case CURLOPT_CONNECT_TO: 298213498266Sopenharmony_ci data->set.connect_to = va_arg(param, struct curl_slist *); 298313498266Sopenharmony_ci break; 298413498266Sopenharmony_ci case CURLOPT_SUPPRESS_CONNECT_HEADERS: 298513498266Sopenharmony_ci data->set.suppress_connect_headers = (0 != va_arg(param, long))?TRUE:FALSE; 298613498266Sopenharmony_ci break; 298713498266Sopenharmony_ci case CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS: 298813498266Sopenharmony_ci uarg = va_arg(param, unsigned long); 298913498266Sopenharmony_ci if(uarg > UINT_MAX) 299013498266Sopenharmony_ci uarg = UINT_MAX; 299113498266Sopenharmony_ci data->set.happy_eyeballs_timeout = (unsigned int)uarg; 299213498266Sopenharmony_ci break; 299313498266Sopenharmony_ci#ifndef CURL_DISABLE_SHUFFLE_DNS 299413498266Sopenharmony_ci case CURLOPT_DNS_SHUFFLE_ADDRESSES: 299513498266Sopenharmony_ci data->set.dns_shuffle_addresses = (0 != va_arg(param, long)); 299613498266Sopenharmony_ci break; 299713498266Sopenharmony_ci#endif 299813498266Sopenharmony_ci case CURLOPT_DISALLOW_USERNAME_IN_URL: 299913498266Sopenharmony_ci data->set.disallow_username_in_url = (0 != va_arg(param, long)); 300013498266Sopenharmony_ci break; 300113498266Sopenharmony_ci#ifndef CURL_DISABLE_DOH 300213498266Sopenharmony_ci case CURLOPT_DOH_URL: 300313498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_DOH], 300413498266Sopenharmony_ci va_arg(param, char *)); 300513498266Sopenharmony_ci data->set.doh = data->set.str[STRING_DOH]?TRUE:FALSE; 300613498266Sopenharmony_ci break; 300713498266Sopenharmony_ci#endif 300813498266Sopenharmony_ci case CURLOPT_UPKEEP_INTERVAL_MS: 300913498266Sopenharmony_ci arg = va_arg(param, long); 301013498266Sopenharmony_ci if(arg < 0) 301113498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 301213498266Sopenharmony_ci data->set.upkeep_interval_ms = arg; 301313498266Sopenharmony_ci break; 301413498266Sopenharmony_ci case CURLOPT_MAXAGE_CONN: 301513498266Sopenharmony_ci arg = va_arg(param, long); 301613498266Sopenharmony_ci if(arg < 0) 301713498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 301813498266Sopenharmony_ci data->set.maxage_conn = arg; 301913498266Sopenharmony_ci break; 302013498266Sopenharmony_ci case CURLOPT_MAXLIFETIME_CONN: 302113498266Sopenharmony_ci arg = va_arg(param, long); 302213498266Sopenharmony_ci if(arg < 0) 302313498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 302413498266Sopenharmony_ci data->set.maxlifetime_conn = arg; 302513498266Sopenharmony_ci break; 302613498266Sopenharmony_ci case CURLOPT_TRAILERFUNCTION: 302713498266Sopenharmony_ci#ifndef CURL_DISABLE_HTTP 302813498266Sopenharmony_ci data->set.trailer_callback = va_arg(param, curl_trailer_callback); 302913498266Sopenharmony_ci#endif 303013498266Sopenharmony_ci break; 303113498266Sopenharmony_ci case CURLOPT_TRAILERDATA: 303213498266Sopenharmony_ci#ifndef CURL_DISABLE_HTTP 303313498266Sopenharmony_ci data->set.trailer_data = va_arg(param, void *); 303413498266Sopenharmony_ci#endif 303513498266Sopenharmony_ci break; 303613498266Sopenharmony_ci#ifndef CURL_DISABLE_HSTS 303713498266Sopenharmony_ci case CURLOPT_HSTSREADFUNCTION: 303813498266Sopenharmony_ci data->set.hsts_read = va_arg(param, curl_hstsread_callback); 303913498266Sopenharmony_ci break; 304013498266Sopenharmony_ci case CURLOPT_HSTSREADDATA: 304113498266Sopenharmony_ci data->set.hsts_read_userp = va_arg(param, void *); 304213498266Sopenharmony_ci break; 304313498266Sopenharmony_ci case CURLOPT_HSTSWRITEFUNCTION: 304413498266Sopenharmony_ci data->set.hsts_write = va_arg(param, curl_hstswrite_callback); 304513498266Sopenharmony_ci break; 304613498266Sopenharmony_ci case CURLOPT_HSTSWRITEDATA: 304713498266Sopenharmony_ci data->set.hsts_write_userp = va_arg(param, void *); 304813498266Sopenharmony_ci break; 304913498266Sopenharmony_ci case CURLOPT_HSTS: { 305013498266Sopenharmony_ci struct curl_slist *h; 305113498266Sopenharmony_ci if(!data->hsts) { 305213498266Sopenharmony_ci data->hsts = Curl_hsts_init(); 305313498266Sopenharmony_ci if(!data->hsts) 305413498266Sopenharmony_ci return CURLE_OUT_OF_MEMORY; 305513498266Sopenharmony_ci } 305613498266Sopenharmony_ci argptr = va_arg(param, char *); 305713498266Sopenharmony_ci if(argptr) { 305813498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_HSTS], argptr); 305913498266Sopenharmony_ci if(result) 306013498266Sopenharmony_ci return result; 306113498266Sopenharmony_ci /* this needs to build a list of file names to read from, so that it can 306213498266Sopenharmony_ci read them later, as we might get a shared HSTS handle to load them 306313498266Sopenharmony_ci into */ 306413498266Sopenharmony_ci h = curl_slist_append(data->state.hstslist, argptr); 306513498266Sopenharmony_ci if(!h) { 306613498266Sopenharmony_ci curl_slist_free_all(data->state.hstslist); 306713498266Sopenharmony_ci data->state.hstslist = NULL; 306813498266Sopenharmony_ci return CURLE_OUT_OF_MEMORY; 306913498266Sopenharmony_ci } 307013498266Sopenharmony_ci data->state.hstslist = h; /* store the list for later use */ 307113498266Sopenharmony_ci } 307213498266Sopenharmony_ci else { 307313498266Sopenharmony_ci /* clear the list of HSTS files */ 307413498266Sopenharmony_ci curl_slist_free_all(data->state.hstslist); 307513498266Sopenharmony_ci data->state.hstslist = NULL; 307613498266Sopenharmony_ci if(!data->share || !data->share->hsts) 307713498266Sopenharmony_ci /* throw away the HSTS cache unless shared */ 307813498266Sopenharmony_ci Curl_hsts_cleanup(&data->hsts); 307913498266Sopenharmony_ci } 308013498266Sopenharmony_ci break; 308113498266Sopenharmony_ci } 308213498266Sopenharmony_ci case CURLOPT_HSTS_CTRL: 308313498266Sopenharmony_ci arg = va_arg(param, long); 308413498266Sopenharmony_ci if(arg & CURLHSTS_ENABLE) { 308513498266Sopenharmony_ci if(!data->hsts) { 308613498266Sopenharmony_ci data->hsts = Curl_hsts_init(); 308713498266Sopenharmony_ci if(!data->hsts) 308813498266Sopenharmony_ci return CURLE_OUT_OF_MEMORY; 308913498266Sopenharmony_ci } 309013498266Sopenharmony_ci } 309113498266Sopenharmony_ci else 309213498266Sopenharmony_ci Curl_hsts_cleanup(&data->hsts); 309313498266Sopenharmony_ci break; 309413498266Sopenharmony_ci#endif 309513498266Sopenharmony_ci#ifndef CURL_DISABLE_ALTSVC 309613498266Sopenharmony_ci case CURLOPT_ALTSVC: 309713498266Sopenharmony_ci if(!data->asi) { 309813498266Sopenharmony_ci data->asi = Curl_altsvc_init(); 309913498266Sopenharmony_ci if(!data->asi) 310013498266Sopenharmony_ci return CURLE_OUT_OF_MEMORY; 310113498266Sopenharmony_ci } 310213498266Sopenharmony_ci argptr = va_arg(param, char *); 310313498266Sopenharmony_ci result = Curl_setstropt(&data->set.str[STRING_ALTSVC], argptr); 310413498266Sopenharmony_ci if(result) 310513498266Sopenharmony_ci return result; 310613498266Sopenharmony_ci if(argptr) 310713498266Sopenharmony_ci (void)Curl_altsvc_load(data->asi, argptr); 310813498266Sopenharmony_ci break; 310913498266Sopenharmony_ci case CURLOPT_ALTSVC_CTRL: 311013498266Sopenharmony_ci if(!data->asi) { 311113498266Sopenharmony_ci data->asi = Curl_altsvc_init(); 311213498266Sopenharmony_ci if(!data->asi) 311313498266Sopenharmony_ci return CURLE_OUT_OF_MEMORY; 311413498266Sopenharmony_ci } 311513498266Sopenharmony_ci arg = va_arg(param, long); 311613498266Sopenharmony_ci if(!arg) { 311713498266Sopenharmony_ci DEBUGF(infof(data, "bad CURLOPT_ALTSVC_CTRL input")); 311813498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 311913498266Sopenharmony_ci } 312013498266Sopenharmony_ci result = Curl_altsvc_ctrl(data->asi, arg); 312113498266Sopenharmony_ci if(result) 312213498266Sopenharmony_ci return result; 312313498266Sopenharmony_ci break; 312413498266Sopenharmony_ci#endif 312513498266Sopenharmony_ci case CURLOPT_PREREQFUNCTION: 312613498266Sopenharmony_ci data->set.fprereq = va_arg(param, curl_prereq_callback); 312713498266Sopenharmony_ci break; 312813498266Sopenharmony_ci case CURLOPT_PREREQDATA: 312913498266Sopenharmony_ci data->set.prereq_userp = va_arg(param, void *); 313013498266Sopenharmony_ci break; 313113498266Sopenharmony_ci#ifdef USE_WEBSOCKETS 313213498266Sopenharmony_ci case CURLOPT_WS_OPTIONS: { 313313498266Sopenharmony_ci bool raw; 313413498266Sopenharmony_ci arg = va_arg(param, long); 313513498266Sopenharmony_ci raw = (arg & CURLWS_RAW_MODE); 313613498266Sopenharmony_ci data->set.ws_raw_mode = raw; 313713498266Sopenharmony_ci break; 313813498266Sopenharmony_ci } 313913498266Sopenharmony_ci#endif 314013498266Sopenharmony_ci case CURLOPT_QUICK_EXIT: 314113498266Sopenharmony_ci data->set.quick_exit = (0 != va_arg(param, long)) ? 1L:0L; 314213498266Sopenharmony_ci break; 314313498266Sopenharmony_ci default: 314413498266Sopenharmony_ci /* unknown tag and its companion, just ignore: */ 314513498266Sopenharmony_ci result = CURLE_UNKNOWN_OPTION; 314613498266Sopenharmony_ci break; 314713498266Sopenharmony_ci } 314813498266Sopenharmony_ci 314913498266Sopenharmony_ci return result; 315013498266Sopenharmony_ci} 315113498266Sopenharmony_ci 315213498266Sopenharmony_ci/* 315313498266Sopenharmony_ci * curl_easy_setopt() is the external interface for setting options on an 315413498266Sopenharmony_ci * easy handle. 315513498266Sopenharmony_ci * 315613498266Sopenharmony_ci * NOTE: This is one of few API functions that are allowed to be called from 315713498266Sopenharmony_ci * within a callback. 315813498266Sopenharmony_ci */ 315913498266Sopenharmony_ci 316013498266Sopenharmony_ci#undef curl_easy_setopt 316113498266Sopenharmony_ciCURLcode curl_easy_setopt(struct Curl_easy *data, CURLoption tag, ...) 316213498266Sopenharmony_ci{ 316313498266Sopenharmony_ci va_list arg; 316413498266Sopenharmony_ci CURLcode result; 316513498266Sopenharmony_ci 316613498266Sopenharmony_ci if(!data) 316713498266Sopenharmony_ci return CURLE_BAD_FUNCTION_ARGUMENT; 316813498266Sopenharmony_ci 316913498266Sopenharmony_ci va_start(arg, tag); 317013498266Sopenharmony_ci 317113498266Sopenharmony_ci result = Curl_vsetopt(data, tag, arg); 317213498266Sopenharmony_ci 317313498266Sopenharmony_ci va_end(arg); 317413498266Sopenharmony_ci#ifdef DEBUGBUILD 317513498266Sopenharmony_ci if(result == CURLE_BAD_FUNCTION_ARGUMENT) 317613498266Sopenharmony_ci infof(data, "setopt arg 0x%x returned CURLE_BAD_FUNCTION_ARGUMENT", tag); 317713498266Sopenharmony_ci#endif 317813498266Sopenharmony_ci return result; 317913498266Sopenharmony_ci} 3180