tool_getparam: split opt_filestring into two sep functions

One for file name arguments and one for "strings".

Closes #18546
This commit is contained in:
Daniel Stenberg 2025-09-14 14:29:13 +02:00
parent c1be5459d9
commit 6434783168
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2

View file

@ -2163,11 +2163,123 @@ static ParameterError opt_bool(struct OperationConfig *config,
return PARAM_OK;
}
/* opt_file handles file options */
static ParameterError opt_file(struct OperationConfig *config,
const struct LongShort *a,
const char *nextarg)
{
ParameterError err = PARAM_OK;
if((nextarg[0] == '-') && nextarg[1]) {
/* if the filename looks like a command line option */
warnf("The filename argument '%s' looks like a flag.", nextarg);
}
switch(a->cmd) {
case C_ABSTRACT_UNIX_SOCKET: /* --abstract-unix-socket */
config->abstract_unix_socket = TRUE;
err = getstr(&config->unix_socket_path, nextarg, DENY_BLANK);
break;
case C_CACERT: /* --cacert */
err = getstr(&config->cacert, nextarg, DENY_BLANK);
break;
case C_CAPATH: /* --capath */
err = getstr(&config->capath, nextarg, DENY_BLANK);
break;
case C_CERT: /* --cert */
GetFileAndPassword(nextarg, &config->cert, &config->key_passwd);
break;
case C_CONFIG: /* --config */
if(parseconfig(nextarg)) {
errorf("cannot read config from '%s'", nextarg);
err = PARAM_READ_ERROR;
}
break;
case C_CRLFILE: /* --crlfile */
err = getstr(&config->crlfile, nextarg, DENY_BLANK);
break;
case C_DUMP_HEADER: /* --dump-header */
err = getstr(&config->headerfile, nextarg, DENY_BLANK);
break;
case C_ETAG_SAVE: /* --etag-save */
if(config->num_urls > 1) {
errorf("The etag options only work on a single URL");
err = PARAM_BAD_USE;
}
else
err = getstr(&config->etag_save_file, nextarg, DENY_BLANK);
break;
case C_ETAG_COMPARE: /* --etag-compare */
if(config->num_urls > 1) {
errorf("The etag options only work on a single URL");
err = PARAM_BAD_USE;
}
else
err = getstr(&config->etag_compare_file, nextarg, DENY_BLANK);
break;
case C_KEY: /* --key */
err = getstr(&config->key, nextarg, DENY_BLANK);
break;
case C_NETRC_FILE: /* --netrc-file */
err = getstr(&config->netrc_file, nextarg, DENY_BLANK);
break;
case C_OUTPUT: /* --output */
err = parse_output(config, nextarg);
break;
case C_PROXY_CACERT: /* --proxy-cacert */
err = getstr(&config->proxy_cacert, nextarg, DENY_BLANK);
break;
case C_PROXY_CAPATH: /* --proxy-capath */
err = getstr(&config->proxy_capath, nextarg, DENY_BLANK);
break;
case C_PROXY_CERT: /* --proxy-cert */
GetFileAndPassword(nextarg, &config->proxy_cert,
&config->proxy_key_passwd);
break;
case C_PROXY_CRLFILE: /* --proxy-crlfile */
err = getstr(&config->proxy_crlfile, nextarg, DENY_BLANK);
break;
case C_PROXY_KEY: /* --proxy-key */
err = getstr(&config->proxy_key, nextarg, ALLOW_BLANK);
break;
case C_SSL_SESSIONS: /* --ssl-sessions */
if(feature_ssls_export)
err = getstr(&global->ssl_sessions, nextarg, DENY_BLANK);
else
err = PARAM_LIBCURL_DOESNT_SUPPORT;
break;
case C_STDERR: /* --stderr */
tool_set_stderr_file(nextarg);
break;
case C_TRACE: /* --trace */
err = getstr(&global->trace_dump, nextarg, DENY_BLANK);
if(!err) {
if(global->tracetype && (global->tracetype != TRACE_BIN))
warnf("--trace overrides an earlier trace/verbose option");
global->tracetype = TRACE_BIN;
}
break;
case C_TRACE_ASCII: /* --trace-ascii */
err = getstr(&global->trace_dump, nextarg, DENY_BLANK);
if(!err) {
if(global->tracetype && (global->tracetype != TRACE_ASCII))
warnf("--trace-ascii overrides an earlier trace/verbose option");
global->tracetype = TRACE_ASCII;
}
break;
case C_UNIX_SOCKET: /* --unix-socket */
config->abstract_unix_socket = FALSE;
err = getstr(&config->unix_socket_path, nextarg, DENY_BLANK);
break;
case C_UPLOAD_FILE: /* --upload-file */
err = parse_upload_file(config, nextarg);
break;
}
return err;
}
/* opt_filestring handles string and file options */
static ParameterError opt_filestring(struct OperationConfig *config,
const struct LongShort *a,
const char *nextarg)
/* opt_string handles string options */
static ParameterError opt_string(struct OperationConfig *config,
const struct LongShort *a,
const char *nextarg)
{
ParameterError err = PARAM_OK;
curl_off_t value;
@ -2227,22 +2339,6 @@ static ParameterError opt_filestring(struct OperationConfig *config,
/* IP addrs of DNS servers */
err = getstr(&config->dns_servers, nextarg, DENY_BLANK);
break;
case C_TRACE: /* --trace */
err = getstr(&global->trace_dump, nextarg, DENY_BLANK);
if(!err) {
if(global->tracetype && (global->tracetype != TRACE_BIN))
warnf("--trace overrides an earlier trace/verbose option");
global->tracetype = TRACE_BIN;
}
break;
case C_TRACE_ASCII: /* --trace-ascii */
err = getstr(&global->trace_dump, nextarg, DENY_BLANK);
if(!err) {
if(global->tracetype && (global->tracetype != TRACE_ASCII))
warnf("--trace-ascii overrides an earlier trace/verbose option");
global->tracetype = TRACE_ASCII;
}
break;
case C_LIMIT_RATE: /* --limit-rate */
err = GetSizeParameter(nextarg, "rate", &value);
if(!err) {
@ -2272,9 +2368,6 @@ static ParameterError opt_filestring(struct OperationConfig *config,
config->authtype |= CURLAUTH_AWS_SIGV4;
err = getstr(&config->aws_sigv4, nextarg, ALLOW_BLANK);
break;
case C_STDERR: /* --stderr */
tool_set_stderr_file(nextarg);
break;
case C_INTERFACE: /* --interface */
/* interface */
err = getstr(&config->iface, nextarg, DENY_BLANK);
@ -2406,10 +2499,6 @@ static ParameterError opt_filestring(struct OperationConfig *config,
case C_SASL_AUTHZID: /* --sasl-authzid */
err = getstr(&config->sasl_authzid, nextarg, DENY_BLANK);
break;
case C_UNIX_SOCKET: /* --unix-socket */
config->abstract_unix_socket = FALSE;
err = getstr(&config->unix_socket_path, nextarg, DENY_BLANK);
break;
case C_PROXY_SERVICE_NAME: /* --proxy-service-name */
err = getstr(&config->proxy_service_name, nextarg, DENY_BLANK);
break;
@ -2427,10 +2516,6 @@ static ParameterError opt_filestring(struct OperationConfig *config,
case C_CONNECT_TO: /* --connect-to */
err = add2list(&config->connect_to, nextarg);
break;
case C_ABSTRACT_UNIX_SOCKET: /* --abstract-unix-socket */
config->abstract_unix_socket = TRUE;
err = getstr(&config->unix_socket_path, nextarg, DENY_BLANK);
break;
case C_TLS_MAX: /* --tls-max */
err = str2tls_max(&config->ssl_version_max, nextarg);
if(!err && (config->ssl_version_max < config->ssl_version)) {
@ -2499,9 +2584,6 @@ static ParameterError opt_filestring(struct OperationConfig *config,
case C_URL_QUERY: /* --url-query */
err = url_query(nextarg, config);
break;
case C_DUMP_HEADER: /* --dump-header */
err = getstr(&config->headerfile, nextarg, DENY_BLANK);
break;
case C_REFERER: { /* --referer */
size_t len = strlen(nextarg);
/* does it end with ;auto ? */
@ -2520,18 +2602,9 @@ static ParameterError opt_filestring(struct OperationConfig *config,
tool_safefree(config->referer);
}
break;
case C_CERT: /* --cert */
GetFileAndPassword(nextarg, &config->cert, &config->key_passwd);
break;
case C_CACERT: /* --cacert */
err = getstr(&config->cacert, nextarg, DENY_BLANK);
break;
case C_CERT_TYPE: /* --cert-type */
err = getstr(&config->cert_type, nextarg, DENY_BLANK);
break;
case C_KEY: /* --key */
err = getstr(&config->key, nextarg, DENY_BLANK);
break;
case C_KEY_TYPE: /* --key-type */
err = getstr(&config->key_type, nextarg, DENY_BLANK);
break;
@ -2548,9 +2621,6 @@ static ParameterError opt_filestring(struct OperationConfig *config,
case C_ECH: /* --ech */
err = parse_ech(config, nextarg);
break;
case C_CAPATH: /* --capath */
err = getstr(&config->capath, nextarg, DENY_BLANK);
break;
case C_PUBKEY: /* --pubkey */
err = getstr(&config->pubkey, nextarg, DENY_BLANK);
break;
@ -2567,9 +2637,6 @@ static ParameterError opt_filestring(struct OperationConfig *config,
else
err = getstr(&config->hostpubsha256, nextarg, DENY_BLANK);
break;
case C_CRLFILE: /* --crlfile */
err = getstr(&config->crlfile, nextarg, DENY_BLANK);
break;
case C_TLSUSER: /* --tlsuser */
if(!feature_tls_srp)
err = PARAM_LIBCURL_DOESNT_SUPPORT;
@ -2597,12 +2664,6 @@ static ParameterError opt_filestring(struct OperationConfig *config,
case C_PROXY_PINNEDPUBKEY: /* --proxy-pinnedpubkey */
err = getstr(&config->proxy_pinnedpubkey, nextarg, DENY_BLANK);
break;
case C_SSL_SESSIONS: /* --ssl-sessions */
if(feature_ssls_export)
err = getstr(&global->ssl_sessions, nextarg, DENY_BLANK);
else
err = PARAM_LIBCURL_DOESNT_SUPPORT;
break;
case C_PROXY_TLSUSER: /* --proxy-tlsuser */
if(!feature_tls_srp)
err = PARAM_LIBCURL_DOESNT_SUPPORT;
@ -2625,16 +2686,9 @@ static ParameterError opt_filestring(struct OperationConfig *config,
err = PARAM_LIBCURL_DOESNT_SUPPORT; /* only support TLS-SRP */
}
break;
case C_PROXY_CERT: /* --proxy-cert */
GetFileAndPassword(nextarg, &config->proxy_cert,
&config->proxy_key_passwd);
break;
case C_PROXY_CERT_TYPE: /* --proxy-cert-type */
err = getstr(&config->proxy_cert_type, nextarg, DENY_BLANK);
break;
case C_PROXY_KEY: /* --proxy-key */
err = getstr(&config->proxy_key, nextarg, ALLOW_BLANK);
break;
case C_PROXY_KEY_TYPE: /* --proxy-key-type */
err = getstr(&config->proxy_key_type, nextarg, DENY_BLANK);
break;
@ -2644,34 +2698,9 @@ static ParameterError opt_filestring(struct OperationConfig *config,
case C_PROXY_CIPHERS: /* --proxy-ciphers */
err = getstr(&config->proxy_cipher_list, nextarg, DENY_BLANK);
break;
case C_PROXY_CRLFILE: /* --proxy-crlfile */
err = getstr(&config->proxy_crlfile, nextarg, DENY_BLANK);
break;
case C_LOGIN_OPTIONS: /* --login-options */
err = getstr(&config->login_options, nextarg, ALLOW_BLANK);
break;
case C_PROXY_CACERT: /* --proxy-cacert */
err = getstr(&config->proxy_cacert, nextarg, DENY_BLANK);
break;
case C_PROXY_CAPATH: /* --proxy-capath */
err = getstr(&config->proxy_capath, nextarg, DENY_BLANK);
break;
case C_ETAG_SAVE: /* --etag-save */
if(config->num_urls > 1) {
errorf("The etag options only work on a single URL");
err = PARAM_BAD_USE;
}
else
err = getstr(&config->etag_save_file, nextarg, DENY_BLANK);
break;
case C_ETAG_COMPARE: /* --etag-compare */
if(config->num_urls > 1) {
errorf("The etag options only work on a single URL");
err = PARAM_BAD_USE;
}
else
err = getstr(&config->etag_compare_file, nextarg, DENY_BLANK);
break;
case C_CURVES: /* --curves */
err = getstr(&config->ssl_ec_curves, nextarg, DENY_BLANK);
break;
@ -2695,25 +2724,13 @@ static ParameterError opt_filestring(struct OperationConfig *config,
case C_PROXY_HEADER: /* --proxy-header */
err = parse_header(config, (cmdline_t)a->cmd, nextarg);
break;
case C_CONFIG: /* --config */
if(parseconfig(nextarg)) {
errorf("cannot read config from '%s'", nextarg);
err = PARAM_READ_ERROR;
}
break;
case C_MAX_TIME: /* --max-time */
/* specified max time */
err = secs2ms(&config->timeout_ms, nextarg);
break;
case C_NETRC_FILE: /* --netrc-file */
err = getstr(&config->netrc_file, nextarg, DENY_BLANK);
break;
case C_OUTPUT_DIR: /* --output-dir */
err = getstr(&config->output_dir, nextarg, DENY_BLANK);
break;
case C_OUTPUT: /* --output */
err = parse_output(config, nextarg);
break;
case C_FTP_PORT: /* --ftp-port */
/* This makes the FTP sessions use PORT instead of PASV */
/* use <eth0> or <192.168.10.10> style addresses. Anything except
@ -2736,9 +2753,6 @@ static ParameterError opt_filestring(struct OperationConfig *config,
/* Telnet options */
err = add2list(&config->telnet_options, nextarg);
break;
case C_UPLOAD_FILE: /* --upload-file */
err = parse_upload_file(config, nextarg);
break;
case C_USER: /* --user */
/* user:password */
err = getstr(&config->userpwd, nextarg, ALLOW_BLANK);
@ -2947,18 +2961,14 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
break;
}
if((ARGTYPE(a->desc) == ARG_FILE) &&
(nextarg[0] == '-') && nextarg[1]) {
/* if the filename looks like a command line option */
warnf("The filename argument '%s' looks like a flag.",
nextarg);
}
else if(has_leading_unicode((const unsigned char *)nextarg)) {
if(has_leading_unicode((const unsigned char *)nextarg)) {
warnf("The argument '%s' starts with a Unicode character. "
"Maybe ASCII was intended?", nextarg);
}
/* ARG_FILE | ARG_STRG */
err = opt_filestring(config, a, nextarg);
if(ARGTYPE(a->desc) == ARG_FILE)
err = opt_file(config, a, nextarg);
else /* if(ARGTYPE(a->desc) == ARG_STRG) */
err = opt_string(config, a, nextarg);
if(a->desc & ARG_CLEAR)
cleanarg(CURL_UNCONST(nextarg));
}