]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
tool_getparam: split opt_filestring into two sep functions
authorDaniel Stenberg <daniel@haxx.se>
Sun, 14 Sep 2025 12:29:13 +0000 (14:29 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Sun, 14 Sep 2025 21:41:21 +0000 (23:41 +0200)
One for file name arguments and one for "strings".

Closes #18546

src/tool_getparam.c

index 6be57dbd5c310a6c113af49c7cecbf6da07f06cd..f2ad6daf2ef959e206953f6b5de5016977967e55 100644 (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));
     }