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