1*6236dae4SAndroid Build Coastguard Worker /***************************************************************************
2*6236dae4SAndroid Build Coastguard Worker * _ _ ____ _
3*6236dae4SAndroid Build Coastguard Worker * Project ___| | | | _ \| |
4*6236dae4SAndroid Build Coastguard Worker * / __| | | | |_) | |
5*6236dae4SAndroid Build Coastguard Worker * | (__| |_| | _ <| |___
6*6236dae4SAndroid Build Coastguard Worker * \___|\___/|_| \_\_____|
7*6236dae4SAndroid Build Coastguard Worker *
8*6236dae4SAndroid Build Coastguard Worker * Copyright (C) Daniel Stenberg, <[email protected]>, et al.
9*6236dae4SAndroid Build Coastguard Worker *
10*6236dae4SAndroid Build Coastguard Worker * This software is licensed as described in the file COPYING, which
11*6236dae4SAndroid Build Coastguard Worker * you should have received as part of this distribution. The terms
12*6236dae4SAndroid Build Coastguard Worker * are also available at https://curl.se/docs/copyright.html.
13*6236dae4SAndroid Build Coastguard Worker *
14*6236dae4SAndroid Build Coastguard Worker * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15*6236dae4SAndroid Build Coastguard Worker * copies of the Software, and permit persons to whom the Software is
16*6236dae4SAndroid Build Coastguard Worker * furnished to do so, under the terms of the COPYING file.
17*6236dae4SAndroid Build Coastguard Worker *
18*6236dae4SAndroid Build Coastguard Worker * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19*6236dae4SAndroid Build Coastguard Worker * KIND, either express or implied.
20*6236dae4SAndroid Build Coastguard Worker *
21*6236dae4SAndroid Build Coastguard Worker * SPDX-License-Identifier: curl
22*6236dae4SAndroid Build Coastguard Worker *
23*6236dae4SAndroid Build Coastguard Worker ***************************************************************************/
24*6236dae4SAndroid Build Coastguard Worker #include "tool_setup.h"
25*6236dae4SAndroid Build Coastguard Worker
26*6236dae4SAndroid Build Coastguard Worker #include "strcase.h"
27*6236dae4SAndroid Build Coastguard Worker
28*6236dae4SAndroid Build Coastguard Worker #include "curlx.h"
29*6236dae4SAndroid Build Coastguard Worker
30*6236dae4SAndroid Build Coastguard Worker #include "tool_binmode.h"
31*6236dae4SAndroid Build Coastguard Worker #include "tool_cfgable.h"
32*6236dae4SAndroid Build Coastguard Worker #include "tool_cb_prg.h"
33*6236dae4SAndroid Build Coastguard Worker #include "tool_filetime.h"
34*6236dae4SAndroid Build Coastguard Worker #include "tool_formparse.h"
35*6236dae4SAndroid Build Coastguard Worker #include "tool_getparam.h"
36*6236dae4SAndroid Build Coastguard Worker #include "tool_helpers.h"
37*6236dae4SAndroid Build Coastguard Worker #include "tool_libinfo.h"
38*6236dae4SAndroid Build Coastguard Worker #include "tool_msgs.h"
39*6236dae4SAndroid Build Coastguard Worker #include "tool_paramhlp.h"
40*6236dae4SAndroid Build Coastguard Worker #include "tool_parsecfg.h"
41*6236dae4SAndroid Build Coastguard Worker #include "tool_main.h"
42*6236dae4SAndroid Build Coastguard Worker #include "dynbuf.h"
43*6236dae4SAndroid Build Coastguard Worker #include "tool_stderr.h"
44*6236dae4SAndroid Build Coastguard Worker #include "var.h"
45*6236dae4SAndroid Build Coastguard Worker
46*6236dae4SAndroid Build Coastguard Worker #include "memdebug.h" /* keep this as LAST include */
47*6236dae4SAndroid Build Coastguard Worker
48*6236dae4SAndroid Build Coastguard Worker #ifdef MSDOS
49*6236dae4SAndroid Build Coastguard Worker # define USE_WATT32
50*6236dae4SAndroid Build Coastguard Worker #endif
51*6236dae4SAndroid Build Coastguard Worker
52*6236dae4SAndroid Build Coastguard Worker #define ALLOW_BLANK TRUE
53*6236dae4SAndroid Build Coastguard Worker #define DENY_BLANK FALSE
54*6236dae4SAndroid Build Coastguard Worker
getstr(char ** str,const char * val,bool allowblank)55*6236dae4SAndroid Build Coastguard Worker static ParameterError getstr(char **str, const char *val, bool allowblank)
56*6236dae4SAndroid Build Coastguard Worker {
57*6236dae4SAndroid Build Coastguard Worker if(*str) {
58*6236dae4SAndroid Build Coastguard Worker free(*str);
59*6236dae4SAndroid Build Coastguard Worker *str = NULL;
60*6236dae4SAndroid Build Coastguard Worker }
61*6236dae4SAndroid Build Coastguard Worker if(val) {
62*6236dae4SAndroid Build Coastguard Worker if(!allowblank && !val[0])
63*6236dae4SAndroid Build Coastguard Worker return PARAM_BLANK_STRING;
64*6236dae4SAndroid Build Coastguard Worker
65*6236dae4SAndroid Build Coastguard Worker *str = strdup(val);
66*6236dae4SAndroid Build Coastguard Worker if(!*str)
67*6236dae4SAndroid Build Coastguard Worker return PARAM_NO_MEM;
68*6236dae4SAndroid Build Coastguard Worker }
69*6236dae4SAndroid Build Coastguard Worker return PARAM_OK;
70*6236dae4SAndroid Build Coastguard Worker }
71*6236dae4SAndroid Build Coastguard Worker
72*6236dae4SAndroid Build Coastguard Worker /* this array MUST be alphasorted based on the 'lname' */
73*6236dae4SAndroid Build Coastguard Worker static const struct LongShort aliases[]= {
74*6236dae4SAndroid Build Coastguard Worker {"abstract-unix-socket", ARG_FILE, ' ', C_ABSTRACT_UNIX_SOCKET},
75*6236dae4SAndroid Build Coastguard Worker {"alpn", ARG_BOOL|ARG_NO, ' ', C_ALPN},
76*6236dae4SAndroid Build Coastguard Worker {"alt-svc", ARG_STRG, ' ', C_ALT_SVC},
77*6236dae4SAndroid Build Coastguard Worker {"anyauth", ARG_BOOL, ' ', C_ANYAUTH},
78*6236dae4SAndroid Build Coastguard Worker {"append", ARG_BOOL, 'a', C_APPEND},
79*6236dae4SAndroid Build Coastguard Worker {"aws-sigv4", ARG_STRG, ' ', C_AWS_SIGV4},
80*6236dae4SAndroid Build Coastguard Worker {"basic", ARG_BOOL, ' ', C_BASIC},
81*6236dae4SAndroid Build Coastguard Worker {"buffer", ARG_BOOL|ARG_NO, 'N', C_BUFFER},
82*6236dae4SAndroid Build Coastguard Worker {"ca-native", ARG_BOOL, ' ', C_CA_NATIVE},
83*6236dae4SAndroid Build Coastguard Worker {"cacert", ARG_FILE, ' ', C_CACERT},
84*6236dae4SAndroid Build Coastguard Worker {"capath", ARG_FILE, ' ', C_CAPATH},
85*6236dae4SAndroid Build Coastguard Worker {"cert", ARG_FILE, 'E', C_CERT},
86*6236dae4SAndroid Build Coastguard Worker {"cert-status", ARG_BOOL, ' ', C_CERT_STATUS},
87*6236dae4SAndroid Build Coastguard Worker {"cert-type", ARG_STRG, ' ', C_CERT_TYPE},
88*6236dae4SAndroid Build Coastguard Worker {"ciphers", ARG_STRG, ' ', C_CIPHERS},
89*6236dae4SAndroid Build Coastguard Worker {"clobber", ARG_BOOL|ARG_NO, ' ', C_CLOBBER},
90*6236dae4SAndroid Build Coastguard Worker {"compressed", ARG_BOOL, ' ', C_COMPRESSED},
91*6236dae4SAndroid Build Coastguard Worker {"compressed-ssh", ARG_BOOL, ' ', C_COMPRESSED_SSH},
92*6236dae4SAndroid Build Coastguard Worker {"config", ARG_FILE, 'K', C_CONFIG},
93*6236dae4SAndroid Build Coastguard Worker {"connect-timeout", ARG_STRG, ' ', C_CONNECT_TIMEOUT},
94*6236dae4SAndroid Build Coastguard Worker {"connect-to", ARG_STRG, ' ', C_CONNECT_TO},
95*6236dae4SAndroid Build Coastguard Worker {"continue-at", ARG_STRG, 'C', C_CONTINUE_AT},
96*6236dae4SAndroid Build Coastguard Worker {"cookie", ARG_STRG, 'b', C_COOKIE},
97*6236dae4SAndroid Build Coastguard Worker {"cookie-jar", ARG_STRG, 'c', C_COOKIE_JAR},
98*6236dae4SAndroid Build Coastguard Worker {"create-dirs", ARG_BOOL, ' ', C_CREATE_DIRS},
99*6236dae4SAndroid Build Coastguard Worker {"create-file-mode", ARG_STRG, ' ', C_CREATE_FILE_MODE},
100*6236dae4SAndroid Build Coastguard Worker {"crlf", ARG_BOOL, ' ', C_CRLF},
101*6236dae4SAndroid Build Coastguard Worker {"crlfile", ARG_FILE, ' ', C_CRLFILE},
102*6236dae4SAndroid Build Coastguard Worker {"curves", ARG_STRG, ' ', C_CURVES},
103*6236dae4SAndroid Build Coastguard Worker {"data", ARG_STRG, 'd', C_DATA},
104*6236dae4SAndroid Build Coastguard Worker {"data-ascii", ARG_STRG, ' ', C_DATA_ASCII},
105*6236dae4SAndroid Build Coastguard Worker {"data-binary", ARG_STRG, ' ', C_DATA_BINARY},
106*6236dae4SAndroid Build Coastguard Worker {"data-raw", ARG_STRG, ' ', C_DATA_RAW},
107*6236dae4SAndroid Build Coastguard Worker {"data-urlencode", ARG_STRG, ' ', C_DATA_URLENCODE},
108*6236dae4SAndroid Build Coastguard Worker {"delegation", ARG_STRG, ' ', C_DELEGATION},
109*6236dae4SAndroid Build Coastguard Worker {"digest", ARG_BOOL, ' ', C_DIGEST},
110*6236dae4SAndroid Build Coastguard Worker {"disable", ARG_BOOL, 'q', C_DISABLE},
111*6236dae4SAndroid Build Coastguard Worker {"disable-eprt", ARG_BOOL, ' ', C_DISABLE_EPRT},
112*6236dae4SAndroid Build Coastguard Worker {"disable-epsv", ARG_BOOL, ' ', C_DISABLE_EPSV},
113*6236dae4SAndroid Build Coastguard Worker {"disallow-username-in-url", ARG_BOOL, ' ', C_DISALLOW_USERNAME_IN_URL},
114*6236dae4SAndroid Build Coastguard Worker {"dns-interface", ARG_STRG, ' ', C_DNS_INTERFACE},
115*6236dae4SAndroid Build Coastguard Worker {"dns-ipv4-addr", ARG_STRG, ' ', C_DNS_IPV4_ADDR},
116*6236dae4SAndroid Build Coastguard Worker {"dns-ipv6-addr", ARG_STRG, ' ', C_DNS_IPV6_ADDR},
117*6236dae4SAndroid Build Coastguard Worker {"dns-servers", ARG_STRG, ' ', C_DNS_SERVERS},
118*6236dae4SAndroid Build Coastguard Worker {"doh-cert-status", ARG_BOOL, ' ', C_DOH_CERT_STATUS},
119*6236dae4SAndroid Build Coastguard Worker {"doh-insecure", ARG_BOOL, ' ', C_DOH_INSECURE},
120*6236dae4SAndroid Build Coastguard Worker {"doh-url" , ARG_STRG, ' ', C_DOH_URL},
121*6236dae4SAndroid Build Coastguard Worker {"dump-ca-embed", ARG_NONE, ' ', C_DUMP_CA_EMBED},
122*6236dae4SAndroid Build Coastguard Worker {"dump-header", ARG_FILE, 'D', C_DUMP_HEADER},
123*6236dae4SAndroid Build Coastguard Worker {"ech", ARG_STRG, ' ', C_ECH},
124*6236dae4SAndroid Build Coastguard Worker {"egd-file", ARG_STRG, ' ', C_EGD_FILE},
125*6236dae4SAndroid Build Coastguard Worker {"engine", ARG_STRG, ' ', C_ENGINE},
126*6236dae4SAndroid Build Coastguard Worker {"eprt", ARG_BOOL, ' ', C_EPRT},
127*6236dae4SAndroid Build Coastguard Worker {"epsv", ARG_BOOL, ' ', C_EPSV},
128*6236dae4SAndroid Build Coastguard Worker {"etag-compare", ARG_FILE, ' ', C_ETAG_COMPARE},
129*6236dae4SAndroid Build Coastguard Worker {"etag-save", ARG_FILE, ' ', C_ETAG_SAVE},
130*6236dae4SAndroid Build Coastguard Worker {"expect100-timeout", ARG_STRG, ' ', C_EXPECT100_TIMEOUT},
131*6236dae4SAndroid Build Coastguard Worker {"fail", ARG_BOOL, 'f', C_FAIL},
132*6236dae4SAndroid Build Coastguard Worker {"fail-early", ARG_BOOL, ' ', C_FAIL_EARLY},
133*6236dae4SAndroid Build Coastguard Worker {"fail-with-body", ARG_BOOL, ' ', C_FAIL_WITH_BODY},
134*6236dae4SAndroid Build Coastguard Worker {"false-start", ARG_BOOL, ' ', C_FALSE_START},
135*6236dae4SAndroid Build Coastguard Worker {"form", ARG_STRG, 'F', C_FORM},
136*6236dae4SAndroid Build Coastguard Worker {"form-escape", ARG_BOOL, ' ', C_FORM_ESCAPE},
137*6236dae4SAndroid Build Coastguard Worker {"form-string", ARG_STRG, ' ', C_FORM_STRING},
138*6236dae4SAndroid Build Coastguard Worker {"ftp-account", ARG_STRG, ' ', C_FTP_ACCOUNT},
139*6236dae4SAndroid Build Coastguard Worker {"ftp-alternative-to-user", ARG_STRG, ' ', C_FTP_ALTERNATIVE_TO_USER},
140*6236dae4SAndroid Build Coastguard Worker {"ftp-create-dirs", ARG_BOOL, ' ', C_FTP_CREATE_DIRS},
141*6236dae4SAndroid Build Coastguard Worker {"ftp-method", ARG_STRG, ' ', C_FTP_METHOD},
142*6236dae4SAndroid Build Coastguard Worker {"ftp-pasv", ARG_BOOL, ' ', C_FTP_PASV},
143*6236dae4SAndroid Build Coastguard Worker {"ftp-port", ARG_STRG, 'P', C_FTP_PORT},
144*6236dae4SAndroid Build Coastguard Worker {"ftp-pret", ARG_BOOL, ' ', C_FTP_PRET},
145*6236dae4SAndroid Build Coastguard Worker {"ftp-skip-pasv-ip", ARG_BOOL, ' ', C_FTP_SKIP_PASV_IP},
146*6236dae4SAndroid Build Coastguard Worker {"ftp-ssl", ARG_BOOL, ' ', C_FTP_SSL},
147*6236dae4SAndroid Build Coastguard Worker {"ftp-ssl-ccc", ARG_BOOL, ' ', C_FTP_SSL_CCC},
148*6236dae4SAndroid Build Coastguard Worker {"ftp-ssl-ccc-mode", ARG_STRG, ' ', C_FTP_SSL_CCC_MODE},
149*6236dae4SAndroid Build Coastguard Worker {"ftp-ssl-control", ARG_BOOL, ' ', C_FTP_SSL_CONTROL},
150*6236dae4SAndroid Build Coastguard Worker {"ftp-ssl-reqd", ARG_BOOL, ' ', C_FTP_SSL_REQD},
151*6236dae4SAndroid Build Coastguard Worker {"get", ARG_BOOL, 'G', C_GET},
152*6236dae4SAndroid Build Coastguard Worker {"globoff", ARG_BOOL, 'g', C_GLOBOFF},
153*6236dae4SAndroid Build Coastguard Worker {"happy-eyeballs-timeout-ms", ARG_STRG, ' ', C_HAPPY_EYEBALLS_TIMEOUT_MS},
154*6236dae4SAndroid Build Coastguard Worker {"haproxy-clientip", ARG_STRG, ' ', C_HAPROXY_CLIENTIP},
155*6236dae4SAndroid Build Coastguard Worker {"haproxy-protocol", ARG_BOOL, ' ', C_HAPROXY_PROTOCOL},
156*6236dae4SAndroid Build Coastguard Worker {"head", ARG_BOOL, 'I', C_HEAD},
157*6236dae4SAndroid Build Coastguard Worker {"header", ARG_STRG, 'H', C_HEADER},
158*6236dae4SAndroid Build Coastguard Worker {"help", ARG_BOOL, 'h', C_HELP},
159*6236dae4SAndroid Build Coastguard Worker {"hostpubmd5", ARG_STRG, ' ', C_HOSTPUBMD5},
160*6236dae4SAndroid Build Coastguard Worker {"hostpubsha256", ARG_STRG, ' ', C_HOSTPUBSHA256},
161*6236dae4SAndroid Build Coastguard Worker {"hsts", ARG_STRG, ' ', C_HSTS},
162*6236dae4SAndroid Build Coastguard Worker {"http0.9", ARG_BOOL, ' ', C_HTTP0_9},
163*6236dae4SAndroid Build Coastguard Worker {"http1.0", ARG_NONE, '0', C_HTTP1_0},
164*6236dae4SAndroid Build Coastguard Worker {"http1.1", ARG_NONE, ' ', C_HTTP1_1},
165*6236dae4SAndroid Build Coastguard Worker {"http2", ARG_NONE, ' ', C_HTTP2},
166*6236dae4SAndroid Build Coastguard Worker {"http2-prior-knowledge", ARG_NONE, ' ', C_HTTP2_PRIOR_KNOWLEDGE},
167*6236dae4SAndroid Build Coastguard Worker {"http3", ARG_NONE, ' ', C_HTTP3},
168*6236dae4SAndroid Build Coastguard Worker {"http3-only", ARG_NONE, ' ', C_HTTP3_ONLY},
169*6236dae4SAndroid Build Coastguard Worker {"ignore-content-length", ARG_BOOL, ' ', C_IGNORE_CONTENT_LENGTH},
170*6236dae4SAndroid Build Coastguard Worker {"include", ARG_BOOL, ' ', C_INCLUDE},
171*6236dae4SAndroid Build Coastguard Worker {"insecure", ARG_BOOL, 'k', C_INSECURE},
172*6236dae4SAndroid Build Coastguard Worker {"interface", ARG_STRG, ' ', C_INTERFACE},
173*6236dae4SAndroid Build Coastguard Worker {"ip-tos", ARG_STRG, ' ', C_IP_TOS},
174*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_IPFS
175*6236dae4SAndroid Build Coastguard Worker {"ipfs-gateway", ARG_STRG, ' ', C_IPFS_GATEWAY},
176*6236dae4SAndroid Build Coastguard Worker #endif /* !CURL_DISABLE_IPFS */
177*6236dae4SAndroid Build Coastguard Worker {"ipv4", ARG_NONE, '4', C_IPV4},
178*6236dae4SAndroid Build Coastguard Worker {"ipv6", ARG_NONE, '6', C_IPV6},
179*6236dae4SAndroid Build Coastguard Worker {"json", ARG_STRG, ' ', C_JSON},
180*6236dae4SAndroid Build Coastguard Worker {"junk-session-cookies", ARG_BOOL, 'j', C_JUNK_SESSION_COOKIES},
181*6236dae4SAndroid Build Coastguard Worker {"keepalive", ARG_BOOL|ARG_NO, ' ', C_KEEPALIVE},
182*6236dae4SAndroid Build Coastguard Worker {"keepalive-cnt", ARG_STRG, ' ', C_KEEPALIVE_CNT},
183*6236dae4SAndroid Build Coastguard Worker {"keepalive-time", ARG_STRG, ' ', C_KEEPALIVE_TIME},
184*6236dae4SAndroid Build Coastguard Worker {"key", ARG_FILE, ' ', C_KEY},
185*6236dae4SAndroid Build Coastguard Worker {"key-type", ARG_STRG, ' ', C_KEY_TYPE},
186*6236dae4SAndroid Build Coastguard Worker {"krb", ARG_STRG, ' ', C_KRB},
187*6236dae4SAndroid Build Coastguard Worker {"krb4", ARG_STRG, ' ', C_KRB4},
188*6236dae4SAndroid Build Coastguard Worker {"libcurl", ARG_STRG, ' ', C_LIBCURL},
189*6236dae4SAndroid Build Coastguard Worker {"limit-rate", ARG_STRG, ' ', C_LIMIT_RATE},
190*6236dae4SAndroid Build Coastguard Worker {"list-only", ARG_BOOL, 'l', C_LIST_ONLY},
191*6236dae4SAndroid Build Coastguard Worker {"local-port", ARG_STRG, ' ', C_LOCAL_PORT},
192*6236dae4SAndroid Build Coastguard Worker {"location", ARG_BOOL, 'L', C_LOCATION},
193*6236dae4SAndroid Build Coastguard Worker {"location-trusted", ARG_BOOL, ' ', C_LOCATION_TRUSTED},
194*6236dae4SAndroid Build Coastguard Worker {"login-options", ARG_STRG, ' ', C_LOGIN_OPTIONS},
195*6236dae4SAndroid Build Coastguard Worker {"mail-auth", ARG_STRG, ' ', C_MAIL_AUTH},
196*6236dae4SAndroid Build Coastguard Worker {"mail-from", ARG_STRG, ' ', C_MAIL_FROM},
197*6236dae4SAndroid Build Coastguard Worker {"mail-rcpt", ARG_STRG, ' ', C_MAIL_RCPT},
198*6236dae4SAndroid Build Coastguard Worker {"mail-rcpt-allowfails", ARG_BOOL, ' ', C_MAIL_RCPT_ALLOWFAILS},
199*6236dae4SAndroid Build Coastguard Worker {"manual", ARG_BOOL, 'M', C_MANUAL},
200*6236dae4SAndroid Build Coastguard Worker {"max-filesize", ARG_STRG, ' ', C_MAX_FILESIZE},
201*6236dae4SAndroid Build Coastguard Worker {"max-redirs", ARG_STRG, ' ', C_MAX_REDIRS},
202*6236dae4SAndroid Build Coastguard Worker {"max-time", ARG_STRG, 'm', C_MAX_TIME},
203*6236dae4SAndroid Build Coastguard Worker {"metalink", ARG_BOOL, ' ', C_METALINK},
204*6236dae4SAndroid Build Coastguard Worker {"mptcp", ARG_BOOL, ' ', C_MPTCP},
205*6236dae4SAndroid Build Coastguard Worker {"negotiate", ARG_BOOL, ' ', C_NEGOTIATE},
206*6236dae4SAndroid Build Coastguard Worker {"netrc", ARG_BOOL, 'n', C_NETRC},
207*6236dae4SAndroid Build Coastguard Worker {"netrc-file", ARG_FILE, ' ', C_NETRC_FILE},
208*6236dae4SAndroid Build Coastguard Worker {"netrc-optional", ARG_BOOL, ' ', C_NETRC_OPTIONAL},
209*6236dae4SAndroid Build Coastguard Worker {"next", ARG_NONE, ':', C_NEXT},
210*6236dae4SAndroid Build Coastguard Worker {"noproxy", ARG_STRG, ' ', C_NOPROXY},
211*6236dae4SAndroid Build Coastguard Worker {"npn", ARG_BOOL|ARG_NO, ' ', C_NPN},
212*6236dae4SAndroid Build Coastguard Worker {"ntlm", ARG_BOOL, ' ', C_NTLM},
213*6236dae4SAndroid Build Coastguard Worker {"ntlm-wb", ARG_BOOL, ' ', C_NTLM_WB},
214*6236dae4SAndroid Build Coastguard Worker {"oauth2-bearer", ARG_STRG, ' ', C_OAUTH2_BEARER},
215*6236dae4SAndroid Build Coastguard Worker {"output", ARG_FILE, 'o', C_OUTPUT},
216*6236dae4SAndroid Build Coastguard Worker {"output-dir", ARG_STRG, ' ', C_OUTPUT_DIR},
217*6236dae4SAndroid Build Coastguard Worker {"parallel", ARG_BOOL, 'Z', C_PARALLEL},
218*6236dae4SAndroid Build Coastguard Worker {"parallel-immediate", ARG_BOOL, ' ', C_PARALLEL_IMMEDIATE},
219*6236dae4SAndroid Build Coastguard Worker {"parallel-max", ARG_STRG, ' ', C_PARALLEL_MAX},
220*6236dae4SAndroid Build Coastguard Worker {"pass", ARG_STRG, ' ', C_PASS},
221*6236dae4SAndroid Build Coastguard Worker {"path-as-is", ARG_BOOL, ' ', C_PATH_AS_IS},
222*6236dae4SAndroid Build Coastguard Worker {"pinnedpubkey", ARG_STRG, ' ', C_PINNEDPUBKEY},
223*6236dae4SAndroid Build Coastguard Worker {"post301", ARG_BOOL, ' ', C_POST301},
224*6236dae4SAndroid Build Coastguard Worker {"post302", ARG_BOOL, ' ', C_POST302},
225*6236dae4SAndroid Build Coastguard Worker {"post303", ARG_BOOL, ' ', C_POST303},
226*6236dae4SAndroid Build Coastguard Worker {"preproxy", ARG_STRG, ' ', C_PREPROXY},
227*6236dae4SAndroid Build Coastguard Worker {"progress-bar", ARG_BOOL, '#', C_PROGRESS_BAR},
228*6236dae4SAndroid Build Coastguard Worker {"progress-meter", ARG_BOOL|ARG_NO, ' ', C_PROGRESS_METER},
229*6236dae4SAndroid Build Coastguard Worker {"proto", ARG_STRG, ' ', C_PROTO},
230*6236dae4SAndroid Build Coastguard Worker {"proto-default", ARG_STRG, ' ', C_PROTO_DEFAULT},
231*6236dae4SAndroid Build Coastguard Worker {"proto-redir", ARG_STRG, ' ', C_PROTO_REDIR},
232*6236dae4SAndroid Build Coastguard Worker {"proxy", ARG_STRG, 'x', C_PROXY},
233*6236dae4SAndroid Build Coastguard Worker {"proxy-anyauth", ARG_BOOL, ' ', C_PROXY_ANYAUTH},
234*6236dae4SAndroid Build Coastguard Worker {"proxy-basic", ARG_BOOL, ' ', C_PROXY_BASIC},
235*6236dae4SAndroid Build Coastguard Worker {"proxy-ca-native", ARG_BOOL, ' ', C_PROXY_CA_NATIVE},
236*6236dae4SAndroid Build Coastguard Worker {"proxy-cacert", ARG_FILE, ' ', C_PROXY_CACERT},
237*6236dae4SAndroid Build Coastguard Worker {"proxy-capath", ARG_FILE, ' ', C_PROXY_CAPATH},
238*6236dae4SAndroid Build Coastguard Worker {"proxy-cert", ARG_FILE, ' ', C_PROXY_CERT},
239*6236dae4SAndroid Build Coastguard Worker {"proxy-cert-type", ARG_STRG, ' ', C_PROXY_CERT_TYPE},
240*6236dae4SAndroid Build Coastguard Worker {"proxy-ciphers", ARG_STRG, ' ', C_PROXY_CIPHERS},
241*6236dae4SAndroid Build Coastguard Worker {"proxy-crlfile", ARG_FILE, ' ', C_PROXY_CRLFILE},
242*6236dae4SAndroid Build Coastguard Worker {"proxy-digest", ARG_BOOL, ' ', C_PROXY_DIGEST},
243*6236dae4SAndroid Build Coastguard Worker {"proxy-header", ARG_STRG, ' ', C_PROXY_HEADER},
244*6236dae4SAndroid Build Coastguard Worker {"proxy-http2", ARG_BOOL, ' ', C_PROXY_HTTP2},
245*6236dae4SAndroid Build Coastguard Worker {"proxy-insecure", ARG_BOOL, ' ', C_PROXY_INSECURE},
246*6236dae4SAndroid Build Coastguard Worker {"proxy-key", ARG_FILE, ' ', C_PROXY_KEY},
247*6236dae4SAndroid Build Coastguard Worker {"proxy-key-type", ARG_STRG, ' ', C_PROXY_KEY_TYPE},
248*6236dae4SAndroid Build Coastguard Worker {"proxy-negotiate", ARG_BOOL, ' ', C_PROXY_NEGOTIATE},
249*6236dae4SAndroid Build Coastguard Worker {"proxy-ntlm", ARG_BOOL, ' ', C_PROXY_NTLM},
250*6236dae4SAndroid Build Coastguard Worker {"proxy-pass", ARG_STRG, ' ', C_PROXY_PASS},
251*6236dae4SAndroid Build Coastguard Worker {"proxy-pinnedpubkey", ARG_STRG, ' ', C_PROXY_PINNEDPUBKEY},
252*6236dae4SAndroid Build Coastguard Worker {"proxy-service-name", ARG_STRG, ' ', C_PROXY_SERVICE_NAME},
253*6236dae4SAndroid Build Coastguard Worker {"proxy-ssl-allow-beast", ARG_BOOL, ' ', C_PROXY_SSL_ALLOW_BEAST},
254*6236dae4SAndroid Build Coastguard Worker {"proxy-ssl-auto-client-cert", ARG_BOOL, ' ', C_PROXY_SSL_AUTO_CLIENT_CERT},
255*6236dae4SAndroid Build Coastguard Worker {"proxy-tls13-ciphers", ARG_STRG, ' ', C_PROXY_TLS13_CIPHERS},
256*6236dae4SAndroid Build Coastguard Worker {"proxy-tlsauthtype", ARG_STRG, ' ', C_PROXY_TLSAUTHTYPE},
257*6236dae4SAndroid Build Coastguard Worker {"proxy-tlspassword", ARG_STRG, ' ', C_PROXY_TLSPASSWORD},
258*6236dae4SAndroid Build Coastguard Worker {"proxy-tlsuser", ARG_STRG, ' ', C_PROXY_TLSUSER},
259*6236dae4SAndroid Build Coastguard Worker {"proxy-tlsv1", ARG_NONE, ' ', C_PROXY_TLSV1},
260*6236dae4SAndroid Build Coastguard Worker {"proxy-user", ARG_STRG, 'U', C_PROXY_USER},
261*6236dae4SAndroid Build Coastguard Worker {"proxy1.0", ARG_STRG, ' ', C_PROXY1_0},
262*6236dae4SAndroid Build Coastguard Worker {"proxytunnel", ARG_BOOL, 'p', C_PROXYTUNNEL},
263*6236dae4SAndroid Build Coastguard Worker {"pubkey", ARG_STRG, ' ', C_PUBKEY},
264*6236dae4SAndroid Build Coastguard Worker {"quote", ARG_STRG, 'Q', C_QUOTE},
265*6236dae4SAndroid Build Coastguard Worker {"random-file", ARG_FILE, ' ', C_RANDOM_FILE},
266*6236dae4SAndroid Build Coastguard Worker {"range", ARG_STRG, 'r', C_RANGE},
267*6236dae4SAndroid Build Coastguard Worker {"rate", ARG_STRG, ' ', C_RATE},
268*6236dae4SAndroid Build Coastguard Worker {"raw", ARG_BOOL, ' ', C_RAW},
269*6236dae4SAndroid Build Coastguard Worker {"referer", ARG_STRG, 'e', C_REFERER},
270*6236dae4SAndroid Build Coastguard Worker {"remote-header-name", ARG_BOOL, 'J', C_REMOTE_HEADER_NAME},
271*6236dae4SAndroid Build Coastguard Worker {"remote-name", ARG_BOOL, 'O', C_REMOTE_NAME},
272*6236dae4SAndroid Build Coastguard Worker {"remote-name-all", ARG_BOOL, ' ', C_REMOTE_NAME_ALL},
273*6236dae4SAndroid Build Coastguard Worker {"remote-time", ARG_BOOL, 'R', C_REMOTE_TIME},
274*6236dae4SAndroid Build Coastguard Worker {"remove-on-error", ARG_BOOL, ' ', C_REMOVE_ON_ERROR},
275*6236dae4SAndroid Build Coastguard Worker {"request", ARG_STRG, 'X', C_REQUEST},
276*6236dae4SAndroid Build Coastguard Worker {"request-target", ARG_STRG, ' ', C_REQUEST_TARGET},
277*6236dae4SAndroid Build Coastguard Worker {"resolve", ARG_STRG, ' ', C_RESOLVE},
278*6236dae4SAndroid Build Coastguard Worker {"retry", ARG_STRG, ' ', C_RETRY},
279*6236dae4SAndroid Build Coastguard Worker {"retry-all-errors", ARG_BOOL, ' ', C_RETRY_ALL_ERRORS},
280*6236dae4SAndroid Build Coastguard Worker {"retry-connrefused", ARG_BOOL, ' ', C_RETRY_CONNREFUSED},
281*6236dae4SAndroid Build Coastguard Worker {"retry-delay", ARG_STRG, ' ', C_RETRY_DELAY},
282*6236dae4SAndroid Build Coastguard Worker {"retry-max-time", ARG_STRG, ' ', C_RETRY_MAX_TIME},
283*6236dae4SAndroid Build Coastguard Worker {"sasl-authzid", ARG_STRG, ' ', C_SASL_AUTHZID},
284*6236dae4SAndroid Build Coastguard Worker {"sasl-ir", ARG_BOOL, ' ', C_SASL_IR},
285*6236dae4SAndroid Build Coastguard Worker {"service-name", ARG_STRG, ' ', C_SERVICE_NAME},
286*6236dae4SAndroid Build Coastguard Worker {"sessionid", ARG_BOOL|ARG_NO, ' ', C_SESSIONID},
287*6236dae4SAndroid Build Coastguard Worker {"show-error", ARG_BOOL, 'S', C_SHOW_ERROR},
288*6236dae4SAndroid Build Coastguard Worker {"show-headers", ARG_BOOL, 'i', C_SHOW_HEADERS},
289*6236dae4SAndroid Build Coastguard Worker {"silent", ARG_BOOL, 's', C_SILENT},
290*6236dae4SAndroid Build Coastguard Worker {"skip-existing", ARG_BOOL, ' ', C_SKIP_EXISTING},
291*6236dae4SAndroid Build Coastguard Worker {"socks4", ARG_STRG, ' ', C_SOCKS4},
292*6236dae4SAndroid Build Coastguard Worker {"socks4a", ARG_STRG, ' ', C_SOCKS4A},
293*6236dae4SAndroid Build Coastguard Worker {"socks5", ARG_STRG, ' ', C_SOCKS5},
294*6236dae4SAndroid Build Coastguard Worker {"socks5-basic", ARG_BOOL, ' ', C_SOCKS5_BASIC},
295*6236dae4SAndroid Build Coastguard Worker {"socks5-gssapi", ARG_BOOL, ' ', C_SOCKS5_GSSAPI},
296*6236dae4SAndroid Build Coastguard Worker {"socks5-gssapi-nec", ARG_BOOL, ' ', C_SOCKS5_GSSAPI_NEC},
297*6236dae4SAndroid Build Coastguard Worker {"socks5-gssapi-service", ARG_STRG, ' ', C_SOCKS5_GSSAPI_SERVICE},
298*6236dae4SAndroid Build Coastguard Worker {"socks5-hostname", ARG_STRG, ' ', C_SOCKS5_HOSTNAME},
299*6236dae4SAndroid Build Coastguard Worker {"speed-limit", ARG_STRG, 'Y', C_SPEED_LIMIT},
300*6236dae4SAndroid Build Coastguard Worker {"speed-time", ARG_STRG, 'y', C_SPEED_TIME},
301*6236dae4SAndroid Build Coastguard Worker {"ssl", ARG_BOOL, ' ', C_SSL},
302*6236dae4SAndroid Build Coastguard Worker {"ssl-allow-beast", ARG_BOOL, ' ', C_SSL_ALLOW_BEAST},
303*6236dae4SAndroid Build Coastguard Worker {"ssl-auto-client-cert", ARG_BOOL, ' ', C_SSL_AUTO_CLIENT_CERT},
304*6236dae4SAndroid Build Coastguard Worker {"ssl-no-revoke", ARG_BOOL, ' ', C_SSL_NO_REVOKE},
305*6236dae4SAndroid Build Coastguard Worker {"ssl-reqd", ARG_BOOL, ' ', C_SSL_REQD},
306*6236dae4SAndroid Build Coastguard Worker {"ssl-revoke-best-effort", ARG_BOOL, ' ', C_SSL_REVOKE_BEST_EFFORT},
307*6236dae4SAndroid Build Coastguard Worker {"sslv2", ARG_NONE, '2', C_SSLV2},
308*6236dae4SAndroid Build Coastguard Worker {"sslv3", ARG_NONE, '3', C_SSLV3},
309*6236dae4SAndroid Build Coastguard Worker {"stderr", ARG_FILE, ' ', C_STDERR},
310*6236dae4SAndroid Build Coastguard Worker {"styled-output", ARG_BOOL, ' ', C_STYLED_OUTPUT},
311*6236dae4SAndroid Build Coastguard Worker {"suppress-connect-headers", ARG_BOOL, ' ', C_SUPPRESS_CONNECT_HEADERS},
312*6236dae4SAndroid Build Coastguard Worker {"tcp-fastopen", ARG_BOOL, ' ', C_TCP_FASTOPEN},
313*6236dae4SAndroid Build Coastguard Worker {"tcp-nodelay", ARG_BOOL, ' ', C_TCP_NODELAY},
314*6236dae4SAndroid Build Coastguard Worker {"telnet-option", ARG_STRG, 't', C_TELNET_OPTION},
315*6236dae4SAndroid Build Coastguard Worker {"test-event", ARG_BOOL, ' ', C_TEST_EVENT},
316*6236dae4SAndroid Build Coastguard Worker {"tftp-blksize", ARG_STRG, ' ', C_TFTP_BLKSIZE},
317*6236dae4SAndroid Build Coastguard Worker {"tftp-no-options", ARG_BOOL, ' ', C_TFTP_NO_OPTIONS},
318*6236dae4SAndroid Build Coastguard Worker {"time-cond", ARG_STRG, 'z', C_TIME_COND},
319*6236dae4SAndroid Build Coastguard Worker {"tls-earlydata", ARG_BOOL, ' ', C_TLS_EARLYDATA},
320*6236dae4SAndroid Build Coastguard Worker {"tls-max", ARG_STRG, ' ', C_TLS_MAX},
321*6236dae4SAndroid Build Coastguard Worker {"tls13-ciphers", ARG_STRG, ' ', C_TLS13_CIPHERS},
322*6236dae4SAndroid Build Coastguard Worker {"tlsauthtype", ARG_STRG, ' ', C_TLSAUTHTYPE},
323*6236dae4SAndroid Build Coastguard Worker {"tlspassword", ARG_STRG, ' ', C_TLSPASSWORD},
324*6236dae4SAndroid Build Coastguard Worker {"tlsuser", ARG_STRG, ' ', C_TLSUSER},
325*6236dae4SAndroid Build Coastguard Worker {"tlsv1", ARG_NONE, '1', C_TLSV1},
326*6236dae4SAndroid Build Coastguard Worker {"tlsv1.0", ARG_NONE, ' ', C_TLSV1_0},
327*6236dae4SAndroid Build Coastguard Worker {"tlsv1.1", ARG_NONE, ' ', C_TLSV1_1},
328*6236dae4SAndroid Build Coastguard Worker {"tlsv1.2", ARG_NONE, ' ', C_TLSV1_2},
329*6236dae4SAndroid Build Coastguard Worker {"tlsv1.3", ARG_NONE, ' ', C_TLSV1_3},
330*6236dae4SAndroid Build Coastguard Worker {"tr-encoding", ARG_BOOL, ' ', C_TR_ENCODING},
331*6236dae4SAndroid Build Coastguard Worker {"trace", ARG_FILE, ' ', C_TRACE},
332*6236dae4SAndroid Build Coastguard Worker {"trace-ascii", ARG_FILE, ' ', C_TRACE_ASCII},
333*6236dae4SAndroid Build Coastguard Worker {"trace-config", ARG_STRG, ' ', C_TRACE_CONFIG},
334*6236dae4SAndroid Build Coastguard Worker {"trace-ids", ARG_BOOL, ' ', C_TRACE_IDS},
335*6236dae4SAndroid Build Coastguard Worker {"trace-time", ARG_BOOL, ' ', C_TRACE_TIME},
336*6236dae4SAndroid Build Coastguard Worker {"unix-socket", ARG_FILE, ' ', C_UNIX_SOCKET},
337*6236dae4SAndroid Build Coastguard Worker {"upload-file", ARG_FILE, 'T', C_UPLOAD_FILE},
338*6236dae4SAndroid Build Coastguard Worker {"url", ARG_STRG, ' ', C_URL},
339*6236dae4SAndroid Build Coastguard Worker {"url-query", ARG_STRG, ' ', C_URL_QUERY},
340*6236dae4SAndroid Build Coastguard Worker {"use-ascii", ARG_BOOL, 'B', C_USE_ASCII},
341*6236dae4SAndroid Build Coastguard Worker {"user", ARG_STRG, 'u', C_USER},
342*6236dae4SAndroid Build Coastguard Worker {"user-agent", ARG_STRG, 'A', C_USER_AGENT},
343*6236dae4SAndroid Build Coastguard Worker {"variable", ARG_STRG, ' ', C_VARIABLE},
344*6236dae4SAndroid Build Coastguard Worker {"verbose", ARG_BOOL, 'v', C_VERBOSE},
345*6236dae4SAndroid Build Coastguard Worker {"version", ARG_BOOL, 'V', C_VERSION},
346*6236dae4SAndroid Build Coastguard Worker {"vlan-priority", ARG_STRG, ' ', C_VLAN_PRIORITY},
347*6236dae4SAndroid Build Coastguard Worker #ifdef USE_WATT32
348*6236dae4SAndroid Build Coastguard Worker {"wdebug", ARG_BOOL, ' ', C_WDEBUG},
349*6236dae4SAndroid Build Coastguard Worker #endif
350*6236dae4SAndroid Build Coastguard Worker {"write-out", ARG_STRG, 'w', C_WRITE_OUT},
351*6236dae4SAndroid Build Coastguard Worker {"xattr", ARG_BOOL, ' ', C_XATTR},
352*6236dae4SAndroid Build Coastguard Worker };
353*6236dae4SAndroid Build Coastguard Worker
354*6236dae4SAndroid Build Coastguard Worker /* Split the argument of -E to 'certname' and 'passphrase' separated by colon.
355*6236dae4SAndroid Build Coastguard Worker * We allow ':' and '\' to be escaped by '\' so that we can use certificate
356*6236dae4SAndroid Build Coastguard Worker * nicknames containing ':'. See <https://sourceforge.net/p/curl/bugs/1196/>
357*6236dae4SAndroid Build Coastguard Worker * for details. */
358*6236dae4SAndroid Build Coastguard Worker #ifndef UNITTESTS
359*6236dae4SAndroid Build Coastguard Worker static
360*6236dae4SAndroid Build Coastguard Worker #endif
parse_cert_parameter(const char * cert_parameter,char ** certname,char ** passphrase)361*6236dae4SAndroid Build Coastguard Worker void parse_cert_parameter(const char *cert_parameter,
362*6236dae4SAndroid Build Coastguard Worker char **certname,
363*6236dae4SAndroid Build Coastguard Worker char **passphrase)
364*6236dae4SAndroid Build Coastguard Worker {
365*6236dae4SAndroid Build Coastguard Worker size_t param_length = strlen(cert_parameter);
366*6236dae4SAndroid Build Coastguard Worker size_t span;
367*6236dae4SAndroid Build Coastguard Worker const char *param_place = NULL;
368*6236dae4SAndroid Build Coastguard Worker char *certname_place = NULL;
369*6236dae4SAndroid Build Coastguard Worker *certname = NULL;
370*6236dae4SAndroid Build Coastguard Worker *passphrase = NULL;
371*6236dae4SAndroid Build Coastguard Worker
372*6236dae4SAndroid Build Coastguard Worker /* most trivial assumption: cert_parameter is empty */
373*6236dae4SAndroid Build Coastguard Worker if(param_length == 0)
374*6236dae4SAndroid Build Coastguard Worker return;
375*6236dae4SAndroid Build Coastguard Worker
376*6236dae4SAndroid Build Coastguard Worker /* next less trivial: cert_parameter starts 'pkcs11:' and thus
377*6236dae4SAndroid Build Coastguard Worker * looks like a RFC7512 PKCS#11 URI which can be used as-is.
378*6236dae4SAndroid Build Coastguard Worker * Also if cert_parameter contains no colon nor backslash, this
379*6236dae4SAndroid Build Coastguard Worker * means no passphrase was given and no characters escaped */
380*6236dae4SAndroid Build Coastguard Worker if(curl_strnequal(cert_parameter, "pkcs11:", 7) ||
381*6236dae4SAndroid Build Coastguard Worker !strpbrk(cert_parameter, ":\\")) {
382*6236dae4SAndroid Build Coastguard Worker *certname = strdup(cert_parameter);
383*6236dae4SAndroid Build Coastguard Worker return;
384*6236dae4SAndroid Build Coastguard Worker }
385*6236dae4SAndroid Build Coastguard Worker /* deal with escaped chars; find unescaped colon if it exists */
386*6236dae4SAndroid Build Coastguard Worker certname_place = malloc(param_length + 1);
387*6236dae4SAndroid Build Coastguard Worker if(!certname_place)
388*6236dae4SAndroid Build Coastguard Worker return;
389*6236dae4SAndroid Build Coastguard Worker
390*6236dae4SAndroid Build Coastguard Worker *certname = certname_place;
391*6236dae4SAndroid Build Coastguard Worker param_place = cert_parameter;
392*6236dae4SAndroid Build Coastguard Worker while(*param_place) {
393*6236dae4SAndroid Build Coastguard Worker span = strcspn(param_place, ":\\");
394*6236dae4SAndroid Build Coastguard Worker memcpy(certname_place, param_place, span);
395*6236dae4SAndroid Build Coastguard Worker param_place += span;
396*6236dae4SAndroid Build Coastguard Worker certname_place += span;
397*6236dae4SAndroid Build Coastguard Worker /* we just ate all the non-special chars. now we are on either a special
398*6236dae4SAndroid Build Coastguard Worker * char or the end of the string. */
399*6236dae4SAndroid Build Coastguard Worker switch(*param_place) {
400*6236dae4SAndroid Build Coastguard Worker case '\0':
401*6236dae4SAndroid Build Coastguard Worker break;
402*6236dae4SAndroid Build Coastguard Worker case '\\':
403*6236dae4SAndroid Build Coastguard Worker param_place++;
404*6236dae4SAndroid Build Coastguard Worker switch(*param_place) {
405*6236dae4SAndroid Build Coastguard Worker case '\0':
406*6236dae4SAndroid Build Coastguard Worker *certname_place++ = '\\';
407*6236dae4SAndroid Build Coastguard Worker break;
408*6236dae4SAndroid Build Coastguard Worker case '\\':
409*6236dae4SAndroid Build Coastguard Worker *certname_place++ = '\\';
410*6236dae4SAndroid Build Coastguard Worker param_place++;
411*6236dae4SAndroid Build Coastguard Worker break;
412*6236dae4SAndroid Build Coastguard Worker case ':':
413*6236dae4SAndroid Build Coastguard Worker *certname_place++ = ':';
414*6236dae4SAndroid Build Coastguard Worker param_place++;
415*6236dae4SAndroid Build Coastguard Worker break;
416*6236dae4SAndroid Build Coastguard Worker default:
417*6236dae4SAndroid Build Coastguard Worker *certname_place++ = '\\';
418*6236dae4SAndroid Build Coastguard Worker *certname_place++ = *param_place;
419*6236dae4SAndroid Build Coastguard Worker param_place++;
420*6236dae4SAndroid Build Coastguard Worker break;
421*6236dae4SAndroid Build Coastguard Worker }
422*6236dae4SAndroid Build Coastguard Worker break;
423*6236dae4SAndroid Build Coastguard Worker case ':':
424*6236dae4SAndroid Build Coastguard Worker /* Since we live in a world of weirdness and confusion, the Windows
425*6236dae4SAndroid Build Coastguard Worker dudes can use : when using drive letters and thus c:\file:password
426*6236dae4SAndroid Build Coastguard Worker needs to work. In order not to break compatibility, we still use : as
427*6236dae4SAndroid Build Coastguard Worker separator, but we try to detect when it is used for a filename! On
428*6236dae4SAndroid Build Coastguard Worker Windows. */
429*6236dae4SAndroid Build Coastguard Worker #ifdef _WIN32
430*6236dae4SAndroid Build Coastguard Worker if((param_place == &cert_parameter[1]) &&
431*6236dae4SAndroid Build Coastguard Worker (cert_parameter[2] == '\\' || cert_parameter[2] == '/') &&
432*6236dae4SAndroid Build Coastguard Worker (ISALPHA(cert_parameter[0])) ) {
433*6236dae4SAndroid Build Coastguard Worker /* colon in the second column, followed by a backslash, and the
434*6236dae4SAndroid Build Coastguard Worker first character is an alphabetic letter:
435*6236dae4SAndroid Build Coastguard Worker
436*6236dae4SAndroid Build Coastguard Worker this is a drive letter colon */
437*6236dae4SAndroid Build Coastguard Worker *certname_place++ = ':';
438*6236dae4SAndroid Build Coastguard Worker param_place++;
439*6236dae4SAndroid Build Coastguard Worker break;
440*6236dae4SAndroid Build Coastguard Worker }
441*6236dae4SAndroid Build Coastguard Worker #endif
442*6236dae4SAndroid Build Coastguard Worker /* escaped colons and Windows drive letter colons were handled
443*6236dae4SAndroid Build Coastguard Worker * above; if we are still here, this is a separating colon */
444*6236dae4SAndroid Build Coastguard Worker param_place++;
445*6236dae4SAndroid Build Coastguard Worker if(*param_place) {
446*6236dae4SAndroid Build Coastguard Worker *passphrase = strdup(param_place);
447*6236dae4SAndroid Build Coastguard Worker }
448*6236dae4SAndroid Build Coastguard Worker goto done;
449*6236dae4SAndroid Build Coastguard Worker }
450*6236dae4SAndroid Build Coastguard Worker }
451*6236dae4SAndroid Build Coastguard Worker done:
452*6236dae4SAndroid Build Coastguard Worker *certname_place = '\0';
453*6236dae4SAndroid Build Coastguard Worker }
454*6236dae4SAndroid Build Coastguard Worker
455*6236dae4SAndroid Build Coastguard Worker /* Replace (in-place) '%20' by '+' according to RFC1866 */
replace_url_encoded_space_by_plus(char * url)456*6236dae4SAndroid Build Coastguard Worker static size_t replace_url_encoded_space_by_plus(char *url)
457*6236dae4SAndroid Build Coastguard Worker {
458*6236dae4SAndroid Build Coastguard Worker size_t orig_len = strlen(url);
459*6236dae4SAndroid Build Coastguard Worker size_t orig_index = 0;
460*6236dae4SAndroid Build Coastguard Worker size_t new_index = 0;
461*6236dae4SAndroid Build Coastguard Worker
462*6236dae4SAndroid Build Coastguard Worker while(orig_index < orig_len) {
463*6236dae4SAndroid Build Coastguard Worker if((url[orig_index] == '%') &&
464*6236dae4SAndroid Build Coastguard Worker (url[orig_index + 1] == '2') &&
465*6236dae4SAndroid Build Coastguard Worker (url[orig_index + 2] == '0')) {
466*6236dae4SAndroid Build Coastguard Worker url[new_index] = '+';
467*6236dae4SAndroid Build Coastguard Worker orig_index += 3;
468*6236dae4SAndroid Build Coastguard Worker }
469*6236dae4SAndroid Build Coastguard Worker else{
470*6236dae4SAndroid Build Coastguard Worker if(new_index != orig_index) {
471*6236dae4SAndroid Build Coastguard Worker url[new_index] = url[orig_index];
472*6236dae4SAndroid Build Coastguard Worker }
473*6236dae4SAndroid Build Coastguard Worker orig_index++;
474*6236dae4SAndroid Build Coastguard Worker }
475*6236dae4SAndroid Build Coastguard Worker new_index++;
476*6236dae4SAndroid Build Coastguard Worker }
477*6236dae4SAndroid Build Coastguard Worker
478*6236dae4SAndroid Build Coastguard Worker url[new_index] = 0; /* terminate string */
479*6236dae4SAndroid Build Coastguard Worker
480*6236dae4SAndroid Build Coastguard Worker return new_index; /* new size */
481*6236dae4SAndroid Build Coastguard Worker }
482*6236dae4SAndroid Build Coastguard Worker
483*6236dae4SAndroid Build Coastguard Worker static void
GetFileAndPassword(char * nextarg,char ** file,char ** password)484*6236dae4SAndroid Build Coastguard Worker GetFileAndPassword(char *nextarg, char **file, char **password)
485*6236dae4SAndroid Build Coastguard Worker {
486*6236dae4SAndroid Build Coastguard Worker char *certname, *passphrase;
487*6236dae4SAndroid Build Coastguard Worker if(nextarg) {
488*6236dae4SAndroid Build Coastguard Worker parse_cert_parameter(nextarg, &certname, &passphrase);
489*6236dae4SAndroid Build Coastguard Worker Curl_safefree(*file);
490*6236dae4SAndroid Build Coastguard Worker *file = certname;
491*6236dae4SAndroid Build Coastguard Worker if(passphrase) {
492*6236dae4SAndroid Build Coastguard Worker Curl_safefree(*password);
493*6236dae4SAndroid Build Coastguard Worker *password = passphrase;
494*6236dae4SAndroid Build Coastguard Worker }
495*6236dae4SAndroid Build Coastguard Worker }
496*6236dae4SAndroid Build Coastguard Worker }
497*6236dae4SAndroid Build Coastguard Worker
498*6236dae4SAndroid Build Coastguard Worker /* Get a size parameter for '--limit-rate' or '--max-filesize'.
499*6236dae4SAndroid Build Coastguard Worker * We support a 'G', 'M' or 'K' suffix too.
500*6236dae4SAndroid Build Coastguard Worker */
GetSizeParameter(struct GlobalConfig * global,const char * arg,const char * which,curl_off_t * value_out)501*6236dae4SAndroid Build Coastguard Worker static ParameterError GetSizeParameter(struct GlobalConfig *global,
502*6236dae4SAndroid Build Coastguard Worker const char *arg,
503*6236dae4SAndroid Build Coastguard Worker const char *which,
504*6236dae4SAndroid Build Coastguard Worker curl_off_t *value_out)
505*6236dae4SAndroid Build Coastguard Worker {
506*6236dae4SAndroid Build Coastguard Worker char *unit;
507*6236dae4SAndroid Build Coastguard Worker curl_off_t value;
508*6236dae4SAndroid Build Coastguard Worker
509*6236dae4SAndroid Build Coastguard Worker if(curlx_strtoofft(arg, &unit, 10, &value)) {
510*6236dae4SAndroid Build Coastguard Worker warnf(global, "invalid number specified for %s", which);
511*6236dae4SAndroid Build Coastguard Worker return PARAM_BAD_USE;
512*6236dae4SAndroid Build Coastguard Worker }
513*6236dae4SAndroid Build Coastguard Worker
514*6236dae4SAndroid Build Coastguard Worker if(!*unit)
515*6236dae4SAndroid Build Coastguard Worker unit = (char *)"b";
516*6236dae4SAndroid Build Coastguard Worker else if(strlen(unit) > 1)
517*6236dae4SAndroid Build Coastguard Worker unit = (char *)"w"; /* unsupported */
518*6236dae4SAndroid Build Coastguard Worker
519*6236dae4SAndroid Build Coastguard Worker switch(*unit) {
520*6236dae4SAndroid Build Coastguard Worker case 'G':
521*6236dae4SAndroid Build Coastguard Worker case 'g':
522*6236dae4SAndroid Build Coastguard Worker if(value > (CURL_OFF_T_MAX / (1024*1024*1024)))
523*6236dae4SAndroid Build Coastguard Worker return PARAM_NUMBER_TOO_LARGE;
524*6236dae4SAndroid Build Coastguard Worker value *= 1024*1024*1024;
525*6236dae4SAndroid Build Coastguard Worker break;
526*6236dae4SAndroid Build Coastguard Worker case 'M':
527*6236dae4SAndroid Build Coastguard Worker case 'm':
528*6236dae4SAndroid Build Coastguard Worker if(value > (CURL_OFF_T_MAX / (1024*1024)))
529*6236dae4SAndroid Build Coastguard Worker return PARAM_NUMBER_TOO_LARGE;
530*6236dae4SAndroid Build Coastguard Worker value *= 1024*1024;
531*6236dae4SAndroid Build Coastguard Worker break;
532*6236dae4SAndroid Build Coastguard Worker case 'K':
533*6236dae4SAndroid Build Coastguard Worker case 'k':
534*6236dae4SAndroid Build Coastguard Worker if(value > (CURL_OFF_T_MAX / 1024))
535*6236dae4SAndroid Build Coastguard Worker return PARAM_NUMBER_TOO_LARGE;
536*6236dae4SAndroid Build Coastguard Worker value *= 1024;
537*6236dae4SAndroid Build Coastguard Worker break;
538*6236dae4SAndroid Build Coastguard Worker case 'b':
539*6236dae4SAndroid Build Coastguard Worker case 'B':
540*6236dae4SAndroid Build Coastguard Worker /* for plain bytes, leave as-is */
541*6236dae4SAndroid Build Coastguard Worker break;
542*6236dae4SAndroid Build Coastguard Worker default:
543*6236dae4SAndroid Build Coastguard Worker warnf(global, "unsupported %s unit. Use G, M, K or B", which);
544*6236dae4SAndroid Build Coastguard Worker return PARAM_BAD_USE;
545*6236dae4SAndroid Build Coastguard Worker }
546*6236dae4SAndroid Build Coastguard Worker *value_out = value;
547*6236dae4SAndroid Build Coastguard Worker return PARAM_OK;
548*6236dae4SAndroid Build Coastguard Worker }
549*6236dae4SAndroid Build Coastguard Worker
550*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_WRITABLE_ARGV
cleanarg(argv_item_t str)551*6236dae4SAndroid Build Coastguard Worker static void cleanarg(argv_item_t str)
552*6236dae4SAndroid Build Coastguard Worker {
553*6236dae4SAndroid Build Coastguard Worker /* now that getstr has copied the contents of nextarg, wipe the next
554*6236dae4SAndroid Build Coastguard Worker * argument out so that the username:password is not displayed in the
555*6236dae4SAndroid Build Coastguard Worker * system process list */
556*6236dae4SAndroid Build Coastguard Worker if(str) {
557*6236dae4SAndroid Build Coastguard Worker size_t len = strlen(str);
558*6236dae4SAndroid Build Coastguard Worker memset(str, ' ', len);
559*6236dae4SAndroid Build Coastguard Worker }
560*6236dae4SAndroid Build Coastguard Worker }
561*6236dae4SAndroid Build Coastguard Worker #else
562*6236dae4SAndroid Build Coastguard Worker #define cleanarg(x)
563*6236dae4SAndroid Build Coastguard Worker #endif
564*6236dae4SAndroid Build Coastguard Worker
565*6236dae4SAndroid Build Coastguard Worker /* the maximum size we allow the dynbuf generated string */
566*6236dae4SAndroid Build Coastguard Worker #define MAX_DATAURLENCODE (500*1024*1024)
567*6236dae4SAndroid Build Coastguard Worker
568*6236dae4SAndroid Build Coastguard Worker /* --data-urlencode */
data_urlencode(struct GlobalConfig * global,char * nextarg,char ** postp,size_t * lenp)569*6236dae4SAndroid Build Coastguard Worker static ParameterError data_urlencode(struct GlobalConfig *global,
570*6236dae4SAndroid Build Coastguard Worker char *nextarg,
571*6236dae4SAndroid Build Coastguard Worker char **postp,
572*6236dae4SAndroid Build Coastguard Worker size_t *lenp)
573*6236dae4SAndroid Build Coastguard Worker {
574*6236dae4SAndroid Build Coastguard Worker /* [name]=[content], we encode the content part only
575*6236dae4SAndroid Build Coastguard Worker * [name]@[filename]
576*6236dae4SAndroid Build Coastguard Worker *
577*6236dae4SAndroid Build Coastguard Worker * Case 2: we first load the file using that name and then encode
578*6236dae4SAndroid Build Coastguard Worker * the content.
579*6236dae4SAndroid Build Coastguard Worker */
580*6236dae4SAndroid Build Coastguard Worker ParameterError err;
581*6236dae4SAndroid Build Coastguard Worker const char *p = strchr(nextarg, '=');
582*6236dae4SAndroid Build Coastguard Worker size_t nlen;
583*6236dae4SAndroid Build Coastguard Worker char is_file;
584*6236dae4SAndroid Build Coastguard Worker char *postdata = NULL;
585*6236dae4SAndroid Build Coastguard Worker size_t size = 0;
586*6236dae4SAndroid Build Coastguard Worker if(!p)
587*6236dae4SAndroid Build Coastguard Worker /* there was no '=' letter, check for a '@' instead */
588*6236dae4SAndroid Build Coastguard Worker p = strchr(nextarg, '@');
589*6236dae4SAndroid Build Coastguard Worker if(p) {
590*6236dae4SAndroid Build Coastguard Worker nlen = p - nextarg; /* length of the name part */
591*6236dae4SAndroid Build Coastguard Worker is_file = *p++; /* pass the separator */
592*6236dae4SAndroid Build Coastguard Worker }
593*6236dae4SAndroid Build Coastguard Worker else {
594*6236dae4SAndroid Build Coastguard Worker /* neither @ nor =, so no name and it is not a file */
595*6236dae4SAndroid Build Coastguard Worker nlen = 0;
596*6236dae4SAndroid Build Coastguard Worker is_file = 0;
597*6236dae4SAndroid Build Coastguard Worker p = nextarg;
598*6236dae4SAndroid Build Coastguard Worker }
599*6236dae4SAndroid Build Coastguard Worker if('@' == is_file) {
600*6236dae4SAndroid Build Coastguard Worker FILE *file;
601*6236dae4SAndroid Build Coastguard Worker /* a '@' letter, it means that a filename or - (stdin) follows */
602*6236dae4SAndroid Build Coastguard Worker if(!strcmp("-", p)) {
603*6236dae4SAndroid Build Coastguard Worker file = stdin;
604*6236dae4SAndroid Build Coastguard Worker set_binmode(stdin);
605*6236dae4SAndroid Build Coastguard Worker }
606*6236dae4SAndroid Build Coastguard Worker else {
607*6236dae4SAndroid Build Coastguard Worker file = fopen(p, "rb");
608*6236dae4SAndroid Build Coastguard Worker if(!file) {
609*6236dae4SAndroid Build Coastguard Worker errorf(global, "Failed to open %s", p);
610*6236dae4SAndroid Build Coastguard Worker return PARAM_READ_ERROR;
611*6236dae4SAndroid Build Coastguard Worker }
612*6236dae4SAndroid Build Coastguard Worker }
613*6236dae4SAndroid Build Coastguard Worker
614*6236dae4SAndroid Build Coastguard Worker err = file2memory(&postdata, &size, file);
615*6236dae4SAndroid Build Coastguard Worker
616*6236dae4SAndroid Build Coastguard Worker if(file && (file != stdin))
617*6236dae4SAndroid Build Coastguard Worker fclose(file);
618*6236dae4SAndroid Build Coastguard Worker if(err)
619*6236dae4SAndroid Build Coastguard Worker return err;
620*6236dae4SAndroid Build Coastguard Worker }
621*6236dae4SAndroid Build Coastguard Worker else {
622*6236dae4SAndroid Build Coastguard Worker err = getstr(&postdata, p, ALLOW_BLANK);
623*6236dae4SAndroid Build Coastguard Worker if(err)
624*6236dae4SAndroid Build Coastguard Worker goto error;
625*6236dae4SAndroid Build Coastguard Worker size = strlen(postdata);
626*6236dae4SAndroid Build Coastguard Worker }
627*6236dae4SAndroid Build Coastguard Worker
628*6236dae4SAndroid Build Coastguard Worker if(!postdata) {
629*6236dae4SAndroid Build Coastguard Worker /* no data from the file, point to a zero byte string to make this
630*6236dae4SAndroid Build Coastguard Worker get sent as a POST anyway */
631*6236dae4SAndroid Build Coastguard Worker postdata = strdup("");
632*6236dae4SAndroid Build Coastguard Worker if(!postdata)
633*6236dae4SAndroid Build Coastguard Worker return PARAM_NO_MEM;
634*6236dae4SAndroid Build Coastguard Worker size = 0;
635*6236dae4SAndroid Build Coastguard Worker }
636*6236dae4SAndroid Build Coastguard Worker else {
637*6236dae4SAndroid Build Coastguard Worker char *enc = curl_easy_escape(NULL, postdata, (int)size);
638*6236dae4SAndroid Build Coastguard Worker Curl_safefree(postdata); /* no matter if it worked or not */
639*6236dae4SAndroid Build Coastguard Worker if(enc) {
640*6236dae4SAndroid Build Coastguard Worker char *n;
641*6236dae4SAndroid Build Coastguard Worker replace_url_encoded_space_by_plus(enc);
642*6236dae4SAndroid Build Coastguard Worker if(nlen > 0) { /* only append '=' if we have a name */
643*6236dae4SAndroid Build Coastguard Worker struct curlx_dynbuf dyn;
644*6236dae4SAndroid Build Coastguard Worker curlx_dyn_init(&dyn, MAX_DATAURLENCODE);
645*6236dae4SAndroid Build Coastguard Worker if(curlx_dyn_addn(&dyn, nextarg, nlen) ||
646*6236dae4SAndroid Build Coastguard Worker curlx_dyn_addn(&dyn, "=", 1) ||
647*6236dae4SAndroid Build Coastguard Worker curlx_dyn_add(&dyn, enc)) {
648*6236dae4SAndroid Build Coastguard Worker curl_free(enc);
649*6236dae4SAndroid Build Coastguard Worker return PARAM_NO_MEM;
650*6236dae4SAndroid Build Coastguard Worker }
651*6236dae4SAndroid Build Coastguard Worker curl_free(enc);
652*6236dae4SAndroid Build Coastguard Worker n = curlx_dyn_ptr(&dyn);
653*6236dae4SAndroid Build Coastguard Worker size = curlx_dyn_len(&dyn);
654*6236dae4SAndroid Build Coastguard Worker }
655*6236dae4SAndroid Build Coastguard Worker else {
656*6236dae4SAndroid Build Coastguard Worker n = enc;
657*6236dae4SAndroid Build Coastguard Worker size = strlen(n);
658*6236dae4SAndroid Build Coastguard Worker }
659*6236dae4SAndroid Build Coastguard Worker postdata = n;
660*6236dae4SAndroid Build Coastguard Worker }
661*6236dae4SAndroid Build Coastguard Worker else
662*6236dae4SAndroid Build Coastguard Worker return PARAM_NO_MEM;
663*6236dae4SAndroid Build Coastguard Worker }
664*6236dae4SAndroid Build Coastguard Worker *postp = postdata;
665*6236dae4SAndroid Build Coastguard Worker *lenp = size;
666*6236dae4SAndroid Build Coastguard Worker return PARAM_OK;
667*6236dae4SAndroid Build Coastguard Worker error:
668*6236dae4SAndroid Build Coastguard Worker return err;
669*6236dae4SAndroid Build Coastguard Worker }
670*6236dae4SAndroid Build Coastguard Worker
sethttpver(struct GlobalConfig * global,struct OperationConfig * config,long httpversion)671*6236dae4SAndroid Build Coastguard Worker static void sethttpver(struct GlobalConfig *global,
672*6236dae4SAndroid Build Coastguard Worker struct OperationConfig *config,
673*6236dae4SAndroid Build Coastguard Worker long httpversion)
674*6236dae4SAndroid Build Coastguard Worker {
675*6236dae4SAndroid Build Coastguard Worker if(config->httpversion &&
676*6236dae4SAndroid Build Coastguard Worker (config->httpversion != httpversion))
677*6236dae4SAndroid Build Coastguard Worker warnf(global, "Overrides previous HTTP version option");
678*6236dae4SAndroid Build Coastguard Worker
679*6236dae4SAndroid Build Coastguard Worker config->httpversion = httpversion;
680*6236dae4SAndroid Build Coastguard Worker }
681*6236dae4SAndroid Build Coastguard Worker
set_trace_config(struct GlobalConfig * global,const char * config)682*6236dae4SAndroid Build Coastguard Worker static CURLcode set_trace_config(struct GlobalConfig *global,
683*6236dae4SAndroid Build Coastguard Worker const char *config)
684*6236dae4SAndroid Build Coastguard Worker {
685*6236dae4SAndroid Build Coastguard Worker CURLcode result = CURLE_OK;
686*6236dae4SAndroid Build Coastguard Worker char *token, *tmp, *name;
687*6236dae4SAndroid Build Coastguard Worker bool toggle;
688*6236dae4SAndroid Build Coastguard Worker
689*6236dae4SAndroid Build Coastguard Worker tmp = strdup(config);
690*6236dae4SAndroid Build Coastguard Worker if(!tmp)
691*6236dae4SAndroid Build Coastguard Worker return CURLE_OUT_OF_MEMORY;
692*6236dae4SAndroid Build Coastguard Worker
693*6236dae4SAndroid Build Coastguard Worker /* Allow strtok() here since this is not used threaded */
694*6236dae4SAndroid Build Coastguard Worker /* !checksrc! disable BANNEDFUNC 2 */
695*6236dae4SAndroid Build Coastguard Worker token = strtok(tmp, ", ");
696*6236dae4SAndroid Build Coastguard Worker while(token) {
697*6236dae4SAndroid Build Coastguard Worker switch(*token) {
698*6236dae4SAndroid Build Coastguard Worker case '-':
699*6236dae4SAndroid Build Coastguard Worker toggle = FALSE;
700*6236dae4SAndroid Build Coastguard Worker name = token + 1;
701*6236dae4SAndroid Build Coastguard Worker break;
702*6236dae4SAndroid Build Coastguard Worker case '+':
703*6236dae4SAndroid Build Coastguard Worker toggle = TRUE;
704*6236dae4SAndroid Build Coastguard Worker name = token + 1;
705*6236dae4SAndroid Build Coastguard Worker break;
706*6236dae4SAndroid Build Coastguard Worker default:
707*6236dae4SAndroid Build Coastguard Worker toggle = TRUE;
708*6236dae4SAndroid Build Coastguard Worker name = token;
709*6236dae4SAndroid Build Coastguard Worker break;
710*6236dae4SAndroid Build Coastguard Worker }
711*6236dae4SAndroid Build Coastguard Worker
712*6236dae4SAndroid Build Coastguard Worker if(strcasecompare(name, "all")) {
713*6236dae4SAndroid Build Coastguard Worker global->traceids = toggle;
714*6236dae4SAndroid Build Coastguard Worker global->tracetime = toggle;
715*6236dae4SAndroid Build Coastguard Worker result = curl_global_trace(token);
716*6236dae4SAndroid Build Coastguard Worker if(result)
717*6236dae4SAndroid Build Coastguard Worker goto out;
718*6236dae4SAndroid Build Coastguard Worker }
719*6236dae4SAndroid Build Coastguard Worker else if(strcasecompare(name, "ids")) {
720*6236dae4SAndroid Build Coastguard Worker global->traceids = toggle;
721*6236dae4SAndroid Build Coastguard Worker }
722*6236dae4SAndroid Build Coastguard Worker else if(strcasecompare(name, "time")) {
723*6236dae4SAndroid Build Coastguard Worker global->tracetime = toggle;
724*6236dae4SAndroid Build Coastguard Worker }
725*6236dae4SAndroid Build Coastguard Worker else {
726*6236dae4SAndroid Build Coastguard Worker result = curl_global_trace(token);
727*6236dae4SAndroid Build Coastguard Worker if(result)
728*6236dae4SAndroid Build Coastguard Worker goto out;
729*6236dae4SAndroid Build Coastguard Worker }
730*6236dae4SAndroid Build Coastguard Worker token = strtok(NULL, ", ");
731*6236dae4SAndroid Build Coastguard Worker }
732*6236dae4SAndroid Build Coastguard Worker out:
733*6236dae4SAndroid Build Coastguard Worker free(tmp);
734*6236dae4SAndroid Build Coastguard Worker return result;
735*6236dae4SAndroid Build Coastguard Worker }
736*6236dae4SAndroid Build Coastguard Worker
findarg(const void * a,const void * b)737*6236dae4SAndroid Build Coastguard Worker static int findarg(const void *a, const void *b)
738*6236dae4SAndroid Build Coastguard Worker {
739*6236dae4SAndroid Build Coastguard Worker const struct LongShort *aa = a;
740*6236dae4SAndroid Build Coastguard Worker const struct LongShort *bb = b;
741*6236dae4SAndroid Build Coastguard Worker return strcmp(aa->lname, bb->lname);
742*6236dae4SAndroid Build Coastguard Worker }
743*6236dae4SAndroid Build Coastguard Worker
findshortopt(char letter)744*6236dae4SAndroid Build Coastguard Worker const struct LongShort *findshortopt(char letter)
745*6236dae4SAndroid Build Coastguard Worker {
746*6236dae4SAndroid Build Coastguard Worker static const struct LongShort *singles[128 - ' ']; /* ASCII => pointer */
747*6236dae4SAndroid Build Coastguard Worker static bool singles_done = FALSE;
748*6236dae4SAndroid Build Coastguard Worker if((letter >= 127) || (letter <= ' '))
749*6236dae4SAndroid Build Coastguard Worker return NULL;
750*6236dae4SAndroid Build Coastguard Worker
751*6236dae4SAndroid Build Coastguard Worker if(!singles_done) {
752*6236dae4SAndroid Build Coastguard Worker unsigned int j;
753*6236dae4SAndroid Build Coastguard Worker for(j = 0; j < sizeof(aliases)/sizeof(aliases[0]); j++) {
754*6236dae4SAndroid Build Coastguard Worker if(aliases[j].letter != ' ') {
755*6236dae4SAndroid Build Coastguard Worker unsigned char l = (unsigned char)aliases[j].letter;
756*6236dae4SAndroid Build Coastguard Worker singles[l - ' '] = &aliases[j];
757*6236dae4SAndroid Build Coastguard Worker }
758*6236dae4SAndroid Build Coastguard Worker }
759*6236dae4SAndroid Build Coastguard Worker singles_done = TRUE;
760*6236dae4SAndroid Build Coastguard Worker }
761*6236dae4SAndroid Build Coastguard Worker return singles[letter - ' '];
762*6236dae4SAndroid Build Coastguard Worker }
763*6236dae4SAndroid Build Coastguard Worker
764*6236dae4SAndroid Build Coastguard Worker struct TOSEntry {
765*6236dae4SAndroid Build Coastguard Worker const char *name;
766*6236dae4SAndroid Build Coastguard Worker unsigned char value;
767*6236dae4SAndroid Build Coastguard Worker };
768*6236dae4SAndroid Build Coastguard Worker
769*6236dae4SAndroid Build Coastguard Worker static const struct TOSEntry tos_entries[] = {
770*6236dae4SAndroid Build Coastguard Worker {"AF11", 0x28},
771*6236dae4SAndroid Build Coastguard Worker {"AF12", 0x30},
772*6236dae4SAndroid Build Coastguard Worker {"AF13", 0x38},
773*6236dae4SAndroid Build Coastguard Worker {"AF21", 0x48},
774*6236dae4SAndroid Build Coastguard Worker {"AF22", 0x50},
775*6236dae4SAndroid Build Coastguard Worker {"AF23", 0x58},
776*6236dae4SAndroid Build Coastguard Worker {"AF31", 0x68},
777*6236dae4SAndroid Build Coastguard Worker {"AF32", 0x70},
778*6236dae4SAndroid Build Coastguard Worker {"AF33", 0x78},
779*6236dae4SAndroid Build Coastguard Worker {"AF41", 0x88},
780*6236dae4SAndroid Build Coastguard Worker {"AF42", 0x90},
781*6236dae4SAndroid Build Coastguard Worker {"AF43", 0x98},
782*6236dae4SAndroid Build Coastguard Worker {"CE", 0x03},
783*6236dae4SAndroid Build Coastguard Worker {"CS0", 0x00},
784*6236dae4SAndroid Build Coastguard Worker {"CS1", 0x20},
785*6236dae4SAndroid Build Coastguard Worker {"CS2", 0x40},
786*6236dae4SAndroid Build Coastguard Worker {"CS3", 0x60},
787*6236dae4SAndroid Build Coastguard Worker {"CS4", 0x80},
788*6236dae4SAndroid Build Coastguard Worker {"CS5", 0xa0},
789*6236dae4SAndroid Build Coastguard Worker {"CS6", 0xc0},
790*6236dae4SAndroid Build Coastguard Worker {"CS7", 0xe0},
791*6236dae4SAndroid Build Coastguard Worker {"ECT0", 0x02},
792*6236dae4SAndroid Build Coastguard Worker {"ECT1", 0x01},
793*6236dae4SAndroid Build Coastguard Worker {"EF", 0xb8},
794*6236dae4SAndroid Build Coastguard Worker {"LE", 0x04},
795*6236dae4SAndroid Build Coastguard Worker {"LOWCOST", 0x02},
796*6236dae4SAndroid Build Coastguard Worker {"LOWDELAY", 0x10},
797*6236dae4SAndroid Build Coastguard Worker {"MINCOST", 0x02},
798*6236dae4SAndroid Build Coastguard Worker {"RELIABILITY", 0x04},
799*6236dae4SAndroid Build Coastguard Worker {"THROUGHPUT", 0x08},
800*6236dae4SAndroid Build Coastguard Worker {"VOICE-ADMIT", 0xb0}
801*6236dae4SAndroid Build Coastguard Worker };
802*6236dae4SAndroid Build Coastguard Worker
find_tos(const void * a,const void * b)803*6236dae4SAndroid Build Coastguard Worker static int find_tos(const void *a, const void *b)
804*6236dae4SAndroid Build Coastguard Worker {
805*6236dae4SAndroid Build Coastguard Worker const struct TOSEntry *aa = a;
806*6236dae4SAndroid Build Coastguard Worker const struct TOSEntry *bb = b;
807*6236dae4SAndroid Build Coastguard Worker return strcmp(aa->name, bb->name);
808*6236dae4SAndroid Build Coastguard Worker }
809*6236dae4SAndroid Build Coastguard Worker
810*6236dae4SAndroid Build Coastguard Worker #define MAX_QUERY_LEN 100000 /* larger is not likely to ever work */
url_query(char * nextarg,struct GlobalConfig * global,struct OperationConfig * config)811*6236dae4SAndroid Build Coastguard Worker static ParameterError url_query(char *nextarg,
812*6236dae4SAndroid Build Coastguard Worker struct GlobalConfig *global,
813*6236dae4SAndroid Build Coastguard Worker struct OperationConfig *config)
814*6236dae4SAndroid Build Coastguard Worker {
815*6236dae4SAndroid Build Coastguard Worker size_t size = 0;
816*6236dae4SAndroid Build Coastguard Worker ParameterError err = PARAM_OK;
817*6236dae4SAndroid Build Coastguard Worker char *query;
818*6236dae4SAndroid Build Coastguard Worker struct curlx_dynbuf dyn;
819*6236dae4SAndroid Build Coastguard Worker curlx_dyn_init(&dyn, MAX_QUERY_LEN);
820*6236dae4SAndroid Build Coastguard Worker
821*6236dae4SAndroid Build Coastguard Worker if(*nextarg == '+') {
822*6236dae4SAndroid Build Coastguard Worker /* use without encoding */
823*6236dae4SAndroid Build Coastguard Worker query = strdup(&nextarg[1]);
824*6236dae4SAndroid Build Coastguard Worker if(!query)
825*6236dae4SAndroid Build Coastguard Worker err = PARAM_NO_MEM;
826*6236dae4SAndroid Build Coastguard Worker }
827*6236dae4SAndroid Build Coastguard Worker else
828*6236dae4SAndroid Build Coastguard Worker err = data_urlencode(global, nextarg, &query, &size);
829*6236dae4SAndroid Build Coastguard Worker
830*6236dae4SAndroid Build Coastguard Worker if(!err) {
831*6236dae4SAndroid Build Coastguard Worker if(config->query) {
832*6236dae4SAndroid Build Coastguard Worker CURLcode result = curlx_dyn_addf(&dyn, "%s&%s", config->query, query);
833*6236dae4SAndroid Build Coastguard Worker free(query);
834*6236dae4SAndroid Build Coastguard Worker if(result)
835*6236dae4SAndroid Build Coastguard Worker err = PARAM_NO_MEM;
836*6236dae4SAndroid Build Coastguard Worker else {
837*6236dae4SAndroid Build Coastguard Worker free(config->query);
838*6236dae4SAndroid Build Coastguard Worker config->query = curlx_dyn_ptr(&dyn);
839*6236dae4SAndroid Build Coastguard Worker }
840*6236dae4SAndroid Build Coastguard Worker }
841*6236dae4SAndroid Build Coastguard Worker else
842*6236dae4SAndroid Build Coastguard Worker config->query = query;
843*6236dae4SAndroid Build Coastguard Worker }
844*6236dae4SAndroid Build Coastguard Worker return err;
845*6236dae4SAndroid Build Coastguard Worker }
846*6236dae4SAndroid Build Coastguard Worker
set_data(cmdline_t cmd,char * nextarg,struct GlobalConfig * global,struct OperationConfig * config)847*6236dae4SAndroid Build Coastguard Worker static ParameterError set_data(cmdline_t cmd,
848*6236dae4SAndroid Build Coastguard Worker char *nextarg,
849*6236dae4SAndroid Build Coastguard Worker struct GlobalConfig *global,
850*6236dae4SAndroid Build Coastguard Worker struct OperationConfig *config)
851*6236dae4SAndroid Build Coastguard Worker {
852*6236dae4SAndroid Build Coastguard Worker char *postdata = NULL;
853*6236dae4SAndroid Build Coastguard Worker FILE *file;
854*6236dae4SAndroid Build Coastguard Worker size_t size = 0;
855*6236dae4SAndroid Build Coastguard Worker ParameterError err = PARAM_OK;
856*6236dae4SAndroid Build Coastguard Worker
857*6236dae4SAndroid Build Coastguard Worker if(cmd == C_DATA_URLENCODE) { /* --data-urlencode */
858*6236dae4SAndroid Build Coastguard Worker err = data_urlencode(global, nextarg, &postdata, &size);
859*6236dae4SAndroid Build Coastguard Worker if(err)
860*6236dae4SAndroid Build Coastguard Worker return err;
861*6236dae4SAndroid Build Coastguard Worker }
862*6236dae4SAndroid Build Coastguard Worker else if('@' == *nextarg && (cmd != C_DATA_RAW)) {
863*6236dae4SAndroid Build Coastguard Worker /* the data begins with a '@' letter, it means that a filename
864*6236dae4SAndroid Build Coastguard Worker or - (stdin) follows */
865*6236dae4SAndroid Build Coastguard Worker nextarg++; /* pass the @ */
866*6236dae4SAndroid Build Coastguard Worker
867*6236dae4SAndroid Build Coastguard Worker if(!strcmp("-", nextarg)) {
868*6236dae4SAndroid Build Coastguard Worker file = stdin;
869*6236dae4SAndroid Build Coastguard Worker if(cmd == C_DATA_BINARY) /* forced data-binary */
870*6236dae4SAndroid Build Coastguard Worker set_binmode(stdin);
871*6236dae4SAndroid Build Coastguard Worker }
872*6236dae4SAndroid Build Coastguard Worker else {
873*6236dae4SAndroid Build Coastguard Worker file = fopen(nextarg, "rb");
874*6236dae4SAndroid Build Coastguard Worker if(!file) {
875*6236dae4SAndroid Build Coastguard Worker errorf(global, "Failed to open %s", nextarg);
876*6236dae4SAndroid Build Coastguard Worker return PARAM_READ_ERROR;
877*6236dae4SAndroid Build Coastguard Worker }
878*6236dae4SAndroid Build Coastguard Worker }
879*6236dae4SAndroid Build Coastguard Worker
880*6236dae4SAndroid Build Coastguard Worker if((cmd == C_DATA_BINARY) || /* --data-binary */
881*6236dae4SAndroid Build Coastguard Worker (cmd == C_JSON) /* --json */)
882*6236dae4SAndroid Build Coastguard Worker /* forced binary */
883*6236dae4SAndroid Build Coastguard Worker err = file2memory(&postdata, &size, file);
884*6236dae4SAndroid Build Coastguard Worker else {
885*6236dae4SAndroid Build Coastguard Worker err = file2string(&postdata, file);
886*6236dae4SAndroid Build Coastguard Worker if(postdata)
887*6236dae4SAndroid Build Coastguard Worker size = strlen(postdata);
888*6236dae4SAndroid Build Coastguard Worker }
889*6236dae4SAndroid Build Coastguard Worker
890*6236dae4SAndroid Build Coastguard Worker if(file && (file != stdin))
891*6236dae4SAndroid Build Coastguard Worker fclose(file);
892*6236dae4SAndroid Build Coastguard Worker if(err)
893*6236dae4SAndroid Build Coastguard Worker return err;
894*6236dae4SAndroid Build Coastguard Worker
895*6236dae4SAndroid Build Coastguard Worker if(!postdata) {
896*6236dae4SAndroid Build Coastguard Worker /* no data from the file, point to a zero byte string to make this
897*6236dae4SAndroid Build Coastguard Worker get sent as a POST anyway */
898*6236dae4SAndroid Build Coastguard Worker postdata = strdup("");
899*6236dae4SAndroid Build Coastguard Worker if(!postdata)
900*6236dae4SAndroid Build Coastguard Worker return PARAM_NO_MEM;
901*6236dae4SAndroid Build Coastguard Worker }
902*6236dae4SAndroid Build Coastguard Worker }
903*6236dae4SAndroid Build Coastguard Worker else {
904*6236dae4SAndroid Build Coastguard Worker err = getstr(&postdata, nextarg, ALLOW_BLANK);
905*6236dae4SAndroid Build Coastguard Worker if(err)
906*6236dae4SAndroid Build Coastguard Worker return err;
907*6236dae4SAndroid Build Coastguard Worker size = strlen(postdata);
908*6236dae4SAndroid Build Coastguard Worker }
909*6236dae4SAndroid Build Coastguard Worker if(cmd == C_JSON)
910*6236dae4SAndroid Build Coastguard Worker config->jsoned = TRUE;
911*6236dae4SAndroid Build Coastguard Worker
912*6236dae4SAndroid Build Coastguard Worker if(curlx_dyn_len(&config->postdata)) {
913*6236dae4SAndroid Build Coastguard Worker /* skip separator append for --json */
914*6236dae4SAndroid Build Coastguard Worker if(!err && (cmd != C_JSON) &&
915*6236dae4SAndroid Build Coastguard Worker curlx_dyn_addn(&config->postdata, "&", 1))
916*6236dae4SAndroid Build Coastguard Worker err = PARAM_NO_MEM;
917*6236dae4SAndroid Build Coastguard Worker }
918*6236dae4SAndroid Build Coastguard Worker
919*6236dae4SAndroid Build Coastguard Worker if(!err && curlx_dyn_addn(&config->postdata, postdata, size))
920*6236dae4SAndroid Build Coastguard Worker err = PARAM_NO_MEM;
921*6236dae4SAndroid Build Coastguard Worker
922*6236dae4SAndroid Build Coastguard Worker Curl_safefree(postdata);
923*6236dae4SAndroid Build Coastguard Worker
924*6236dae4SAndroid Build Coastguard Worker config->postfields = curlx_dyn_ptr(&config->postdata);
925*6236dae4SAndroid Build Coastguard Worker return err;
926*6236dae4SAndroid Build Coastguard Worker }
927*6236dae4SAndroid Build Coastguard Worker
set_rate(struct GlobalConfig * global,char * nextarg)928*6236dae4SAndroid Build Coastguard Worker static ParameterError set_rate(struct GlobalConfig *global,
929*6236dae4SAndroid Build Coastguard Worker char *nextarg)
930*6236dae4SAndroid Build Coastguard Worker {
931*6236dae4SAndroid Build Coastguard Worker /* --rate */
932*6236dae4SAndroid Build Coastguard Worker /* support a few different suffixes, extract the suffix first, then
933*6236dae4SAndroid Build Coastguard Worker get the number and convert to per hour.
934*6236dae4SAndroid Build Coastguard Worker /s == per second
935*6236dae4SAndroid Build Coastguard Worker /m == per minute
936*6236dae4SAndroid Build Coastguard Worker /h == per hour (default)
937*6236dae4SAndroid Build Coastguard Worker /d == per day (24 hours)
938*6236dae4SAndroid Build Coastguard Worker */
939*6236dae4SAndroid Build Coastguard Worker ParameterError err = PARAM_OK;
940*6236dae4SAndroid Build Coastguard Worker char *div = strchr(nextarg, '/');
941*6236dae4SAndroid Build Coastguard Worker char number[26];
942*6236dae4SAndroid Build Coastguard Worker long denominator;
943*6236dae4SAndroid Build Coastguard Worker long numerator = 60*60*1000; /* default per hour */
944*6236dae4SAndroid Build Coastguard Worker size_t numlen = div ? (size_t)(div - nextarg) : strlen(nextarg);
945*6236dae4SAndroid Build Coastguard Worker if(numlen > sizeof(number) -1)
946*6236dae4SAndroid Build Coastguard Worker return PARAM_NUMBER_TOO_LARGE;
947*6236dae4SAndroid Build Coastguard Worker
948*6236dae4SAndroid Build Coastguard Worker memcpy(number, nextarg, numlen);
949*6236dae4SAndroid Build Coastguard Worker number[numlen] = 0;
950*6236dae4SAndroid Build Coastguard Worker err = str2unum(&denominator, number);
951*6236dae4SAndroid Build Coastguard Worker if(err)
952*6236dae4SAndroid Build Coastguard Worker return err;
953*6236dae4SAndroid Build Coastguard Worker
954*6236dae4SAndroid Build Coastguard Worker if(denominator < 1)
955*6236dae4SAndroid Build Coastguard Worker return PARAM_BAD_USE;
956*6236dae4SAndroid Build Coastguard Worker
957*6236dae4SAndroid Build Coastguard Worker if(div) {
958*6236dae4SAndroid Build Coastguard Worker char unit = div[1];
959*6236dae4SAndroid Build Coastguard Worker curl_off_t numunits;
960*6236dae4SAndroid Build Coastguard Worker char *endp;
961*6236dae4SAndroid Build Coastguard Worker
962*6236dae4SAndroid Build Coastguard Worker if(curlx_strtoofft(&div[1], &endp, 10, &numunits)) {
963*6236dae4SAndroid Build Coastguard Worker /* if it fails, there is no legit number specified */
964*6236dae4SAndroid Build Coastguard Worker if(endp == &div[1])
965*6236dae4SAndroid Build Coastguard Worker /* if endp did not move, accept it as a 1 */
966*6236dae4SAndroid Build Coastguard Worker numunits = 1;
967*6236dae4SAndroid Build Coastguard Worker else
968*6236dae4SAndroid Build Coastguard Worker return PARAM_BAD_USE;
969*6236dae4SAndroid Build Coastguard Worker }
970*6236dae4SAndroid Build Coastguard Worker else
971*6236dae4SAndroid Build Coastguard Worker unit = *endp;
972*6236dae4SAndroid Build Coastguard Worker
973*6236dae4SAndroid Build Coastguard Worker switch(unit) {
974*6236dae4SAndroid Build Coastguard Worker case 's': /* per second */
975*6236dae4SAndroid Build Coastguard Worker numerator = 1000;
976*6236dae4SAndroid Build Coastguard Worker break;
977*6236dae4SAndroid Build Coastguard Worker case 'm': /* per minute */
978*6236dae4SAndroid Build Coastguard Worker numerator = 60*1000;
979*6236dae4SAndroid Build Coastguard Worker break;
980*6236dae4SAndroid Build Coastguard Worker case 'h': /* per hour */
981*6236dae4SAndroid Build Coastguard Worker break;
982*6236dae4SAndroid Build Coastguard Worker case 'd': /* per day */
983*6236dae4SAndroid Build Coastguard Worker numerator = 24*60*60*1000;
984*6236dae4SAndroid Build Coastguard Worker break;
985*6236dae4SAndroid Build Coastguard Worker default:
986*6236dae4SAndroid Build Coastguard Worker errorf(global, "unsupported --rate unit");
987*6236dae4SAndroid Build Coastguard Worker err = PARAM_BAD_USE;
988*6236dae4SAndroid Build Coastguard Worker break;
989*6236dae4SAndroid Build Coastguard Worker }
990*6236dae4SAndroid Build Coastguard Worker
991*6236dae4SAndroid Build Coastguard Worker if((LONG_MAX / numerator) < numunits) {
992*6236dae4SAndroid Build Coastguard Worker /* overflow, too large number */
993*6236dae4SAndroid Build Coastguard Worker errorf(global, "too large --rate unit");
994*6236dae4SAndroid Build Coastguard Worker err = PARAM_NUMBER_TOO_LARGE;
995*6236dae4SAndroid Build Coastguard Worker }
996*6236dae4SAndroid Build Coastguard Worker /* this typecast is okay based on the check above */
997*6236dae4SAndroid Build Coastguard Worker numerator *= (long)numunits;
998*6236dae4SAndroid Build Coastguard Worker }
999*6236dae4SAndroid Build Coastguard Worker
1000*6236dae4SAndroid Build Coastguard Worker if(err)
1001*6236dae4SAndroid Build Coastguard Worker ;
1002*6236dae4SAndroid Build Coastguard Worker else if(denominator > numerator)
1003*6236dae4SAndroid Build Coastguard Worker err = PARAM_NUMBER_TOO_LARGE;
1004*6236dae4SAndroid Build Coastguard Worker else
1005*6236dae4SAndroid Build Coastguard Worker global->ms_per_transfer = numerator/denominator;
1006*6236dae4SAndroid Build Coastguard Worker
1007*6236dae4SAndroid Build Coastguard Worker return err;
1008*6236dae4SAndroid Build Coastguard Worker }
1009*6236dae4SAndroid Build Coastguard Worker
findlongopt(const char * opt)1010*6236dae4SAndroid Build Coastguard Worker const struct LongShort *findlongopt(const char *opt)
1011*6236dae4SAndroid Build Coastguard Worker {
1012*6236dae4SAndroid Build Coastguard Worker struct LongShort key;
1013*6236dae4SAndroid Build Coastguard Worker key.lname = opt;
1014*6236dae4SAndroid Build Coastguard Worker
1015*6236dae4SAndroid Build Coastguard Worker return bsearch(&key, aliases, sizeof(aliases)/sizeof(aliases[0]),
1016*6236dae4SAndroid Build Coastguard Worker sizeof(aliases[0]), findarg);
1017*6236dae4SAndroid Build Coastguard Worker }
1018*6236dae4SAndroid Build Coastguard Worker
1019*6236dae4SAndroid Build Coastguard Worker
getparameter(const char * flag,char * nextarg,argv_item_t cleararg,bool * usedarg,struct GlobalConfig * global,struct OperationConfig * config)1020*6236dae4SAndroid Build Coastguard Worker ParameterError getparameter(const char *flag, /* f or -long-flag */
1021*6236dae4SAndroid Build Coastguard Worker char *nextarg, /* NULL if unset */
1022*6236dae4SAndroid Build Coastguard Worker argv_item_t cleararg,
1023*6236dae4SAndroid Build Coastguard Worker bool *usedarg, /* set to TRUE if the arg
1024*6236dae4SAndroid Build Coastguard Worker has been used */
1025*6236dae4SAndroid Build Coastguard Worker struct GlobalConfig *global,
1026*6236dae4SAndroid Build Coastguard Worker struct OperationConfig *config)
1027*6236dae4SAndroid Build Coastguard Worker {
1028*6236dae4SAndroid Build Coastguard Worker int rc;
1029*6236dae4SAndroid Build Coastguard Worker const char *parse = NULL;
1030*6236dae4SAndroid Build Coastguard Worker bool longopt = FALSE;
1031*6236dae4SAndroid Build Coastguard Worker bool singleopt = FALSE; /* when true means '-o foo' used '-ofoo' */
1032*6236dae4SAndroid Build Coastguard Worker size_t nopts = 0; /* options processed in `flag`*/
1033*6236dae4SAndroid Build Coastguard Worker ParameterError err = PARAM_OK;
1034*6236dae4SAndroid Build Coastguard Worker bool toggle = TRUE; /* how to switch boolean options, on or off. Controlled
1035*6236dae4SAndroid Build Coastguard Worker by using --OPTION or --no-OPTION */
1036*6236dae4SAndroid Build Coastguard Worker bool nextalloc = FALSE; /* if nextarg is allocated */
1037*6236dae4SAndroid Build Coastguard Worker struct getout *url;
1038*6236dae4SAndroid Build Coastguard Worker static const char *redir_protos[] = {
1039*6236dae4SAndroid Build Coastguard Worker "http",
1040*6236dae4SAndroid Build Coastguard Worker "https",
1041*6236dae4SAndroid Build Coastguard Worker "ftp",
1042*6236dae4SAndroid Build Coastguard Worker "ftps",
1043*6236dae4SAndroid Build Coastguard Worker NULL
1044*6236dae4SAndroid Build Coastguard Worker };
1045*6236dae4SAndroid Build Coastguard Worker const struct LongShort *a = NULL;
1046*6236dae4SAndroid Build Coastguard Worker curl_off_t value;
1047*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_WRITABLE_ARGV
1048*6236dae4SAndroid Build Coastguard Worker argv_item_t clearthis = NULL;
1049*6236dae4SAndroid Build Coastguard Worker #else
1050*6236dae4SAndroid Build Coastguard Worker (void)cleararg;
1051*6236dae4SAndroid Build Coastguard Worker #endif
1052*6236dae4SAndroid Build Coastguard Worker
1053*6236dae4SAndroid Build Coastguard Worker *usedarg = FALSE; /* default is that we do not use the arg */
1054*6236dae4SAndroid Build Coastguard Worker
1055*6236dae4SAndroid Build Coastguard Worker if(('-' != flag[0]) || ('-' == flag[1])) {
1056*6236dae4SAndroid Build Coastguard Worker /* this should be a long name */
1057*6236dae4SAndroid Build Coastguard Worker const char *word = ('-' == flag[0]) ? flag + 2 : flag;
1058*6236dae4SAndroid Build Coastguard Worker bool noflagged = FALSE;
1059*6236dae4SAndroid Build Coastguard Worker bool expand = FALSE;
1060*6236dae4SAndroid Build Coastguard Worker
1061*6236dae4SAndroid Build Coastguard Worker if(!strncmp(word, "no-", 3)) {
1062*6236dae4SAndroid Build Coastguard Worker /* disable this option but ignore the "no-" part when looking for it */
1063*6236dae4SAndroid Build Coastguard Worker word += 3;
1064*6236dae4SAndroid Build Coastguard Worker toggle = FALSE;
1065*6236dae4SAndroid Build Coastguard Worker noflagged = TRUE;
1066*6236dae4SAndroid Build Coastguard Worker }
1067*6236dae4SAndroid Build Coastguard Worker else if(!strncmp(word, "expand-", 7)) {
1068*6236dae4SAndroid Build Coastguard Worker /* variable expansions is to be done on the argument */
1069*6236dae4SAndroid Build Coastguard Worker word += 7;
1070*6236dae4SAndroid Build Coastguard Worker expand = TRUE;
1071*6236dae4SAndroid Build Coastguard Worker }
1072*6236dae4SAndroid Build Coastguard Worker
1073*6236dae4SAndroid Build Coastguard Worker a = findlongopt(word);
1074*6236dae4SAndroid Build Coastguard Worker if(a) {
1075*6236dae4SAndroid Build Coastguard Worker longopt = TRUE;
1076*6236dae4SAndroid Build Coastguard Worker }
1077*6236dae4SAndroid Build Coastguard Worker else {
1078*6236dae4SAndroid Build Coastguard Worker err = PARAM_OPTION_UNKNOWN;
1079*6236dae4SAndroid Build Coastguard Worker goto error;
1080*6236dae4SAndroid Build Coastguard Worker }
1081*6236dae4SAndroid Build Coastguard Worker if(noflagged && (ARGTYPE(a->desc) != ARG_BOOL)) {
1082*6236dae4SAndroid Build Coastguard Worker /* --no- prefixed an option that is not boolean! */
1083*6236dae4SAndroid Build Coastguard Worker err = PARAM_NO_NOT_BOOLEAN;
1084*6236dae4SAndroid Build Coastguard Worker goto error;
1085*6236dae4SAndroid Build Coastguard Worker }
1086*6236dae4SAndroid Build Coastguard Worker else if(expand && nextarg) {
1087*6236dae4SAndroid Build Coastguard Worker struct curlx_dynbuf nbuf;
1088*6236dae4SAndroid Build Coastguard Worker bool replaced;
1089*6236dae4SAndroid Build Coastguard Worker
1090*6236dae4SAndroid Build Coastguard Worker if((ARGTYPE(a->desc) != ARG_STRG) &&
1091*6236dae4SAndroid Build Coastguard Worker (ARGTYPE(a->desc) != ARG_FILE)) {
1092*6236dae4SAndroid Build Coastguard Worker /* --expand on an option that is not a string or a filename */
1093*6236dae4SAndroid Build Coastguard Worker err = PARAM_EXPAND_ERROR;
1094*6236dae4SAndroid Build Coastguard Worker goto error;
1095*6236dae4SAndroid Build Coastguard Worker }
1096*6236dae4SAndroid Build Coastguard Worker err = varexpand(global, nextarg, &nbuf, &replaced);
1097*6236dae4SAndroid Build Coastguard Worker if(err) {
1098*6236dae4SAndroid Build Coastguard Worker curlx_dyn_free(&nbuf);
1099*6236dae4SAndroid Build Coastguard Worker goto error;
1100*6236dae4SAndroid Build Coastguard Worker }
1101*6236dae4SAndroid Build Coastguard Worker if(replaced) {
1102*6236dae4SAndroid Build Coastguard Worker nextarg = curlx_dyn_ptr(&nbuf);
1103*6236dae4SAndroid Build Coastguard Worker nextalloc = TRUE;
1104*6236dae4SAndroid Build Coastguard Worker }
1105*6236dae4SAndroid Build Coastguard Worker }
1106*6236dae4SAndroid Build Coastguard Worker }
1107*6236dae4SAndroid Build Coastguard Worker else {
1108*6236dae4SAndroid Build Coastguard Worker flag++; /* prefixed with one dash, pass it */
1109*6236dae4SAndroid Build Coastguard Worker parse = flag;
1110*6236dae4SAndroid Build Coastguard Worker }
1111*6236dae4SAndroid Build Coastguard Worker
1112*6236dae4SAndroid Build Coastguard Worker do {
1113*6236dae4SAndroid Build Coastguard Worker /* we can loop here if we have multiple single-letters */
1114*6236dae4SAndroid Build Coastguard Worker char letter;
1115*6236dae4SAndroid Build Coastguard Worker cmdline_t cmd;
1116*6236dae4SAndroid Build Coastguard Worker
1117*6236dae4SAndroid Build Coastguard Worker if(!longopt && !a) {
1118*6236dae4SAndroid Build Coastguard Worker a = findshortopt(*parse);
1119*6236dae4SAndroid Build Coastguard Worker if(!a) {
1120*6236dae4SAndroid Build Coastguard Worker err = PARAM_OPTION_UNKNOWN;
1121*6236dae4SAndroid Build Coastguard Worker break;
1122*6236dae4SAndroid Build Coastguard Worker }
1123*6236dae4SAndroid Build Coastguard Worker }
1124*6236dae4SAndroid Build Coastguard Worker letter = a->letter;
1125*6236dae4SAndroid Build Coastguard Worker cmd = (cmdline_t)a->cmd;
1126*6236dae4SAndroid Build Coastguard Worker if(ARGTYPE(a->desc) >= ARG_STRG) {
1127*6236dae4SAndroid Build Coastguard Worker /* this option requires an extra parameter */
1128*6236dae4SAndroid Build Coastguard Worker if(!longopt && parse[1]) {
1129*6236dae4SAndroid Build Coastguard Worker nextarg = (char *)&parse[1]; /* this is the actual extra parameter */
1130*6236dae4SAndroid Build Coastguard Worker singleopt = TRUE; /* do not loop anymore after this */
1131*6236dae4SAndroid Build Coastguard Worker }
1132*6236dae4SAndroid Build Coastguard Worker else if(!nextarg) {
1133*6236dae4SAndroid Build Coastguard Worker err = PARAM_REQUIRES_PARAMETER;
1134*6236dae4SAndroid Build Coastguard Worker break;
1135*6236dae4SAndroid Build Coastguard Worker }
1136*6236dae4SAndroid Build Coastguard Worker else {
1137*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_WRITABLE_ARGV
1138*6236dae4SAndroid Build Coastguard Worker clearthis = cleararg;
1139*6236dae4SAndroid Build Coastguard Worker #endif
1140*6236dae4SAndroid Build Coastguard Worker *usedarg = TRUE; /* mark it as used */
1141*6236dae4SAndroid Build Coastguard Worker }
1142*6236dae4SAndroid Build Coastguard Worker
1143*6236dae4SAndroid Build Coastguard Worker if((ARGTYPE(a->desc) == ARG_FILE) &&
1144*6236dae4SAndroid Build Coastguard Worker (nextarg[0] == '-') && nextarg[1]) {
1145*6236dae4SAndroid Build Coastguard Worker /* if the filename looks like a command line option */
1146*6236dae4SAndroid Build Coastguard Worker warnf(global, "The filename argument '%s' looks like a flag.",
1147*6236dae4SAndroid Build Coastguard Worker nextarg);
1148*6236dae4SAndroid Build Coastguard Worker }
1149*6236dae4SAndroid Build Coastguard Worker else if(!strncmp("\xe2\x80\x9c", nextarg, 3)) {
1150*6236dae4SAndroid Build Coastguard Worker warnf(global, "The argument '%s' starts with a Unicode quote where "
1151*6236dae4SAndroid Build Coastguard Worker "maybe an ASCII \" was intended?",
1152*6236dae4SAndroid Build Coastguard Worker nextarg);
1153*6236dae4SAndroid Build Coastguard Worker }
1154*6236dae4SAndroid Build Coastguard Worker }
1155*6236dae4SAndroid Build Coastguard Worker else if((ARGTYPE(a->desc) == ARG_NONE) && !toggle) {
1156*6236dae4SAndroid Build Coastguard Worker err = PARAM_NO_PREFIX;
1157*6236dae4SAndroid Build Coastguard Worker break;
1158*6236dae4SAndroid Build Coastguard Worker }
1159*6236dae4SAndroid Build Coastguard Worker
1160*6236dae4SAndroid Build Coastguard Worker if(!nextarg)
1161*6236dae4SAndroid Build Coastguard Worker /* this is a precaution mostly to please scan-build, as all arguments
1162*6236dae4SAndroid Build Coastguard Worker that use nextarg should be marked as such and they will check that
1163*6236dae4SAndroid Build Coastguard Worker nextarg is set before continuing, but code analyzers are not always
1164*6236dae4SAndroid Build Coastguard Worker that aware of that state */
1165*6236dae4SAndroid Build Coastguard Worker nextarg = (char *)"";
1166*6236dae4SAndroid Build Coastguard Worker
1167*6236dae4SAndroid Build Coastguard Worker switch(cmd) {
1168*6236dae4SAndroid Build Coastguard Worker case C_RANDOM_FILE: /* --random-file */
1169*6236dae4SAndroid Build Coastguard Worker case C_EGD_FILE: /* --egd-file */
1170*6236dae4SAndroid Build Coastguard Worker case C_NTLM_WB: /* --ntlm-wb */
1171*6236dae4SAndroid Build Coastguard Worker warnf(global, "--%s is deprecated and has no function anymore",
1172*6236dae4SAndroid Build Coastguard Worker a->lname);
1173*6236dae4SAndroid Build Coastguard Worker break;
1174*6236dae4SAndroid Build Coastguard Worker case C_DNS_IPV4_ADDR: /* --dns-ipv4-addr */
1175*6236dae4SAndroid Build Coastguard Worker if(!curlinfo->ares_num) /* c-ares is needed for this */
1176*6236dae4SAndroid Build Coastguard Worker err = PARAM_LIBCURL_DOESNT_SUPPORT;
1177*6236dae4SAndroid Build Coastguard Worker else
1178*6236dae4SAndroid Build Coastguard Worker /* addr in dot notation */
1179*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->dns_ipv4_addr, nextarg, DENY_BLANK);
1180*6236dae4SAndroid Build Coastguard Worker break;
1181*6236dae4SAndroid Build Coastguard Worker case C_DNS_IPV6_ADDR: /* --dns-ipv6-addr */
1182*6236dae4SAndroid Build Coastguard Worker if(!curlinfo->ares_num) /* c-ares is needed for this */
1183*6236dae4SAndroid Build Coastguard Worker err = PARAM_LIBCURL_DOESNT_SUPPORT;
1184*6236dae4SAndroid Build Coastguard Worker else
1185*6236dae4SAndroid Build Coastguard Worker /* addr in dot notation */
1186*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->dns_ipv6_addr, nextarg, DENY_BLANK);
1187*6236dae4SAndroid Build Coastguard Worker break;
1188*6236dae4SAndroid Build Coastguard Worker case C_OAUTH2_BEARER: /* --oauth2-bearer */
1189*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->oauth_bearer, nextarg, DENY_BLANK);
1190*6236dae4SAndroid Build Coastguard Worker if(!err) {
1191*6236dae4SAndroid Build Coastguard Worker cleanarg(clearthis);
1192*6236dae4SAndroid Build Coastguard Worker config->authtype |= CURLAUTH_BEARER;
1193*6236dae4SAndroid Build Coastguard Worker }
1194*6236dae4SAndroid Build Coastguard Worker break;
1195*6236dae4SAndroid Build Coastguard Worker case C_CONNECT_TIMEOUT: /* --connect-timeout */
1196*6236dae4SAndroid Build Coastguard Worker err = secs2ms(&config->connecttimeout_ms, nextarg);
1197*6236dae4SAndroid Build Coastguard Worker break;
1198*6236dae4SAndroid Build Coastguard Worker case C_DOH_URL: /* --doh-url */
1199*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->doh_url, nextarg, ALLOW_BLANK);
1200*6236dae4SAndroid Build Coastguard Worker if(!err && config->doh_url && !config->doh_url[0])
1201*6236dae4SAndroid Build Coastguard Worker /* if given a blank string, make it NULL again */
1202*6236dae4SAndroid Build Coastguard Worker Curl_safefree(config->doh_url);
1203*6236dae4SAndroid Build Coastguard Worker break;
1204*6236dae4SAndroid Build Coastguard Worker case C_CIPHERS: /* -- ciphers */
1205*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->cipher_list, nextarg, DENY_BLANK);
1206*6236dae4SAndroid Build Coastguard Worker break;
1207*6236dae4SAndroid Build Coastguard Worker case C_DNS_INTERFACE: /* --dns-interface */
1208*6236dae4SAndroid Build Coastguard Worker if(!curlinfo->ares_num) /* c-ares is needed for this */
1209*6236dae4SAndroid Build Coastguard Worker err = PARAM_LIBCURL_DOESNT_SUPPORT;
1210*6236dae4SAndroid Build Coastguard Worker else
1211*6236dae4SAndroid Build Coastguard Worker /* interface name */
1212*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->dns_interface, nextarg, DENY_BLANK);
1213*6236dae4SAndroid Build Coastguard Worker break;
1214*6236dae4SAndroid Build Coastguard Worker case C_DISABLE_EPSV: /* --disable-epsv */
1215*6236dae4SAndroid Build Coastguard Worker config->disable_epsv = toggle;
1216*6236dae4SAndroid Build Coastguard Worker break;
1217*6236dae4SAndroid Build Coastguard Worker case C_DISALLOW_USERNAME_IN_URL: /* --disallow-username-in-url */
1218*6236dae4SAndroid Build Coastguard Worker config->disallow_username_in_url = toggle;
1219*6236dae4SAndroid Build Coastguard Worker break;
1220*6236dae4SAndroid Build Coastguard Worker case C_EPSV: /* --epsv */
1221*6236dae4SAndroid Build Coastguard Worker config->disable_epsv = !toggle;
1222*6236dae4SAndroid Build Coastguard Worker break;
1223*6236dae4SAndroid Build Coastguard Worker case C_DNS_SERVERS: /* --dns-servers */
1224*6236dae4SAndroid Build Coastguard Worker if(!curlinfo->ares_num) /* c-ares is needed for this */
1225*6236dae4SAndroid Build Coastguard Worker err = PARAM_LIBCURL_DOESNT_SUPPORT;
1226*6236dae4SAndroid Build Coastguard Worker else
1227*6236dae4SAndroid Build Coastguard Worker /* IP addrs of DNS servers */
1228*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->dns_servers, nextarg, DENY_BLANK);
1229*6236dae4SAndroid Build Coastguard Worker break;
1230*6236dae4SAndroid Build Coastguard Worker case C_TRACE: /* --trace */
1231*6236dae4SAndroid Build Coastguard Worker err = getstr(&global->trace_dump, nextarg, DENY_BLANK);
1232*6236dae4SAndroid Build Coastguard Worker if(!err) {
1233*6236dae4SAndroid Build Coastguard Worker if(global->tracetype && (global->tracetype != TRACE_BIN))
1234*6236dae4SAndroid Build Coastguard Worker warnf(global, "--trace overrides an earlier trace/verbose option");
1235*6236dae4SAndroid Build Coastguard Worker global->tracetype = TRACE_BIN;
1236*6236dae4SAndroid Build Coastguard Worker }
1237*6236dae4SAndroid Build Coastguard Worker break;
1238*6236dae4SAndroid Build Coastguard Worker case C_NPN: /* --npn */
1239*6236dae4SAndroid Build Coastguard Worker warnf(global, "--npn is no longer supported");
1240*6236dae4SAndroid Build Coastguard Worker break;
1241*6236dae4SAndroid Build Coastguard Worker case C_TRACE_ASCII: /* --trace-ascii */
1242*6236dae4SAndroid Build Coastguard Worker err = getstr(&global->trace_dump, nextarg, DENY_BLANK);
1243*6236dae4SAndroid Build Coastguard Worker if(!err) {
1244*6236dae4SAndroid Build Coastguard Worker if(global->tracetype && (global->tracetype != TRACE_ASCII))
1245*6236dae4SAndroid Build Coastguard Worker warnf(global,
1246*6236dae4SAndroid Build Coastguard Worker "--trace-ascii overrides an earlier trace/verbose option");
1247*6236dae4SAndroid Build Coastguard Worker global->tracetype = TRACE_ASCII;
1248*6236dae4SAndroid Build Coastguard Worker }
1249*6236dae4SAndroid Build Coastguard Worker break;
1250*6236dae4SAndroid Build Coastguard Worker case C_ALPN: /* --alpn */
1251*6236dae4SAndroid Build Coastguard Worker config->noalpn = !toggle;
1252*6236dae4SAndroid Build Coastguard Worker break;
1253*6236dae4SAndroid Build Coastguard Worker case C_LIMIT_RATE: /* --limit-rate */
1254*6236dae4SAndroid Build Coastguard Worker err = GetSizeParameter(global, nextarg, "rate", &value);
1255*6236dae4SAndroid Build Coastguard Worker if(!err) {
1256*6236dae4SAndroid Build Coastguard Worker config->recvpersecond = value;
1257*6236dae4SAndroid Build Coastguard Worker config->sendpersecond = value;
1258*6236dae4SAndroid Build Coastguard Worker }
1259*6236dae4SAndroid Build Coastguard Worker break;
1260*6236dae4SAndroid Build Coastguard Worker case C_RATE:
1261*6236dae4SAndroid Build Coastguard Worker err = set_rate(global, nextarg);
1262*6236dae4SAndroid Build Coastguard Worker break;
1263*6236dae4SAndroid Build Coastguard Worker case C_COMPRESSED: /* --compressed */
1264*6236dae4SAndroid Build Coastguard Worker if(toggle && !(feature_libz || feature_brotli || feature_zstd))
1265*6236dae4SAndroid Build Coastguard Worker err = PARAM_LIBCURL_DOESNT_SUPPORT;
1266*6236dae4SAndroid Build Coastguard Worker else
1267*6236dae4SAndroid Build Coastguard Worker config->encoding = toggle;
1268*6236dae4SAndroid Build Coastguard Worker break;
1269*6236dae4SAndroid Build Coastguard Worker case C_TR_ENCODING: /* --tr-encoding */
1270*6236dae4SAndroid Build Coastguard Worker config->tr_encoding = toggle;
1271*6236dae4SAndroid Build Coastguard Worker break;
1272*6236dae4SAndroid Build Coastguard Worker case C_DIGEST: /* --digest */
1273*6236dae4SAndroid Build Coastguard Worker if(toggle)
1274*6236dae4SAndroid Build Coastguard Worker config->authtype |= CURLAUTH_DIGEST;
1275*6236dae4SAndroid Build Coastguard Worker else
1276*6236dae4SAndroid Build Coastguard Worker config->authtype &= ~CURLAUTH_DIGEST;
1277*6236dae4SAndroid Build Coastguard Worker break;
1278*6236dae4SAndroid Build Coastguard Worker case C_NEGOTIATE: /* --negotiate */
1279*6236dae4SAndroid Build Coastguard Worker if(!toggle)
1280*6236dae4SAndroid Build Coastguard Worker config->authtype &= ~CURLAUTH_NEGOTIATE;
1281*6236dae4SAndroid Build Coastguard Worker else if(feature_spnego)
1282*6236dae4SAndroid Build Coastguard Worker config->authtype |= CURLAUTH_NEGOTIATE;
1283*6236dae4SAndroid Build Coastguard Worker else
1284*6236dae4SAndroid Build Coastguard Worker err = PARAM_LIBCURL_DOESNT_SUPPORT;
1285*6236dae4SAndroid Build Coastguard Worker break;
1286*6236dae4SAndroid Build Coastguard Worker case C_NTLM: /* --ntlm */
1287*6236dae4SAndroid Build Coastguard Worker if(!toggle)
1288*6236dae4SAndroid Build Coastguard Worker config->authtype &= ~CURLAUTH_NTLM;
1289*6236dae4SAndroid Build Coastguard Worker else if(feature_ntlm)
1290*6236dae4SAndroid Build Coastguard Worker config->authtype |= CURLAUTH_NTLM;
1291*6236dae4SAndroid Build Coastguard Worker else
1292*6236dae4SAndroid Build Coastguard Worker err = PARAM_LIBCURL_DOESNT_SUPPORT;
1293*6236dae4SAndroid Build Coastguard Worker break;
1294*6236dae4SAndroid Build Coastguard Worker case C_BASIC: /* --basic */
1295*6236dae4SAndroid Build Coastguard Worker if(toggle)
1296*6236dae4SAndroid Build Coastguard Worker config->authtype |= CURLAUTH_BASIC;
1297*6236dae4SAndroid Build Coastguard Worker else
1298*6236dae4SAndroid Build Coastguard Worker config->authtype &= ~CURLAUTH_BASIC;
1299*6236dae4SAndroid Build Coastguard Worker break;
1300*6236dae4SAndroid Build Coastguard Worker case C_ANYAUTH: /* --anyauth */
1301*6236dae4SAndroid Build Coastguard Worker if(toggle)
1302*6236dae4SAndroid Build Coastguard Worker config->authtype = CURLAUTH_ANY;
1303*6236dae4SAndroid Build Coastguard Worker /* --no-anyauth simply does not touch it */
1304*6236dae4SAndroid Build Coastguard Worker break;
1305*6236dae4SAndroid Build Coastguard Worker #ifdef USE_WATT32
1306*6236dae4SAndroid Build Coastguard Worker case C_WDEBUG: /* --wdebug */
1307*6236dae4SAndroid Build Coastguard Worker dbug_init();
1308*6236dae4SAndroid Build Coastguard Worker break;
1309*6236dae4SAndroid Build Coastguard Worker #endif
1310*6236dae4SAndroid Build Coastguard Worker case C_FTP_CREATE_DIRS: /* --ftp-create-dirs */
1311*6236dae4SAndroid Build Coastguard Worker config->ftp_create_dirs = toggle;
1312*6236dae4SAndroid Build Coastguard Worker break;
1313*6236dae4SAndroid Build Coastguard Worker case C_CREATE_DIRS: /* --create-dirs */
1314*6236dae4SAndroid Build Coastguard Worker config->create_dirs = toggle;
1315*6236dae4SAndroid Build Coastguard Worker break;
1316*6236dae4SAndroid Build Coastguard Worker case C_CREATE_FILE_MODE: /* --create-file-mode */
1317*6236dae4SAndroid Build Coastguard Worker err = oct2nummax(&config->create_file_mode, nextarg, 0777);
1318*6236dae4SAndroid Build Coastguard Worker break;
1319*6236dae4SAndroid Build Coastguard Worker case C_MAX_REDIRS: /* --max-redirs */
1320*6236dae4SAndroid Build Coastguard Worker /* specified max no of redirects (http(s)), this accepts -1 as a
1321*6236dae4SAndroid Build Coastguard Worker special condition */
1322*6236dae4SAndroid Build Coastguard Worker err = str2num(&config->maxredirs, nextarg);
1323*6236dae4SAndroid Build Coastguard Worker if(!err && (config->maxredirs < -1))
1324*6236dae4SAndroid Build Coastguard Worker err = PARAM_BAD_NUMERIC;
1325*6236dae4SAndroid Build Coastguard Worker break;
1326*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_IPFS
1327*6236dae4SAndroid Build Coastguard Worker case C_IPFS_GATEWAY: /* --ipfs-gateway */
1328*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->ipfs_gateway, nextarg, DENY_BLANK);
1329*6236dae4SAndroid Build Coastguard Worker break;
1330*6236dae4SAndroid Build Coastguard Worker #endif /* !CURL_DISABLE_IPFS */
1331*6236dae4SAndroid Build Coastguard Worker case C_PROXY_NTLM: /* --proxy-ntlm */
1332*6236dae4SAndroid Build Coastguard Worker if(!feature_ntlm)
1333*6236dae4SAndroid Build Coastguard Worker err = PARAM_LIBCURL_DOESNT_SUPPORT;
1334*6236dae4SAndroid Build Coastguard Worker else
1335*6236dae4SAndroid Build Coastguard Worker config->proxyntlm = toggle;
1336*6236dae4SAndroid Build Coastguard Worker break;
1337*6236dae4SAndroid Build Coastguard Worker case C_CRLF: /* --crlf */
1338*6236dae4SAndroid Build Coastguard Worker /* LF -> CRLF conversion? */
1339*6236dae4SAndroid Build Coastguard Worker config->crlf = toggle;
1340*6236dae4SAndroid Build Coastguard Worker break;
1341*6236dae4SAndroid Build Coastguard Worker case C_AWS_SIGV4: /* --aws-sigv4 */
1342*6236dae4SAndroid Build Coastguard Worker config->authtype |= CURLAUTH_AWS_SIGV4;
1343*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->aws_sigv4, nextarg, DENY_BLANK);
1344*6236dae4SAndroid Build Coastguard Worker break;
1345*6236dae4SAndroid Build Coastguard Worker case C_STDERR: /* --stderr */
1346*6236dae4SAndroid Build Coastguard Worker tool_set_stderr_file(global, nextarg);
1347*6236dae4SAndroid Build Coastguard Worker break;
1348*6236dae4SAndroid Build Coastguard Worker case C_INTERFACE: /* --interface */
1349*6236dae4SAndroid Build Coastguard Worker /* interface */
1350*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->iface, nextarg, DENY_BLANK);
1351*6236dae4SAndroid Build Coastguard Worker break;
1352*6236dae4SAndroid Build Coastguard Worker case C_KRB: /* --krb */
1353*6236dae4SAndroid Build Coastguard Worker /* kerberos level string */
1354*6236dae4SAndroid Build Coastguard Worker if(!feature_spnego)
1355*6236dae4SAndroid Build Coastguard Worker err = PARAM_LIBCURL_DOESNT_SUPPORT;
1356*6236dae4SAndroid Build Coastguard Worker else
1357*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->krblevel, nextarg, DENY_BLANK);
1358*6236dae4SAndroid Build Coastguard Worker break;
1359*6236dae4SAndroid Build Coastguard Worker case C_HAPROXY_PROTOCOL: /* --haproxy-protocol */
1360*6236dae4SAndroid Build Coastguard Worker config->haproxy_protocol = toggle;
1361*6236dae4SAndroid Build Coastguard Worker break;
1362*6236dae4SAndroid Build Coastguard Worker case C_HAPROXY_CLIENTIP: /* --haproxy-clientip */
1363*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->haproxy_clientip, nextarg, DENY_BLANK);
1364*6236dae4SAndroid Build Coastguard Worker break;
1365*6236dae4SAndroid Build Coastguard Worker case C_MAX_FILESIZE: /* --max-filesize */
1366*6236dae4SAndroid Build Coastguard Worker err = GetSizeParameter(global, nextarg, "max-filesize", &value);
1367*6236dae4SAndroid Build Coastguard Worker if(!err)
1368*6236dae4SAndroid Build Coastguard Worker config->max_filesize = value;
1369*6236dae4SAndroid Build Coastguard Worker break;
1370*6236dae4SAndroid Build Coastguard Worker case C_DISABLE_EPRT: /* --disable-eprt */
1371*6236dae4SAndroid Build Coastguard Worker config->disable_eprt = toggle;
1372*6236dae4SAndroid Build Coastguard Worker break;
1373*6236dae4SAndroid Build Coastguard Worker case C_EPRT: /* --eprt */
1374*6236dae4SAndroid Build Coastguard Worker config->disable_eprt = !toggle;
1375*6236dae4SAndroid Build Coastguard Worker break;
1376*6236dae4SAndroid Build Coastguard Worker case C_XATTR: /* --xattr */
1377*6236dae4SAndroid Build Coastguard Worker config->xattr = toggle;
1378*6236dae4SAndroid Build Coastguard Worker break;
1379*6236dae4SAndroid Build Coastguard Worker case C_URL: /* --url */
1380*6236dae4SAndroid Build Coastguard Worker if(!config->url_get)
1381*6236dae4SAndroid Build Coastguard Worker config->url_get = config->url_list;
1382*6236dae4SAndroid Build Coastguard Worker
1383*6236dae4SAndroid Build Coastguard Worker if(config->url_get) {
1384*6236dae4SAndroid Build Coastguard Worker /* there is a node here, if it already is filled-in continue to find
1385*6236dae4SAndroid Build Coastguard Worker an "empty" node */
1386*6236dae4SAndroid Build Coastguard Worker while(config->url_get && (config->url_get->flags & GETOUT_URL))
1387*6236dae4SAndroid Build Coastguard Worker config->url_get = config->url_get->next;
1388*6236dae4SAndroid Build Coastguard Worker }
1389*6236dae4SAndroid Build Coastguard Worker
1390*6236dae4SAndroid Build Coastguard Worker /* now there might or might not be an available node to fill in! */
1391*6236dae4SAndroid Build Coastguard Worker
1392*6236dae4SAndroid Build Coastguard Worker if(config->url_get)
1393*6236dae4SAndroid Build Coastguard Worker /* existing node */
1394*6236dae4SAndroid Build Coastguard Worker url = config->url_get;
1395*6236dae4SAndroid Build Coastguard Worker else
1396*6236dae4SAndroid Build Coastguard Worker /* there was no free node, create one! */
1397*6236dae4SAndroid Build Coastguard Worker config->url_get = url = new_getout(config);
1398*6236dae4SAndroid Build Coastguard Worker
1399*6236dae4SAndroid Build Coastguard Worker if(!url)
1400*6236dae4SAndroid Build Coastguard Worker err = PARAM_NO_MEM;
1401*6236dae4SAndroid Build Coastguard Worker else {
1402*6236dae4SAndroid Build Coastguard Worker /* fill in the URL */
1403*6236dae4SAndroid Build Coastguard Worker err = getstr(&url->url, nextarg, DENY_BLANK);
1404*6236dae4SAndroid Build Coastguard Worker url->flags |= GETOUT_URL;
1405*6236dae4SAndroid Build Coastguard Worker }
1406*6236dae4SAndroid Build Coastguard Worker break;
1407*6236dae4SAndroid Build Coastguard Worker case C_FTP_SSL: /* --ftp-ssl */
1408*6236dae4SAndroid Build Coastguard Worker case C_SSL: /* --ssl */
1409*6236dae4SAndroid Build Coastguard Worker if(toggle && !feature_ssl)
1410*6236dae4SAndroid Build Coastguard Worker err = PARAM_LIBCURL_DOESNT_SUPPORT;
1411*6236dae4SAndroid Build Coastguard Worker else {
1412*6236dae4SAndroid Build Coastguard Worker config->ftp_ssl = toggle;
1413*6236dae4SAndroid Build Coastguard Worker if(config->ftp_ssl)
1414*6236dae4SAndroid Build Coastguard Worker warnf(global,
1415*6236dae4SAndroid Build Coastguard Worker "--%s is an insecure option, consider --ssl-reqd instead",
1416*6236dae4SAndroid Build Coastguard Worker a->lname);
1417*6236dae4SAndroid Build Coastguard Worker }
1418*6236dae4SAndroid Build Coastguard Worker break;
1419*6236dae4SAndroid Build Coastguard Worker case C_FTP_PASV: /* --ftp-pasv */
1420*6236dae4SAndroid Build Coastguard Worker Curl_safefree(config->ftpport);
1421*6236dae4SAndroid Build Coastguard Worker break;
1422*6236dae4SAndroid Build Coastguard Worker case C_SOCKS5: /* --socks5 */
1423*6236dae4SAndroid Build Coastguard Worker /* socks5 proxy to use, and resolves the name locally and passes on the
1424*6236dae4SAndroid Build Coastguard Worker resolved address */
1425*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->proxy, nextarg, DENY_BLANK);
1426*6236dae4SAndroid Build Coastguard Worker config->proxyver = CURLPROXY_SOCKS5;
1427*6236dae4SAndroid Build Coastguard Worker break;
1428*6236dae4SAndroid Build Coastguard Worker case C_SOCKS4: /* --socks4 */
1429*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->proxy, nextarg, DENY_BLANK);
1430*6236dae4SAndroid Build Coastguard Worker config->proxyver = CURLPROXY_SOCKS4;
1431*6236dae4SAndroid Build Coastguard Worker break;
1432*6236dae4SAndroid Build Coastguard Worker case C_SOCKS4A: /* --socks4a */
1433*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->proxy, nextarg, DENY_BLANK);
1434*6236dae4SAndroid Build Coastguard Worker config->proxyver = CURLPROXY_SOCKS4A;
1435*6236dae4SAndroid Build Coastguard Worker break;
1436*6236dae4SAndroid Build Coastguard Worker case C_SOCKS5_HOSTNAME: /* --socks5-hostname */
1437*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->proxy, nextarg, DENY_BLANK);
1438*6236dae4SAndroid Build Coastguard Worker config->proxyver = CURLPROXY_SOCKS5_HOSTNAME;
1439*6236dae4SAndroid Build Coastguard Worker break;
1440*6236dae4SAndroid Build Coastguard Worker case C_TCP_NODELAY: /* --tcp-nodelay */
1441*6236dae4SAndroid Build Coastguard Worker config->tcp_nodelay = toggle;
1442*6236dae4SAndroid Build Coastguard Worker break;
1443*6236dae4SAndroid Build Coastguard Worker case C_IP_TOS: { /* --ip-tos */
1444*6236dae4SAndroid Build Coastguard Worker struct TOSEntry find;
1445*6236dae4SAndroid Build Coastguard Worker const struct TOSEntry *entry;
1446*6236dae4SAndroid Build Coastguard Worker find.name = nextarg;
1447*6236dae4SAndroid Build Coastguard Worker entry = bsearch(&find, tos_entries,
1448*6236dae4SAndroid Build Coastguard Worker sizeof(tos_entries)/sizeof(*tos_entries),
1449*6236dae4SAndroid Build Coastguard Worker sizeof(*tos_entries), find_tos);
1450*6236dae4SAndroid Build Coastguard Worker if(entry)
1451*6236dae4SAndroid Build Coastguard Worker config->ip_tos = entry->value;
1452*6236dae4SAndroid Build Coastguard Worker else /* numeric tos value */
1453*6236dae4SAndroid Build Coastguard Worker err = str2unummax(&config->ip_tos, nextarg, 0xFF);
1454*6236dae4SAndroid Build Coastguard Worker break;
1455*6236dae4SAndroid Build Coastguard Worker }
1456*6236dae4SAndroid Build Coastguard Worker case C_VLAN_PRIORITY: /* --vlan-priority */
1457*6236dae4SAndroid Build Coastguard Worker err = str2unummax(&config->vlan_priority, nextarg, 7);
1458*6236dae4SAndroid Build Coastguard Worker break;
1459*6236dae4SAndroid Build Coastguard Worker case C_PROXY_DIGEST: /* --proxy-digest */
1460*6236dae4SAndroid Build Coastguard Worker config->proxydigest = toggle;
1461*6236dae4SAndroid Build Coastguard Worker break;
1462*6236dae4SAndroid Build Coastguard Worker case C_PROXY_BASIC: /* --proxy-basic */
1463*6236dae4SAndroid Build Coastguard Worker config->proxybasic = toggle;
1464*6236dae4SAndroid Build Coastguard Worker break;
1465*6236dae4SAndroid Build Coastguard Worker case C_RETRY: /* --retry */
1466*6236dae4SAndroid Build Coastguard Worker err = str2unum(&config->req_retry, nextarg);
1467*6236dae4SAndroid Build Coastguard Worker break;
1468*6236dae4SAndroid Build Coastguard Worker case C_RETRY_CONNREFUSED: /* --retry-connrefused */
1469*6236dae4SAndroid Build Coastguard Worker config->retry_connrefused = toggle;
1470*6236dae4SAndroid Build Coastguard Worker break;
1471*6236dae4SAndroid Build Coastguard Worker case C_RETRY_DELAY: /* --retry-delay */
1472*6236dae4SAndroid Build Coastguard Worker err = str2unummax(&config->retry_delay, nextarg, LONG_MAX/1000);
1473*6236dae4SAndroid Build Coastguard Worker break;
1474*6236dae4SAndroid Build Coastguard Worker case C_RETRY_MAX_TIME: /* --retry-max-time */
1475*6236dae4SAndroid Build Coastguard Worker err = str2unummax(&config->retry_maxtime, nextarg, LONG_MAX/1000);
1476*6236dae4SAndroid Build Coastguard Worker break;
1477*6236dae4SAndroid Build Coastguard Worker case C_RETRY_ALL_ERRORS: /* --retry-all-errors */
1478*6236dae4SAndroid Build Coastguard Worker config->retry_all_errors = toggle;
1479*6236dae4SAndroid Build Coastguard Worker break;
1480*6236dae4SAndroid Build Coastguard Worker case C_PROXY_NEGOTIATE: /* --proxy-negotiate */
1481*6236dae4SAndroid Build Coastguard Worker if(!feature_spnego)
1482*6236dae4SAndroid Build Coastguard Worker err = PARAM_LIBCURL_DOESNT_SUPPORT;
1483*6236dae4SAndroid Build Coastguard Worker else
1484*6236dae4SAndroid Build Coastguard Worker config->proxynegotiate = toggle;
1485*6236dae4SAndroid Build Coastguard Worker break;
1486*6236dae4SAndroid Build Coastguard Worker case C_FORM_ESCAPE: /* --form-escape */
1487*6236dae4SAndroid Build Coastguard Worker config->mime_options &= ~CURLMIMEOPT_FORMESCAPE;
1488*6236dae4SAndroid Build Coastguard Worker if(toggle)
1489*6236dae4SAndroid Build Coastguard Worker config->mime_options |= CURLMIMEOPT_FORMESCAPE;
1490*6236dae4SAndroid Build Coastguard Worker break;
1491*6236dae4SAndroid Build Coastguard Worker case C_FTP_ACCOUNT: /* --ftp-account */
1492*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->ftp_account, nextarg, DENY_BLANK);
1493*6236dae4SAndroid Build Coastguard Worker break;
1494*6236dae4SAndroid Build Coastguard Worker case C_PROXY_ANYAUTH: /* --proxy-anyauth */
1495*6236dae4SAndroid Build Coastguard Worker config->proxyanyauth = toggle;
1496*6236dae4SAndroid Build Coastguard Worker break;
1497*6236dae4SAndroid Build Coastguard Worker case C_TRACE_TIME: /* --trace-time */
1498*6236dae4SAndroid Build Coastguard Worker global->tracetime = toggle;
1499*6236dae4SAndroid Build Coastguard Worker break;
1500*6236dae4SAndroid Build Coastguard Worker case C_IGNORE_CONTENT_LENGTH: /* --ignore-content-length */
1501*6236dae4SAndroid Build Coastguard Worker config->ignorecl = toggle;
1502*6236dae4SAndroid Build Coastguard Worker break;
1503*6236dae4SAndroid Build Coastguard Worker case C_FTP_SKIP_PASV_IP: /* --ftp-skip-pasv-ip */
1504*6236dae4SAndroid Build Coastguard Worker config->ftp_skip_ip = toggle;
1505*6236dae4SAndroid Build Coastguard Worker break;
1506*6236dae4SAndroid Build Coastguard Worker case C_FTP_METHOD: /* --ftp-method */
1507*6236dae4SAndroid Build Coastguard Worker config->ftp_filemethod = ftpfilemethod(config, nextarg);
1508*6236dae4SAndroid Build Coastguard Worker break;
1509*6236dae4SAndroid Build Coastguard Worker case C_LOCAL_PORT: { /* --local-port */
1510*6236dae4SAndroid Build Coastguard Worker /* 16bit base 10 is 5 digits, but we allow 6 so that this catches
1511*6236dae4SAndroid Build Coastguard Worker overflows, not just truncates */
1512*6236dae4SAndroid Build Coastguard Worker char lrange[7]="";
1513*6236dae4SAndroid Build Coastguard Worker char *p = nextarg;
1514*6236dae4SAndroid Build Coastguard Worker while(ISDIGIT(*p))
1515*6236dae4SAndroid Build Coastguard Worker p++;
1516*6236dae4SAndroid Build Coastguard Worker if(*p) {
1517*6236dae4SAndroid Build Coastguard Worker /* if there is anything more than a plain decimal number */
1518*6236dae4SAndroid Build Coastguard Worker rc = sscanf(p, " - %6s", lrange);
1519*6236dae4SAndroid Build Coastguard Worker *p = 0; /* null-terminate to make str2unum() work below */
1520*6236dae4SAndroid Build Coastguard Worker }
1521*6236dae4SAndroid Build Coastguard Worker else
1522*6236dae4SAndroid Build Coastguard Worker rc = 0;
1523*6236dae4SAndroid Build Coastguard Worker
1524*6236dae4SAndroid Build Coastguard Worker err = str2unum(&config->localport, nextarg);
1525*6236dae4SAndroid Build Coastguard Worker if(err || (config->localport > 65535)) {
1526*6236dae4SAndroid Build Coastguard Worker err = PARAM_BAD_USE;
1527*6236dae4SAndroid Build Coastguard Worker break;
1528*6236dae4SAndroid Build Coastguard Worker }
1529*6236dae4SAndroid Build Coastguard Worker if(!rc)
1530*6236dae4SAndroid Build Coastguard Worker config->localportrange = 1; /* default number of ports to try */
1531*6236dae4SAndroid Build Coastguard Worker else {
1532*6236dae4SAndroid Build Coastguard Worker err = str2unum(&config->localportrange, lrange);
1533*6236dae4SAndroid Build Coastguard Worker if(err || (config->localportrange > 65535))
1534*6236dae4SAndroid Build Coastguard Worker err = PARAM_BAD_USE;
1535*6236dae4SAndroid Build Coastguard Worker else {
1536*6236dae4SAndroid Build Coastguard Worker config->localportrange -= (config->localport-1);
1537*6236dae4SAndroid Build Coastguard Worker if(config->localportrange < 1)
1538*6236dae4SAndroid Build Coastguard Worker err = PARAM_BAD_USE;
1539*6236dae4SAndroid Build Coastguard Worker }
1540*6236dae4SAndroid Build Coastguard Worker }
1541*6236dae4SAndroid Build Coastguard Worker break;
1542*6236dae4SAndroid Build Coastguard Worker }
1543*6236dae4SAndroid Build Coastguard Worker case C_FTP_ALTERNATIVE_TO_USER: /* --ftp-alternative-to-user */
1544*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->ftp_alternative_to_user, nextarg, DENY_BLANK);
1545*6236dae4SAndroid Build Coastguard Worker break;
1546*6236dae4SAndroid Build Coastguard Worker case C_FTP_SSL_REQD: /* --ftp-ssl-reqd */
1547*6236dae4SAndroid Build Coastguard Worker case C_SSL_REQD: /* --ssl-reqd */
1548*6236dae4SAndroid Build Coastguard Worker if(toggle && !feature_ssl) {
1549*6236dae4SAndroid Build Coastguard Worker err = PARAM_LIBCURL_DOESNT_SUPPORT;
1550*6236dae4SAndroid Build Coastguard Worker break;
1551*6236dae4SAndroid Build Coastguard Worker }
1552*6236dae4SAndroid Build Coastguard Worker config->ftp_ssl_reqd = toggle;
1553*6236dae4SAndroid Build Coastguard Worker break;
1554*6236dae4SAndroid Build Coastguard Worker case C_SESSIONID: /* --sessionid */
1555*6236dae4SAndroid Build Coastguard Worker config->disable_sessionid = !toggle;
1556*6236dae4SAndroid Build Coastguard Worker break;
1557*6236dae4SAndroid Build Coastguard Worker case C_FTP_SSL_CONTROL: /* --ftp-ssl-control */
1558*6236dae4SAndroid Build Coastguard Worker if(toggle && !feature_ssl)
1559*6236dae4SAndroid Build Coastguard Worker err = PARAM_LIBCURL_DOESNT_SUPPORT;
1560*6236dae4SAndroid Build Coastguard Worker else
1561*6236dae4SAndroid Build Coastguard Worker config->ftp_ssl_control = toggle;
1562*6236dae4SAndroid Build Coastguard Worker break;
1563*6236dae4SAndroid Build Coastguard Worker case C_FTP_SSL_CCC: /* --ftp-ssl-ccc */
1564*6236dae4SAndroid Build Coastguard Worker config->ftp_ssl_ccc = toggle;
1565*6236dae4SAndroid Build Coastguard Worker if(!config->ftp_ssl_ccc_mode)
1566*6236dae4SAndroid Build Coastguard Worker config->ftp_ssl_ccc_mode = CURLFTPSSL_CCC_PASSIVE;
1567*6236dae4SAndroid Build Coastguard Worker break;
1568*6236dae4SAndroid Build Coastguard Worker case C_FTP_SSL_CCC_MODE: /* --ftp-ssl-ccc-mode */
1569*6236dae4SAndroid Build Coastguard Worker config->ftp_ssl_ccc = TRUE;
1570*6236dae4SAndroid Build Coastguard Worker config->ftp_ssl_ccc_mode = ftpcccmethod(config, nextarg);
1571*6236dae4SAndroid Build Coastguard Worker break;
1572*6236dae4SAndroid Build Coastguard Worker case C_LIBCURL: /* --libcurl */
1573*6236dae4SAndroid Build Coastguard Worker #ifdef CURL_DISABLE_LIBCURL_OPTION
1574*6236dae4SAndroid Build Coastguard Worker warnf(global,
1575*6236dae4SAndroid Build Coastguard Worker "--libcurl option was disabled at build-time");
1576*6236dae4SAndroid Build Coastguard Worker err = PARAM_OPTION_UNKNOWN;
1577*6236dae4SAndroid Build Coastguard Worker #else
1578*6236dae4SAndroid Build Coastguard Worker err = getstr(&global->libcurl, nextarg, DENY_BLANK);
1579*6236dae4SAndroid Build Coastguard Worker #endif
1580*6236dae4SAndroid Build Coastguard Worker break;
1581*6236dae4SAndroid Build Coastguard Worker case C_RAW: /* --raw */
1582*6236dae4SAndroid Build Coastguard Worker config->raw = toggle;
1583*6236dae4SAndroid Build Coastguard Worker break;
1584*6236dae4SAndroid Build Coastguard Worker case C_KEEPALIVE: /* --keepalive */
1585*6236dae4SAndroid Build Coastguard Worker config->nokeepalive = !toggle;
1586*6236dae4SAndroid Build Coastguard Worker break;
1587*6236dae4SAndroid Build Coastguard Worker case C_KEEPALIVE_TIME: /* --keepalive-time */
1588*6236dae4SAndroid Build Coastguard Worker err = str2unum(&config->alivetime, nextarg);
1589*6236dae4SAndroid Build Coastguard Worker break;
1590*6236dae4SAndroid Build Coastguard Worker case C_KEEPALIVE_CNT: /* --keepalive-cnt */
1591*6236dae4SAndroid Build Coastguard Worker err = str2unum(&config->alivecnt, nextarg);
1592*6236dae4SAndroid Build Coastguard Worker break;
1593*6236dae4SAndroid Build Coastguard Worker case C_POST301: /* --post301 */
1594*6236dae4SAndroid Build Coastguard Worker config->post301 = toggle;
1595*6236dae4SAndroid Build Coastguard Worker break;
1596*6236dae4SAndroid Build Coastguard Worker case C_POST302: /* --post302 */
1597*6236dae4SAndroid Build Coastguard Worker config->post302 = toggle;
1598*6236dae4SAndroid Build Coastguard Worker break;
1599*6236dae4SAndroid Build Coastguard Worker case C_POST303: /* --post303 */
1600*6236dae4SAndroid Build Coastguard Worker config->post303 = toggle;
1601*6236dae4SAndroid Build Coastguard Worker break;
1602*6236dae4SAndroid Build Coastguard Worker case C_NOPROXY: /* --noproxy */
1603*6236dae4SAndroid Build Coastguard Worker /* This specifies the noproxy list */
1604*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->noproxy, nextarg, ALLOW_BLANK);
1605*6236dae4SAndroid Build Coastguard Worker break;
1606*6236dae4SAndroid Build Coastguard Worker case C_SOCKS5_GSSAPI_NEC: /* --socks5-gssapi-nec */
1607*6236dae4SAndroid Build Coastguard Worker config->socks5_gssapi_nec = toggle;
1608*6236dae4SAndroid Build Coastguard Worker break;
1609*6236dae4SAndroid Build Coastguard Worker case C_PROXY1_0: /* --proxy1.0 */
1610*6236dae4SAndroid Build Coastguard Worker /* http 1.0 proxy */
1611*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->proxy, nextarg, DENY_BLANK);
1612*6236dae4SAndroid Build Coastguard Worker config->proxyver = CURLPROXY_HTTP_1_0;
1613*6236dae4SAndroid Build Coastguard Worker break;
1614*6236dae4SAndroid Build Coastguard Worker case C_TFTP_BLKSIZE: /* --tftp-blksize */
1615*6236dae4SAndroid Build Coastguard Worker err = str2unum(&config->tftp_blksize, nextarg);
1616*6236dae4SAndroid Build Coastguard Worker break;
1617*6236dae4SAndroid Build Coastguard Worker case C_MAIL_FROM: /* --mail-from */
1618*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->mail_from, nextarg, DENY_BLANK);
1619*6236dae4SAndroid Build Coastguard Worker break;
1620*6236dae4SAndroid Build Coastguard Worker case C_MAIL_RCPT: /* --mail-rcpt */
1621*6236dae4SAndroid Build Coastguard Worker /* append receiver to a list */
1622*6236dae4SAndroid Build Coastguard Worker err = add2list(&config->mail_rcpt, nextarg);
1623*6236dae4SAndroid Build Coastguard Worker break;
1624*6236dae4SAndroid Build Coastguard Worker case C_FTP_PRET: /* --ftp-pret */
1625*6236dae4SAndroid Build Coastguard Worker config->ftp_pret = toggle;
1626*6236dae4SAndroid Build Coastguard Worker break;
1627*6236dae4SAndroid Build Coastguard Worker case C_PROTO: /* --proto */
1628*6236dae4SAndroid Build Coastguard Worker config->proto_present = TRUE;
1629*6236dae4SAndroid Build Coastguard Worker err = proto2num(config, built_in_protos, &config->proto_str, nextarg);
1630*6236dae4SAndroid Build Coastguard Worker break;
1631*6236dae4SAndroid Build Coastguard Worker case C_PROTO_REDIR: /* --proto-redir */
1632*6236dae4SAndroid Build Coastguard Worker config->proto_redir_present = TRUE;
1633*6236dae4SAndroid Build Coastguard Worker if(proto2num(config, redir_protos, &config->proto_redir_str,
1634*6236dae4SAndroid Build Coastguard Worker nextarg))
1635*6236dae4SAndroid Build Coastguard Worker err = PARAM_BAD_USE;
1636*6236dae4SAndroid Build Coastguard Worker break;
1637*6236dae4SAndroid Build Coastguard Worker case C_RESOLVE: /* --resolve */
1638*6236dae4SAndroid Build Coastguard Worker err = add2list(&config->resolve, nextarg);
1639*6236dae4SAndroid Build Coastguard Worker break;
1640*6236dae4SAndroid Build Coastguard Worker case C_DELEGATION: /* --delegation */
1641*6236dae4SAndroid Build Coastguard Worker config->gssapi_delegation = delegation(config, nextarg);
1642*6236dae4SAndroid Build Coastguard Worker break;
1643*6236dae4SAndroid Build Coastguard Worker case C_MAIL_AUTH: /* --mail-auth */
1644*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->mail_auth, nextarg, DENY_BLANK);
1645*6236dae4SAndroid Build Coastguard Worker break;
1646*6236dae4SAndroid Build Coastguard Worker case C_METALINK: /* --metalink */
1647*6236dae4SAndroid Build Coastguard Worker errorf(global, "--metalink is disabled");
1648*6236dae4SAndroid Build Coastguard Worker err = PARAM_BAD_USE;
1649*6236dae4SAndroid Build Coastguard Worker break;
1650*6236dae4SAndroid Build Coastguard Worker case C_SASL_AUTHZID: /* --sasl-authzid */
1651*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->sasl_authzid, nextarg, DENY_BLANK);
1652*6236dae4SAndroid Build Coastguard Worker break;
1653*6236dae4SAndroid Build Coastguard Worker case C_SASL_IR: /* --sasl-ir */
1654*6236dae4SAndroid Build Coastguard Worker config->sasl_ir = toggle;
1655*6236dae4SAndroid Build Coastguard Worker break;
1656*6236dae4SAndroid Build Coastguard Worker case C_TEST_EVENT: /* --test-event */
1657*6236dae4SAndroid Build Coastguard Worker #ifdef DEBUGBUILD
1658*6236dae4SAndroid Build Coastguard Worker global->test_event_based = toggle;
1659*6236dae4SAndroid Build Coastguard Worker #else
1660*6236dae4SAndroid Build Coastguard Worker warnf(global, "--test-event is ignored unless a debug build");
1661*6236dae4SAndroid Build Coastguard Worker #endif
1662*6236dae4SAndroid Build Coastguard Worker break;
1663*6236dae4SAndroid Build Coastguard Worker case C_UNIX_SOCKET: /* --unix-socket */
1664*6236dae4SAndroid Build Coastguard Worker config->abstract_unix_socket = FALSE;
1665*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->unix_socket_path, nextarg, DENY_BLANK);
1666*6236dae4SAndroid Build Coastguard Worker break;
1667*6236dae4SAndroid Build Coastguard Worker case C_PATH_AS_IS: /* --path-as-is */
1668*6236dae4SAndroid Build Coastguard Worker config->path_as_is = toggle;
1669*6236dae4SAndroid Build Coastguard Worker break;
1670*6236dae4SAndroid Build Coastguard Worker case C_PROXY_SERVICE_NAME: /* --proxy-service-name */
1671*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->proxy_service_name, nextarg, DENY_BLANK);
1672*6236dae4SAndroid Build Coastguard Worker break;
1673*6236dae4SAndroid Build Coastguard Worker case C_SERVICE_NAME: /* --service-name */
1674*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->service_name, nextarg, DENY_BLANK);
1675*6236dae4SAndroid Build Coastguard Worker break;
1676*6236dae4SAndroid Build Coastguard Worker case C_PROTO_DEFAULT: /* --proto-default */
1677*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->proto_default, nextarg, DENY_BLANK);
1678*6236dae4SAndroid Build Coastguard Worker if(!err)
1679*6236dae4SAndroid Build Coastguard Worker err = check_protocol(config->proto_default);
1680*6236dae4SAndroid Build Coastguard Worker break;
1681*6236dae4SAndroid Build Coastguard Worker case C_EXPECT100_TIMEOUT: /* --expect100-timeout */
1682*6236dae4SAndroid Build Coastguard Worker err = secs2ms(&config->expect100timeout_ms, nextarg);
1683*6236dae4SAndroid Build Coastguard Worker break;
1684*6236dae4SAndroid Build Coastguard Worker case C_TFTP_NO_OPTIONS: /* --tftp-no-options */
1685*6236dae4SAndroid Build Coastguard Worker config->tftp_no_options = toggle;
1686*6236dae4SAndroid Build Coastguard Worker break;
1687*6236dae4SAndroid Build Coastguard Worker case C_CONNECT_TO: /* --connect-to */
1688*6236dae4SAndroid Build Coastguard Worker err = add2list(&config->connect_to, nextarg);
1689*6236dae4SAndroid Build Coastguard Worker break;
1690*6236dae4SAndroid Build Coastguard Worker case C_ABSTRACT_UNIX_SOCKET: /* --abstract-unix-socket */
1691*6236dae4SAndroid Build Coastguard Worker config->abstract_unix_socket = TRUE;
1692*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->unix_socket_path, nextarg, DENY_BLANK);
1693*6236dae4SAndroid Build Coastguard Worker break;
1694*6236dae4SAndroid Build Coastguard Worker case C_TLS_EARLYDATA: /* --tls-earlydata */
1695*6236dae4SAndroid Build Coastguard Worker if(feature_ssl)
1696*6236dae4SAndroid Build Coastguard Worker config->ssl_allow_earlydata = toggle;
1697*6236dae4SAndroid Build Coastguard Worker break;
1698*6236dae4SAndroid Build Coastguard Worker case C_TLS_MAX: /* --tls-max */
1699*6236dae4SAndroid Build Coastguard Worker err = str2tls_max(&config->ssl_version_max, nextarg);
1700*6236dae4SAndroid Build Coastguard Worker break;
1701*6236dae4SAndroid Build Coastguard Worker case C_SUPPRESS_CONNECT_HEADERS: /* --suppress-connect-headers */
1702*6236dae4SAndroid Build Coastguard Worker config->suppress_connect_headers = toggle;
1703*6236dae4SAndroid Build Coastguard Worker break;
1704*6236dae4SAndroid Build Coastguard Worker case C_COMPRESSED_SSH: /* --compressed-ssh */
1705*6236dae4SAndroid Build Coastguard Worker config->ssh_compression = toggle;
1706*6236dae4SAndroid Build Coastguard Worker break;
1707*6236dae4SAndroid Build Coastguard Worker case C_HAPPY_EYEBALLS_TIMEOUT_MS: /* --happy-eyeballs-timeout-ms */
1708*6236dae4SAndroid Build Coastguard Worker err = str2unum(&config->happy_eyeballs_timeout_ms, nextarg);
1709*6236dae4SAndroid Build Coastguard Worker /* 0 is a valid value for this timeout */
1710*6236dae4SAndroid Build Coastguard Worker break;
1711*6236dae4SAndroid Build Coastguard Worker case C_TRACE_IDS: /* --trace-ids */
1712*6236dae4SAndroid Build Coastguard Worker global->traceids = toggle;
1713*6236dae4SAndroid Build Coastguard Worker break;
1714*6236dae4SAndroid Build Coastguard Worker case C_TRACE_CONFIG: /* --trace-config */
1715*6236dae4SAndroid Build Coastguard Worker if(set_trace_config(global, nextarg))
1716*6236dae4SAndroid Build Coastguard Worker err = PARAM_NO_MEM;
1717*6236dae4SAndroid Build Coastguard Worker break;
1718*6236dae4SAndroid Build Coastguard Worker case C_PROGRESS_METER: /* --progress-meter */
1719*6236dae4SAndroid Build Coastguard Worker global->noprogress = !toggle;
1720*6236dae4SAndroid Build Coastguard Worker break;
1721*6236dae4SAndroid Build Coastguard Worker case C_PROGRESS_BAR: /* --progress-bar */
1722*6236dae4SAndroid Build Coastguard Worker global->progressmode = toggle ? CURL_PROGRESS_BAR : CURL_PROGRESS_STATS;
1723*6236dae4SAndroid Build Coastguard Worker break;
1724*6236dae4SAndroid Build Coastguard Worker case C_VARIABLE: /* --variable */
1725*6236dae4SAndroid Build Coastguard Worker err = setvariable(global, nextarg);
1726*6236dae4SAndroid Build Coastguard Worker break;
1727*6236dae4SAndroid Build Coastguard Worker case C_NEXT: /* --next */
1728*6236dae4SAndroid Build Coastguard Worker err = PARAM_NEXT_OPERATION;
1729*6236dae4SAndroid Build Coastguard Worker break;
1730*6236dae4SAndroid Build Coastguard Worker case C_HTTP1_0: /* --http1.0 */
1731*6236dae4SAndroid Build Coastguard Worker /* HTTP version 1.0 */
1732*6236dae4SAndroid Build Coastguard Worker sethttpver(global, config, CURL_HTTP_VERSION_1_0);
1733*6236dae4SAndroid Build Coastguard Worker break;
1734*6236dae4SAndroid Build Coastguard Worker case C_HTTP1_1: /* --http1.1 */
1735*6236dae4SAndroid Build Coastguard Worker /* HTTP version 1.1 */
1736*6236dae4SAndroid Build Coastguard Worker sethttpver(global, config, CURL_HTTP_VERSION_1_1);
1737*6236dae4SAndroid Build Coastguard Worker break;
1738*6236dae4SAndroid Build Coastguard Worker case C_HTTP2: /* --http2 */
1739*6236dae4SAndroid Build Coastguard Worker /* HTTP version 2.0 */
1740*6236dae4SAndroid Build Coastguard Worker if(!feature_http2)
1741*6236dae4SAndroid Build Coastguard Worker return PARAM_LIBCURL_DOESNT_SUPPORT;
1742*6236dae4SAndroid Build Coastguard Worker sethttpver(global, config, CURL_HTTP_VERSION_2_0);
1743*6236dae4SAndroid Build Coastguard Worker break;
1744*6236dae4SAndroid Build Coastguard Worker case C_HTTP2_PRIOR_KNOWLEDGE: /* --http2-prior-knowledge */
1745*6236dae4SAndroid Build Coastguard Worker /* HTTP version 2.0 over clean TCP */
1746*6236dae4SAndroid Build Coastguard Worker if(!feature_http2)
1747*6236dae4SAndroid Build Coastguard Worker return PARAM_LIBCURL_DOESNT_SUPPORT;
1748*6236dae4SAndroid Build Coastguard Worker sethttpver(global, config, CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE);
1749*6236dae4SAndroid Build Coastguard Worker break;
1750*6236dae4SAndroid Build Coastguard Worker case C_HTTP3: /* --http3: */
1751*6236dae4SAndroid Build Coastguard Worker /* Try HTTP/3, allow fallback */
1752*6236dae4SAndroid Build Coastguard Worker if(!feature_http3)
1753*6236dae4SAndroid Build Coastguard Worker err = PARAM_LIBCURL_DOESNT_SUPPORT;
1754*6236dae4SAndroid Build Coastguard Worker else
1755*6236dae4SAndroid Build Coastguard Worker sethttpver(global, config, CURL_HTTP_VERSION_3);
1756*6236dae4SAndroid Build Coastguard Worker break;
1757*6236dae4SAndroid Build Coastguard Worker case C_HTTP3_ONLY: /* --http3-only */
1758*6236dae4SAndroid Build Coastguard Worker /* Try HTTP/3 without fallback */
1759*6236dae4SAndroid Build Coastguard Worker if(!feature_http3)
1760*6236dae4SAndroid Build Coastguard Worker err = PARAM_LIBCURL_DOESNT_SUPPORT;
1761*6236dae4SAndroid Build Coastguard Worker else
1762*6236dae4SAndroid Build Coastguard Worker sethttpver(global, config, CURL_HTTP_VERSION_3ONLY);
1763*6236dae4SAndroid Build Coastguard Worker break;
1764*6236dae4SAndroid Build Coastguard Worker case C_HTTP0_9: /* --http0.9 */
1765*6236dae4SAndroid Build Coastguard Worker /* Allow HTTP/0.9 responses! */
1766*6236dae4SAndroid Build Coastguard Worker config->http09_allowed = toggle;
1767*6236dae4SAndroid Build Coastguard Worker break;
1768*6236dae4SAndroid Build Coastguard Worker case C_PROXY_HTTP2: /* --proxy-http2 */
1769*6236dae4SAndroid Build Coastguard Worker if(!feature_httpsproxy || !feature_http2)
1770*6236dae4SAndroid Build Coastguard Worker err = PARAM_LIBCURL_DOESNT_SUPPORT;
1771*6236dae4SAndroid Build Coastguard Worker else
1772*6236dae4SAndroid Build Coastguard Worker config->proxyver = CURLPROXY_HTTPS2;
1773*6236dae4SAndroid Build Coastguard Worker break;
1774*6236dae4SAndroid Build Coastguard Worker case C_TLSV1: /* --tlsv1 */
1775*6236dae4SAndroid Build Coastguard Worker config->ssl_version = CURL_SSLVERSION_TLSv1;
1776*6236dae4SAndroid Build Coastguard Worker break;
1777*6236dae4SAndroid Build Coastguard Worker case C_TLSV1_0: /* --tlsv1.0 */
1778*6236dae4SAndroid Build Coastguard Worker config->ssl_version = CURL_SSLVERSION_TLSv1_0;
1779*6236dae4SAndroid Build Coastguard Worker break;
1780*6236dae4SAndroid Build Coastguard Worker case C_TLSV1_1: /* --tlsv1.1 */
1781*6236dae4SAndroid Build Coastguard Worker config->ssl_version = CURL_SSLVERSION_TLSv1_1;
1782*6236dae4SAndroid Build Coastguard Worker break;
1783*6236dae4SAndroid Build Coastguard Worker case C_TLSV1_2: /* --tlsv1.2 */
1784*6236dae4SAndroid Build Coastguard Worker config->ssl_version = CURL_SSLVERSION_TLSv1_2;
1785*6236dae4SAndroid Build Coastguard Worker break;
1786*6236dae4SAndroid Build Coastguard Worker case C_TLSV1_3: /* --tlsv1.3 */
1787*6236dae4SAndroid Build Coastguard Worker config->ssl_version = CURL_SSLVERSION_TLSv1_3;
1788*6236dae4SAndroid Build Coastguard Worker break;
1789*6236dae4SAndroid Build Coastguard Worker case C_TLS13_CIPHERS: /* --tls13-ciphers */
1790*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->cipher13_list, nextarg, DENY_BLANK);
1791*6236dae4SAndroid Build Coastguard Worker break;
1792*6236dae4SAndroid Build Coastguard Worker case C_PROXY_TLS13_CIPHERS: /* --proxy-tls13-ciphers */
1793*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->proxy_cipher13_list, nextarg, DENY_BLANK);
1794*6236dae4SAndroid Build Coastguard Worker break;
1795*6236dae4SAndroid Build Coastguard Worker case C_SSLV2: /* --sslv2 */
1796*6236dae4SAndroid Build Coastguard Worker warnf(global, "Ignores instruction to use SSLv2");
1797*6236dae4SAndroid Build Coastguard Worker break;
1798*6236dae4SAndroid Build Coastguard Worker case C_SSLV3: /* --sslv3 */
1799*6236dae4SAndroid Build Coastguard Worker warnf(global, "Ignores instruction to use SSLv3");
1800*6236dae4SAndroid Build Coastguard Worker break;
1801*6236dae4SAndroid Build Coastguard Worker case C_IPV4: /* --ipv4 */
1802*6236dae4SAndroid Build Coastguard Worker config->ip_version = CURL_IPRESOLVE_V4;
1803*6236dae4SAndroid Build Coastguard Worker break;
1804*6236dae4SAndroid Build Coastguard Worker case C_IPV6: /* --ipv6 */
1805*6236dae4SAndroid Build Coastguard Worker config->ip_version = CURL_IPRESOLVE_V6;
1806*6236dae4SAndroid Build Coastguard Worker break;
1807*6236dae4SAndroid Build Coastguard Worker case C_APPEND: /* --append */
1808*6236dae4SAndroid Build Coastguard Worker /* This makes the FTP sessions use APPE instead of STOR */
1809*6236dae4SAndroid Build Coastguard Worker config->ftp_append = toggle;
1810*6236dae4SAndroid Build Coastguard Worker break;
1811*6236dae4SAndroid Build Coastguard Worker case C_USER_AGENT: /* --user-agent */
1812*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->useragent, nextarg, ALLOW_BLANK);
1813*6236dae4SAndroid Build Coastguard Worker break;
1814*6236dae4SAndroid Build Coastguard Worker case C_ALT_SVC: /* --alt-svc */
1815*6236dae4SAndroid Build Coastguard Worker if(!feature_altsvc)
1816*6236dae4SAndroid Build Coastguard Worker err = PARAM_LIBCURL_DOESNT_SUPPORT;
1817*6236dae4SAndroid Build Coastguard Worker else
1818*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->altsvc, nextarg, ALLOW_BLANK);
1819*6236dae4SAndroid Build Coastguard Worker break;
1820*6236dae4SAndroid Build Coastguard Worker case C_HSTS: /* --hsts */
1821*6236dae4SAndroid Build Coastguard Worker if(!feature_hsts)
1822*6236dae4SAndroid Build Coastguard Worker err = PARAM_LIBCURL_DOESNT_SUPPORT;
1823*6236dae4SAndroid Build Coastguard Worker else
1824*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->hsts, nextarg, ALLOW_BLANK);
1825*6236dae4SAndroid Build Coastguard Worker break;
1826*6236dae4SAndroid Build Coastguard Worker case C_COOKIE: /* --cookie */
1827*6236dae4SAndroid Build Coastguard Worker if(strchr(nextarg, '=')) {
1828*6236dae4SAndroid Build Coastguard Worker /* A cookie string must have a =-letter */
1829*6236dae4SAndroid Build Coastguard Worker err = add2list(&config->cookies, nextarg);
1830*6236dae4SAndroid Build Coastguard Worker break;
1831*6236dae4SAndroid Build Coastguard Worker }
1832*6236dae4SAndroid Build Coastguard Worker else {
1833*6236dae4SAndroid Build Coastguard Worker /* We have a cookie file to read from! */
1834*6236dae4SAndroid Build Coastguard Worker err = add2list(&config->cookiefiles, nextarg);
1835*6236dae4SAndroid Build Coastguard Worker }
1836*6236dae4SAndroid Build Coastguard Worker break;
1837*6236dae4SAndroid Build Coastguard Worker case C_USE_ASCII: /* --use-ascii */
1838*6236dae4SAndroid Build Coastguard Worker config->use_ascii = toggle;
1839*6236dae4SAndroid Build Coastguard Worker break;
1840*6236dae4SAndroid Build Coastguard Worker case C_COOKIE_JAR: /* --cookie-jar */
1841*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->cookiejar, nextarg, DENY_BLANK);
1842*6236dae4SAndroid Build Coastguard Worker break;
1843*6236dae4SAndroid Build Coastguard Worker case C_CONTINUE_AT: /* --continue-at */
1844*6236dae4SAndroid Build Coastguard Worker /* This makes us continue an ftp transfer at given position */
1845*6236dae4SAndroid Build Coastguard Worker if(strcmp(nextarg, "-")) {
1846*6236dae4SAndroid Build Coastguard Worker err = str2offset(&config->resume_from, nextarg);
1847*6236dae4SAndroid Build Coastguard Worker config->resume_from_current = FALSE;
1848*6236dae4SAndroid Build Coastguard Worker }
1849*6236dae4SAndroid Build Coastguard Worker else {
1850*6236dae4SAndroid Build Coastguard Worker config->resume_from_current = TRUE;
1851*6236dae4SAndroid Build Coastguard Worker config->resume_from = 0;
1852*6236dae4SAndroid Build Coastguard Worker }
1853*6236dae4SAndroid Build Coastguard Worker config->use_resume = TRUE;
1854*6236dae4SAndroid Build Coastguard Worker break;
1855*6236dae4SAndroid Build Coastguard Worker case C_DATA: /* --data */
1856*6236dae4SAndroid Build Coastguard Worker case C_DATA_ASCII: /* --data-ascii */
1857*6236dae4SAndroid Build Coastguard Worker case C_DATA_BINARY: /* --data-binary */
1858*6236dae4SAndroid Build Coastguard Worker case C_DATA_URLENCODE: /* --data-urlencode */
1859*6236dae4SAndroid Build Coastguard Worker case C_JSON: /* --json */
1860*6236dae4SAndroid Build Coastguard Worker case C_DATA_RAW: /* --data-raw */
1861*6236dae4SAndroid Build Coastguard Worker err = set_data(cmd, nextarg, global, config);
1862*6236dae4SAndroid Build Coastguard Worker break;
1863*6236dae4SAndroid Build Coastguard Worker case C_URL_QUERY: /* --url-query */
1864*6236dae4SAndroid Build Coastguard Worker err = url_query(nextarg, global, config);
1865*6236dae4SAndroid Build Coastguard Worker break;
1866*6236dae4SAndroid Build Coastguard Worker case C_DUMP_CA_EMBED: /* --dump-ca-embed */
1867*6236dae4SAndroid Build Coastguard Worker err = PARAM_CA_EMBED_REQUESTED;
1868*6236dae4SAndroid Build Coastguard Worker break;
1869*6236dae4SAndroid Build Coastguard Worker case C_DUMP_HEADER: /* --dump-header */
1870*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->headerfile, nextarg, DENY_BLANK);
1871*6236dae4SAndroid Build Coastguard Worker break;
1872*6236dae4SAndroid Build Coastguard Worker case C_REFERER: { /* --referer */
1873*6236dae4SAndroid Build Coastguard Worker char *ptr = strstr(nextarg, ";auto");
1874*6236dae4SAndroid Build Coastguard Worker if(ptr) {
1875*6236dae4SAndroid Build Coastguard Worker /* Automatic referer requested, this may be combined with a
1876*6236dae4SAndroid Build Coastguard Worker set initial one */
1877*6236dae4SAndroid Build Coastguard Worker config->autoreferer = TRUE;
1878*6236dae4SAndroid Build Coastguard Worker *ptr = 0; /* null-terminate here */
1879*6236dae4SAndroid Build Coastguard Worker }
1880*6236dae4SAndroid Build Coastguard Worker else
1881*6236dae4SAndroid Build Coastguard Worker config->autoreferer = FALSE;
1882*6236dae4SAndroid Build Coastguard Worker ptr = *nextarg ? nextarg : NULL;
1883*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->referer, ptr, ALLOW_BLANK);
1884*6236dae4SAndroid Build Coastguard Worker }
1885*6236dae4SAndroid Build Coastguard Worker break;
1886*6236dae4SAndroid Build Coastguard Worker case C_CERT: /* --cert */
1887*6236dae4SAndroid Build Coastguard Worker cleanarg(clearthis);
1888*6236dae4SAndroid Build Coastguard Worker GetFileAndPassword(nextarg, &config->cert, &config->key_passwd);
1889*6236dae4SAndroid Build Coastguard Worker break;
1890*6236dae4SAndroid Build Coastguard Worker case C_CACERT: /* --cacert */
1891*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->cacert, nextarg, DENY_BLANK);
1892*6236dae4SAndroid Build Coastguard Worker break;
1893*6236dae4SAndroid Build Coastguard Worker case C_CA_NATIVE: /* --ca-native */
1894*6236dae4SAndroid Build Coastguard Worker config->native_ca_store = toggle;
1895*6236dae4SAndroid Build Coastguard Worker break;
1896*6236dae4SAndroid Build Coastguard Worker case C_PROXY_CA_NATIVE: /* --proxy-ca-native */
1897*6236dae4SAndroid Build Coastguard Worker config->proxy_native_ca_store = toggle;
1898*6236dae4SAndroid Build Coastguard Worker break;
1899*6236dae4SAndroid Build Coastguard Worker case C_CERT_TYPE: /* --cert-type */
1900*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->cert_type, nextarg, DENY_BLANK);
1901*6236dae4SAndroid Build Coastguard Worker break;
1902*6236dae4SAndroid Build Coastguard Worker case C_KEY: /* --key */
1903*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->key, nextarg, DENY_BLANK);
1904*6236dae4SAndroid Build Coastguard Worker break;
1905*6236dae4SAndroid Build Coastguard Worker case C_KEY_TYPE: /* --key-type */
1906*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->key_type, nextarg, DENY_BLANK);
1907*6236dae4SAndroid Build Coastguard Worker break;
1908*6236dae4SAndroid Build Coastguard Worker case C_PASS: /* --pass */
1909*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->key_passwd, nextarg, DENY_BLANK);
1910*6236dae4SAndroid Build Coastguard Worker cleanarg(clearthis);
1911*6236dae4SAndroid Build Coastguard Worker break;
1912*6236dae4SAndroid Build Coastguard Worker case C_ENGINE: /* --engine */
1913*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->engine, nextarg, DENY_BLANK);
1914*6236dae4SAndroid Build Coastguard Worker if(!err &&
1915*6236dae4SAndroid Build Coastguard Worker config->engine && !strcmp(config->engine, "list")) {
1916*6236dae4SAndroid Build Coastguard Worker err = PARAM_ENGINES_REQUESTED;
1917*6236dae4SAndroid Build Coastguard Worker }
1918*6236dae4SAndroid Build Coastguard Worker break;
1919*6236dae4SAndroid Build Coastguard Worker case C_ECH: /* --ech */
1920*6236dae4SAndroid Build Coastguard Worker if(!feature_ech)
1921*6236dae4SAndroid Build Coastguard Worker err = PARAM_LIBCURL_DOESNT_SUPPORT;
1922*6236dae4SAndroid Build Coastguard Worker else if(strlen(nextarg) > 4 && strncasecompare("pn:", nextarg, 3)) {
1923*6236dae4SAndroid Build Coastguard Worker /* a public_name */
1924*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->ech_public, nextarg, DENY_BLANK);
1925*6236dae4SAndroid Build Coastguard Worker }
1926*6236dae4SAndroid Build Coastguard Worker else if(strlen(nextarg) > 5 && strncasecompare("ecl:", nextarg, 4)) {
1927*6236dae4SAndroid Build Coastguard Worker /* an ECHConfigList */
1928*6236dae4SAndroid Build Coastguard Worker if('@' != *(nextarg + 4)) {
1929*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->ech_config, nextarg, DENY_BLANK);
1930*6236dae4SAndroid Build Coastguard Worker }
1931*6236dae4SAndroid Build Coastguard Worker else {
1932*6236dae4SAndroid Build Coastguard Worker /* Indirect case: @filename or @- for stdin */
1933*6236dae4SAndroid Build Coastguard Worker char *tmpcfg = NULL;
1934*6236dae4SAndroid Build Coastguard Worker FILE *file;
1935*6236dae4SAndroid Build Coastguard Worker
1936*6236dae4SAndroid Build Coastguard Worker nextarg++; /* skip over '@' */
1937*6236dae4SAndroid Build Coastguard Worker if(!strcmp("-", nextarg)) {
1938*6236dae4SAndroid Build Coastguard Worker file = stdin;
1939*6236dae4SAndroid Build Coastguard Worker }
1940*6236dae4SAndroid Build Coastguard Worker else {
1941*6236dae4SAndroid Build Coastguard Worker file = fopen(nextarg, FOPEN_READTEXT);
1942*6236dae4SAndroid Build Coastguard Worker }
1943*6236dae4SAndroid Build Coastguard Worker if(!file) {
1944*6236dae4SAndroid Build Coastguard Worker warnf(global,
1945*6236dae4SAndroid Build Coastguard Worker "Couldn't read file \"%s\" "
1946*6236dae4SAndroid Build Coastguard Worker "specified for \"--ech ecl:\" option",
1947*6236dae4SAndroid Build Coastguard Worker nextarg);
1948*6236dae4SAndroid Build Coastguard Worker return PARAM_BAD_USE; /* */
1949*6236dae4SAndroid Build Coastguard Worker }
1950*6236dae4SAndroid Build Coastguard Worker err = file2string(&tmpcfg, file);
1951*6236dae4SAndroid Build Coastguard Worker if(file != stdin)
1952*6236dae4SAndroid Build Coastguard Worker fclose(file);
1953*6236dae4SAndroid Build Coastguard Worker if(err)
1954*6236dae4SAndroid Build Coastguard Worker return err;
1955*6236dae4SAndroid Build Coastguard Worker config->ech_config = aprintf("ecl:%s",tmpcfg);
1956*6236dae4SAndroid Build Coastguard Worker if(!config->ech_config)
1957*6236dae4SAndroid Build Coastguard Worker return PARAM_NO_MEM;
1958*6236dae4SAndroid Build Coastguard Worker free(tmpcfg);
1959*6236dae4SAndroid Build Coastguard Worker } /* file done */
1960*6236dae4SAndroid Build Coastguard Worker }
1961*6236dae4SAndroid Build Coastguard Worker else {
1962*6236dae4SAndroid Build Coastguard Worker /* Simple case: just a string, with a keyword */
1963*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->ech, nextarg, DENY_BLANK);
1964*6236dae4SAndroid Build Coastguard Worker }
1965*6236dae4SAndroid Build Coastguard Worker break;
1966*6236dae4SAndroid Build Coastguard Worker case C_CAPATH: /* --capath */
1967*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->capath, nextarg, DENY_BLANK);
1968*6236dae4SAndroid Build Coastguard Worker break;
1969*6236dae4SAndroid Build Coastguard Worker case C_PUBKEY: /* --pubkey */
1970*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->pubkey, nextarg, DENY_BLANK);
1971*6236dae4SAndroid Build Coastguard Worker break;
1972*6236dae4SAndroid Build Coastguard Worker case C_HOSTPUBMD5: /* --hostpubmd5 */
1973*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->hostpubmd5, nextarg, DENY_BLANK);
1974*6236dae4SAndroid Build Coastguard Worker if(!err) {
1975*6236dae4SAndroid Build Coastguard Worker if(!config->hostpubmd5 || strlen(config->hostpubmd5) != 32)
1976*6236dae4SAndroid Build Coastguard Worker err = PARAM_BAD_USE;
1977*6236dae4SAndroid Build Coastguard Worker }
1978*6236dae4SAndroid Build Coastguard Worker break;
1979*6236dae4SAndroid Build Coastguard Worker case C_HOSTPUBSHA256: /* --hostpubsha256 */
1980*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->hostpubsha256, nextarg, DENY_BLANK);
1981*6236dae4SAndroid Build Coastguard Worker break;
1982*6236dae4SAndroid Build Coastguard Worker case C_CRLFILE: /* --crlfile */
1983*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->crlfile, nextarg, DENY_BLANK);
1984*6236dae4SAndroid Build Coastguard Worker break;
1985*6236dae4SAndroid Build Coastguard Worker case C_TLSUSER: /* --tlsuser */
1986*6236dae4SAndroid Build Coastguard Worker if(!feature_tls_srp)
1987*6236dae4SAndroid Build Coastguard Worker err = PARAM_LIBCURL_DOESNT_SUPPORT;
1988*6236dae4SAndroid Build Coastguard Worker else
1989*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->tls_username, nextarg, DENY_BLANK);
1990*6236dae4SAndroid Build Coastguard Worker cleanarg(clearthis);
1991*6236dae4SAndroid Build Coastguard Worker break;
1992*6236dae4SAndroid Build Coastguard Worker case C_TLSPASSWORD: /* --tlspassword */
1993*6236dae4SAndroid Build Coastguard Worker if(!feature_tls_srp)
1994*6236dae4SAndroid Build Coastguard Worker err = PARAM_LIBCURL_DOESNT_SUPPORT;
1995*6236dae4SAndroid Build Coastguard Worker else
1996*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->tls_password, nextarg, ALLOW_BLANK);
1997*6236dae4SAndroid Build Coastguard Worker cleanarg(clearthis);
1998*6236dae4SAndroid Build Coastguard Worker break;
1999*6236dae4SAndroid Build Coastguard Worker case C_TLSAUTHTYPE: /* --tlsauthtype */
2000*6236dae4SAndroid Build Coastguard Worker if(!feature_tls_srp)
2001*6236dae4SAndroid Build Coastguard Worker err = PARAM_LIBCURL_DOESNT_SUPPORT;
2002*6236dae4SAndroid Build Coastguard Worker else {
2003*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->tls_authtype, nextarg, DENY_BLANK);
2004*6236dae4SAndroid Build Coastguard Worker if(!err && strcmp(config->tls_authtype, "SRP"))
2005*6236dae4SAndroid Build Coastguard Worker err = PARAM_LIBCURL_DOESNT_SUPPORT; /* only support TLS-SRP */
2006*6236dae4SAndroid Build Coastguard Worker }
2007*6236dae4SAndroid Build Coastguard Worker break;
2008*6236dae4SAndroid Build Coastguard Worker case C_SSL_ALLOW_BEAST: /* --ssl-allow-beast */
2009*6236dae4SAndroid Build Coastguard Worker if(feature_ssl)
2010*6236dae4SAndroid Build Coastguard Worker config->ssl_allow_beast = toggle;
2011*6236dae4SAndroid Build Coastguard Worker break;
2012*6236dae4SAndroid Build Coastguard Worker case C_SSL_AUTO_CLIENT_CERT: /* --ssl-auto-client-cert */
2013*6236dae4SAndroid Build Coastguard Worker if(feature_ssl)
2014*6236dae4SAndroid Build Coastguard Worker config->ssl_auto_client_cert = toggle;
2015*6236dae4SAndroid Build Coastguard Worker break;
2016*6236dae4SAndroid Build Coastguard Worker case C_PROXY_SSL_AUTO_CLIENT_CERT: /* --proxy-ssl-auto-client-cert */
2017*6236dae4SAndroid Build Coastguard Worker if(feature_ssl)
2018*6236dae4SAndroid Build Coastguard Worker config->proxy_ssl_auto_client_cert = toggle;
2019*6236dae4SAndroid Build Coastguard Worker break;
2020*6236dae4SAndroid Build Coastguard Worker case C_PINNEDPUBKEY: /* --pinnedpubkey */
2021*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->pinnedpubkey, nextarg, DENY_BLANK);
2022*6236dae4SAndroid Build Coastguard Worker break;
2023*6236dae4SAndroid Build Coastguard Worker case C_PROXY_PINNEDPUBKEY: /* --proxy-pinnedpubkey */
2024*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->proxy_pinnedpubkey, nextarg, DENY_BLANK);
2025*6236dae4SAndroid Build Coastguard Worker break;
2026*6236dae4SAndroid Build Coastguard Worker case C_CERT_STATUS: /* --cert-status */
2027*6236dae4SAndroid Build Coastguard Worker config->verifystatus = TRUE;
2028*6236dae4SAndroid Build Coastguard Worker break;
2029*6236dae4SAndroid Build Coastguard Worker case C_DOH_CERT_STATUS: /* --doh-cert-status */
2030*6236dae4SAndroid Build Coastguard Worker config->doh_verifystatus = TRUE;
2031*6236dae4SAndroid Build Coastguard Worker break;
2032*6236dae4SAndroid Build Coastguard Worker case C_FALSE_START: /* --false-start */
2033*6236dae4SAndroid Build Coastguard Worker config->falsestart = TRUE;
2034*6236dae4SAndroid Build Coastguard Worker break;
2035*6236dae4SAndroid Build Coastguard Worker case C_SSL_NO_REVOKE: /* --ssl-no-revoke */
2036*6236dae4SAndroid Build Coastguard Worker if(feature_ssl)
2037*6236dae4SAndroid Build Coastguard Worker config->ssl_no_revoke = TRUE;
2038*6236dae4SAndroid Build Coastguard Worker break;
2039*6236dae4SAndroid Build Coastguard Worker case C_SSL_REVOKE_BEST_EFFORT: /* --ssl-revoke-best-effort */
2040*6236dae4SAndroid Build Coastguard Worker if(feature_ssl)
2041*6236dae4SAndroid Build Coastguard Worker config->ssl_revoke_best_effort = TRUE;
2042*6236dae4SAndroid Build Coastguard Worker break;
2043*6236dae4SAndroid Build Coastguard Worker case C_TCP_FASTOPEN: /* --tcp-fastopen */
2044*6236dae4SAndroid Build Coastguard Worker config->tcp_fastopen = TRUE;
2045*6236dae4SAndroid Build Coastguard Worker break;
2046*6236dae4SAndroid Build Coastguard Worker case C_PROXY_TLSUSER: /* --proxy-tlsuser */
2047*6236dae4SAndroid Build Coastguard Worker cleanarg(clearthis);
2048*6236dae4SAndroid Build Coastguard Worker if(!feature_tls_srp)
2049*6236dae4SAndroid Build Coastguard Worker err = PARAM_LIBCURL_DOESNT_SUPPORT;
2050*6236dae4SAndroid Build Coastguard Worker else
2051*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->proxy_tls_username, nextarg, ALLOW_BLANK);
2052*6236dae4SAndroid Build Coastguard Worker break;
2053*6236dae4SAndroid Build Coastguard Worker case C_PROXY_TLSPASSWORD: /* --proxy-tlspassword */
2054*6236dae4SAndroid Build Coastguard Worker cleanarg(clearthis);
2055*6236dae4SAndroid Build Coastguard Worker if(!feature_tls_srp)
2056*6236dae4SAndroid Build Coastguard Worker err = PARAM_LIBCURL_DOESNT_SUPPORT;
2057*6236dae4SAndroid Build Coastguard Worker else
2058*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->proxy_tls_password, nextarg, DENY_BLANK);
2059*6236dae4SAndroid Build Coastguard Worker break;
2060*6236dae4SAndroid Build Coastguard Worker case C_PROXY_TLSAUTHTYPE: /* --proxy-tlsauthtype */
2061*6236dae4SAndroid Build Coastguard Worker if(!feature_tls_srp)
2062*6236dae4SAndroid Build Coastguard Worker err = PARAM_LIBCURL_DOESNT_SUPPORT;
2063*6236dae4SAndroid Build Coastguard Worker else {
2064*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->proxy_tls_authtype, nextarg, DENY_BLANK);
2065*6236dae4SAndroid Build Coastguard Worker if(!err && strcmp(config->proxy_tls_authtype, "SRP"))
2066*6236dae4SAndroid Build Coastguard Worker err = PARAM_LIBCURL_DOESNT_SUPPORT; /* only support TLS-SRP */
2067*6236dae4SAndroid Build Coastguard Worker }
2068*6236dae4SAndroid Build Coastguard Worker break;
2069*6236dae4SAndroid Build Coastguard Worker case C_PROXY_CERT: /* --proxy-cert */
2070*6236dae4SAndroid Build Coastguard Worker cleanarg(clearthis);
2071*6236dae4SAndroid Build Coastguard Worker GetFileAndPassword(nextarg, &config->proxy_cert,
2072*6236dae4SAndroid Build Coastguard Worker &config->proxy_key_passwd);
2073*6236dae4SAndroid Build Coastguard Worker break;
2074*6236dae4SAndroid Build Coastguard Worker case C_PROXY_CERT_TYPE: /* --proxy-cert-type */
2075*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->proxy_cert_type, nextarg, DENY_BLANK);
2076*6236dae4SAndroid Build Coastguard Worker break;
2077*6236dae4SAndroid Build Coastguard Worker case C_PROXY_KEY: /* --proxy-key */
2078*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->proxy_key, nextarg, ALLOW_BLANK);
2079*6236dae4SAndroid Build Coastguard Worker break;
2080*6236dae4SAndroid Build Coastguard Worker case C_PROXY_KEY_TYPE: /* --proxy-key-type */
2081*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->proxy_key_type, nextarg, DENY_BLANK);
2082*6236dae4SAndroid Build Coastguard Worker break;
2083*6236dae4SAndroid Build Coastguard Worker case C_PROXY_PASS: /* --proxy-pass */
2084*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->proxy_key_passwd, nextarg, ALLOW_BLANK);
2085*6236dae4SAndroid Build Coastguard Worker cleanarg(clearthis);
2086*6236dae4SAndroid Build Coastguard Worker break;
2087*6236dae4SAndroid Build Coastguard Worker case C_PROXY_CIPHERS: /* --proxy-ciphers */
2088*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->proxy_cipher_list, nextarg, DENY_BLANK);
2089*6236dae4SAndroid Build Coastguard Worker break;
2090*6236dae4SAndroid Build Coastguard Worker case C_PROXY_CRLFILE: /* --proxy-crlfile */
2091*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->proxy_crlfile, nextarg, DENY_BLANK);
2092*6236dae4SAndroid Build Coastguard Worker break;
2093*6236dae4SAndroid Build Coastguard Worker case C_PROXY_SSL_ALLOW_BEAST: /* --proxy-ssl-allow-beast */
2094*6236dae4SAndroid Build Coastguard Worker if(feature_ssl)
2095*6236dae4SAndroid Build Coastguard Worker config->proxy_ssl_allow_beast = toggle;
2096*6236dae4SAndroid Build Coastguard Worker break;
2097*6236dae4SAndroid Build Coastguard Worker case C_LOGIN_OPTIONS: /* --login-options */
2098*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->login_options, nextarg, ALLOW_BLANK);
2099*6236dae4SAndroid Build Coastguard Worker break;
2100*6236dae4SAndroid Build Coastguard Worker case C_PROXY_CACERT: /* --proxy-cacert */
2101*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->proxy_cacert, nextarg, DENY_BLANK);
2102*6236dae4SAndroid Build Coastguard Worker break;
2103*6236dae4SAndroid Build Coastguard Worker case C_PROXY_CAPATH: /* --proxy-capath */
2104*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->proxy_capath, nextarg, DENY_BLANK);
2105*6236dae4SAndroid Build Coastguard Worker break;
2106*6236dae4SAndroid Build Coastguard Worker case C_PROXY_INSECURE: /* --proxy-insecure */
2107*6236dae4SAndroid Build Coastguard Worker config->proxy_insecure_ok = toggle;
2108*6236dae4SAndroid Build Coastguard Worker break;
2109*6236dae4SAndroid Build Coastguard Worker case C_PROXY_TLSV1: /* --proxy-tlsv1 */
2110*6236dae4SAndroid Build Coastguard Worker /* TLS version 1 for proxy */
2111*6236dae4SAndroid Build Coastguard Worker config->proxy_ssl_version = CURL_SSLVERSION_TLSv1;
2112*6236dae4SAndroid Build Coastguard Worker break;
2113*6236dae4SAndroid Build Coastguard Worker case C_SOCKS5_BASIC: /* --socks5-basic */
2114*6236dae4SAndroid Build Coastguard Worker if(toggle)
2115*6236dae4SAndroid Build Coastguard Worker config->socks5_auth |= CURLAUTH_BASIC;
2116*6236dae4SAndroid Build Coastguard Worker else
2117*6236dae4SAndroid Build Coastguard Worker config->socks5_auth &= ~CURLAUTH_BASIC;
2118*6236dae4SAndroid Build Coastguard Worker break;
2119*6236dae4SAndroid Build Coastguard Worker case C_SOCKS5_GSSAPI: /* --socks5-gssapi */
2120*6236dae4SAndroid Build Coastguard Worker if(toggle)
2121*6236dae4SAndroid Build Coastguard Worker config->socks5_auth |= CURLAUTH_GSSAPI;
2122*6236dae4SAndroid Build Coastguard Worker else
2123*6236dae4SAndroid Build Coastguard Worker config->socks5_auth &= ~CURLAUTH_GSSAPI;
2124*6236dae4SAndroid Build Coastguard Worker break;
2125*6236dae4SAndroid Build Coastguard Worker case C_ETAG_SAVE: /* --etag-save */
2126*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->etag_save_file, nextarg, DENY_BLANK);
2127*6236dae4SAndroid Build Coastguard Worker break;
2128*6236dae4SAndroid Build Coastguard Worker case C_ETAG_COMPARE: /* --etag-compare */
2129*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->etag_compare_file, nextarg, DENY_BLANK);
2130*6236dae4SAndroid Build Coastguard Worker break;
2131*6236dae4SAndroid Build Coastguard Worker case C_CURVES: /* --curves */
2132*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->ssl_ec_curves, nextarg, DENY_BLANK);
2133*6236dae4SAndroid Build Coastguard Worker break;
2134*6236dae4SAndroid Build Coastguard Worker case C_FAIL_EARLY: /* --fail-early */
2135*6236dae4SAndroid Build Coastguard Worker global->fail_early = toggle;
2136*6236dae4SAndroid Build Coastguard Worker break;
2137*6236dae4SAndroid Build Coastguard Worker case C_STYLED_OUTPUT: /* --styled-output */
2138*6236dae4SAndroid Build Coastguard Worker global->styled_output = toggle;
2139*6236dae4SAndroid Build Coastguard Worker break;
2140*6236dae4SAndroid Build Coastguard Worker case C_MAIL_RCPT_ALLOWFAILS: /* --mail-rcpt-allowfails */
2141*6236dae4SAndroid Build Coastguard Worker config->mail_rcpt_allowfails = toggle;
2142*6236dae4SAndroid Build Coastguard Worker break;
2143*6236dae4SAndroid Build Coastguard Worker case C_FAIL_WITH_BODY: /* --fail-with-body */
2144*6236dae4SAndroid Build Coastguard Worker config->failwithbody = toggle;
2145*6236dae4SAndroid Build Coastguard Worker if(config->failonerror && config->failwithbody) {
2146*6236dae4SAndroid Build Coastguard Worker errorf(config->global, "You must select either --fail or "
2147*6236dae4SAndroid Build Coastguard Worker "--fail-with-body, not both.");
2148*6236dae4SAndroid Build Coastguard Worker err = PARAM_BAD_USE;
2149*6236dae4SAndroid Build Coastguard Worker }
2150*6236dae4SAndroid Build Coastguard Worker break;
2151*6236dae4SAndroid Build Coastguard Worker case C_REMOVE_ON_ERROR: /* --remove-on-error */
2152*6236dae4SAndroid Build Coastguard Worker config->rm_partial = toggle;
2153*6236dae4SAndroid Build Coastguard Worker break;
2154*6236dae4SAndroid Build Coastguard Worker case C_FAIL: /* --fail */
2155*6236dae4SAndroid Build Coastguard Worker config->failonerror = toggle;
2156*6236dae4SAndroid Build Coastguard Worker if(config->failonerror && config->failwithbody) {
2157*6236dae4SAndroid Build Coastguard Worker errorf(config->global, "You must select either --fail or "
2158*6236dae4SAndroid Build Coastguard Worker "--fail-with-body, not both.");
2159*6236dae4SAndroid Build Coastguard Worker err = PARAM_BAD_USE;
2160*6236dae4SAndroid Build Coastguard Worker }
2161*6236dae4SAndroid Build Coastguard Worker break;
2162*6236dae4SAndroid Build Coastguard Worker case C_FORM: /* --form */
2163*6236dae4SAndroid Build Coastguard Worker case C_FORM_STRING: /* --form-string */
2164*6236dae4SAndroid Build Coastguard Worker /* "form data" simulation, this is a little advanced so lets do our best
2165*6236dae4SAndroid Build Coastguard Worker to sort this out slowly and carefully */
2166*6236dae4SAndroid Build Coastguard Worker if(formparse(config,
2167*6236dae4SAndroid Build Coastguard Worker nextarg,
2168*6236dae4SAndroid Build Coastguard Worker &config->mimeroot,
2169*6236dae4SAndroid Build Coastguard Worker &config->mimecurrent,
2170*6236dae4SAndroid Build Coastguard Worker (cmd == C_FORM_STRING))) /* literal string */
2171*6236dae4SAndroid Build Coastguard Worker err = PARAM_BAD_USE;
2172*6236dae4SAndroid Build Coastguard Worker else if(SetHTTPrequest(config, TOOL_HTTPREQ_MIMEPOST, &config->httpreq))
2173*6236dae4SAndroid Build Coastguard Worker err = PARAM_BAD_USE;
2174*6236dae4SAndroid Build Coastguard Worker break;
2175*6236dae4SAndroid Build Coastguard Worker case C_GLOBOFF: /* --globoff */
2176*6236dae4SAndroid Build Coastguard Worker config->globoff = toggle;
2177*6236dae4SAndroid Build Coastguard Worker break;
2178*6236dae4SAndroid Build Coastguard Worker case C_GET: /* --get */
2179*6236dae4SAndroid Build Coastguard Worker config->use_httpget = toggle;
2180*6236dae4SAndroid Build Coastguard Worker break;
2181*6236dae4SAndroid Build Coastguard Worker case C_REQUEST_TARGET: /* --request-target */
2182*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->request_target, nextarg, DENY_BLANK);
2183*6236dae4SAndroid Build Coastguard Worker break;
2184*6236dae4SAndroid Build Coastguard Worker case C_HELP: /* --help */
2185*6236dae4SAndroid Build Coastguard Worker if(toggle) {
2186*6236dae4SAndroid Build Coastguard Worker if(*nextarg) {
2187*6236dae4SAndroid Build Coastguard Worker global->help_category = strdup(nextarg);
2188*6236dae4SAndroid Build Coastguard Worker if(!global->help_category) {
2189*6236dae4SAndroid Build Coastguard Worker err = PARAM_NO_MEM;
2190*6236dae4SAndroid Build Coastguard Worker break;
2191*6236dae4SAndroid Build Coastguard Worker }
2192*6236dae4SAndroid Build Coastguard Worker }
2193*6236dae4SAndroid Build Coastguard Worker err = PARAM_HELP_REQUESTED;
2194*6236dae4SAndroid Build Coastguard Worker }
2195*6236dae4SAndroid Build Coastguard Worker /* we now actually support --no-help too! */
2196*6236dae4SAndroid Build Coastguard Worker break;
2197*6236dae4SAndroid Build Coastguard Worker case C_HEADER: /* --header */
2198*6236dae4SAndroid Build Coastguard Worker case C_PROXY_HEADER: /* --proxy-header */
2199*6236dae4SAndroid Build Coastguard Worker /* A custom header to append to a list */
2200*6236dae4SAndroid Build Coastguard Worker if(nextarg[0] == '@') {
2201*6236dae4SAndroid Build Coastguard Worker /* read many headers from a file or stdin */
2202*6236dae4SAndroid Build Coastguard Worker char *string;
2203*6236dae4SAndroid Build Coastguard Worker size_t len;
2204*6236dae4SAndroid Build Coastguard Worker bool use_stdin = !strcmp(&nextarg[1], "-");
2205*6236dae4SAndroid Build Coastguard Worker FILE *file = use_stdin ? stdin : fopen(&nextarg[1], FOPEN_READTEXT);
2206*6236dae4SAndroid Build Coastguard Worker if(!file) {
2207*6236dae4SAndroid Build Coastguard Worker errorf(global, "Failed to open %s", &nextarg[1]);
2208*6236dae4SAndroid Build Coastguard Worker err = PARAM_READ_ERROR;
2209*6236dae4SAndroid Build Coastguard Worker }
2210*6236dae4SAndroid Build Coastguard Worker else {
2211*6236dae4SAndroid Build Coastguard Worker err = file2memory(&string, &len, file);
2212*6236dae4SAndroid Build Coastguard Worker if(!err && string) {
2213*6236dae4SAndroid Build Coastguard Worker /* Allow strtok() here since this is not used threaded */
2214*6236dae4SAndroid Build Coastguard Worker /* !checksrc! disable BANNEDFUNC 2 */
2215*6236dae4SAndroid Build Coastguard Worker char *h = strtok(string, "\r\n");
2216*6236dae4SAndroid Build Coastguard Worker while(h) {
2217*6236dae4SAndroid Build Coastguard Worker if(cmd == C_PROXY_HEADER) /* --proxy-header */
2218*6236dae4SAndroid Build Coastguard Worker err = add2list(&config->proxyheaders, h);
2219*6236dae4SAndroid Build Coastguard Worker else
2220*6236dae4SAndroid Build Coastguard Worker err = add2list(&config->headers, h);
2221*6236dae4SAndroid Build Coastguard Worker if(err)
2222*6236dae4SAndroid Build Coastguard Worker break;
2223*6236dae4SAndroid Build Coastguard Worker h = strtok(NULL, "\r\n");
2224*6236dae4SAndroid Build Coastguard Worker }
2225*6236dae4SAndroid Build Coastguard Worker free(string);
2226*6236dae4SAndroid Build Coastguard Worker }
2227*6236dae4SAndroid Build Coastguard Worker if(!use_stdin)
2228*6236dae4SAndroid Build Coastguard Worker fclose(file);
2229*6236dae4SAndroid Build Coastguard Worker }
2230*6236dae4SAndroid Build Coastguard Worker }
2231*6236dae4SAndroid Build Coastguard Worker else {
2232*6236dae4SAndroid Build Coastguard Worker if(cmd == C_PROXY_HEADER) /* --proxy-header */
2233*6236dae4SAndroid Build Coastguard Worker err = add2list(&config->proxyheaders, nextarg);
2234*6236dae4SAndroid Build Coastguard Worker else
2235*6236dae4SAndroid Build Coastguard Worker err = add2list(&config->headers, nextarg);
2236*6236dae4SAndroid Build Coastguard Worker }
2237*6236dae4SAndroid Build Coastguard Worker break;
2238*6236dae4SAndroid Build Coastguard Worker case C_INCLUDE: /* --include */
2239*6236dae4SAndroid Build Coastguard Worker case C_SHOW_HEADERS: /* --show-headers */
2240*6236dae4SAndroid Build Coastguard Worker config->show_headers = toggle; /* show the headers as well in the
2241*6236dae4SAndroid Build Coastguard Worker general output stream */
2242*6236dae4SAndroid Build Coastguard Worker break;
2243*6236dae4SAndroid Build Coastguard Worker case C_JUNK_SESSION_COOKIES: /* --junk-session-cookies */
2244*6236dae4SAndroid Build Coastguard Worker config->cookiesession = toggle;
2245*6236dae4SAndroid Build Coastguard Worker break;
2246*6236dae4SAndroid Build Coastguard Worker case C_HEAD: /* --head */
2247*6236dae4SAndroid Build Coastguard Worker config->no_body = toggle;
2248*6236dae4SAndroid Build Coastguard Worker config->show_headers = toggle;
2249*6236dae4SAndroid Build Coastguard Worker if(SetHTTPrequest(config, (config->no_body) ? TOOL_HTTPREQ_HEAD :
2250*6236dae4SAndroid Build Coastguard Worker TOOL_HTTPREQ_GET, &config->httpreq))
2251*6236dae4SAndroid Build Coastguard Worker err = PARAM_BAD_USE;
2252*6236dae4SAndroid Build Coastguard Worker break;
2253*6236dae4SAndroid Build Coastguard Worker case C_REMOTE_HEADER_NAME: /* --remote-header-name */
2254*6236dae4SAndroid Build Coastguard Worker config->content_disposition = toggle;
2255*6236dae4SAndroid Build Coastguard Worker break;
2256*6236dae4SAndroid Build Coastguard Worker case C_INSECURE: /* --insecure */
2257*6236dae4SAndroid Build Coastguard Worker config->insecure_ok = toggle;
2258*6236dae4SAndroid Build Coastguard Worker break;
2259*6236dae4SAndroid Build Coastguard Worker case C_DOH_INSECURE: /* --doh-insecure */
2260*6236dae4SAndroid Build Coastguard Worker config->doh_insecure_ok = toggle;
2261*6236dae4SAndroid Build Coastguard Worker break;
2262*6236dae4SAndroid Build Coastguard Worker case C_CONFIG: /* --config */
2263*6236dae4SAndroid Build Coastguard Worker if(parseconfig(nextarg, global)) {
2264*6236dae4SAndroid Build Coastguard Worker errorf(global, "cannot read config from '%s'", nextarg);
2265*6236dae4SAndroid Build Coastguard Worker err = PARAM_READ_ERROR;
2266*6236dae4SAndroid Build Coastguard Worker }
2267*6236dae4SAndroid Build Coastguard Worker break;
2268*6236dae4SAndroid Build Coastguard Worker case C_LIST_ONLY: /* --list-only */
2269*6236dae4SAndroid Build Coastguard Worker config->dirlistonly = toggle; /* only list the names of the FTP dir */
2270*6236dae4SAndroid Build Coastguard Worker break;
2271*6236dae4SAndroid Build Coastguard Worker case C_LOCATION_TRUSTED: /* --location-trusted */
2272*6236dae4SAndroid Build Coastguard Worker /* Continue to send authentication (user+password) when following
2273*6236dae4SAndroid Build Coastguard Worker * locations, even when hostname changed */
2274*6236dae4SAndroid Build Coastguard Worker config->unrestricted_auth = toggle;
2275*6236dae4SAndroid Build Coastguard Worker FALLTHROUGH();
2276*6236dae4SAndroid Build Coastguard Worker case C_LOCATION: /* --location */
2277*6236dae4SAndroid Build Coastguard Worker config->followlocation = toggle; /* Follow Location: HTTP headers */
2278*6236dae4SAndroid Build Coastguard Worker break;
2279*6236dae4SAndroid Build Coastguard Worker case C_MAX_TIME: /* --max-time */
2280*6236dae4SAndroid Build Coastguard Worker /* specified max time */
2281*6236dae4SAndroid Build Coastguard Worker err = secs2ms(&config->timeout_ms, nextarg);
2282*6236dae4SAndroid Build Coastguard Worker break;
2283*6236dae4SAndroid Build Coastguard Worker case C_MANUAL: /* --manual */
2284*6236dae4SAndroid Build Coastguard Worker if(toggle) { /* --no-manual shows no manual... */
2285*6236dae4SAndroid Build Coastguard Worker #ifndef USE_MANUAL
2286*6236dae4SAndroid Build Coastguard Worker warnf(global,
2287*6236dae4SAndroid Build Coastguard Worker "built-in manual was disabled at build-time");
2288*6236dae4SAndroid Build Coastguard Worker #endif
2289*6236dae4SAndroid Build Coastguard Worker err = PARAM_MANUAL_REQUESTED;
2290*6236dae4SAndroid Build Coastguard Worker }
2291*6236dae4SAndroid Build Coastguard Worker break;
2292*6236dae4SAndroid Build Coastguard Worker case C_NETRC_OPTIONAL: /* --netrc-optional */
2293*6236dae4SAndroid Build Coastguard Worker config->netrc_opt = toggle;
2294*6236dae4SAndroid Build Coastguard Worker break;
2295*6236dae4SAndroid Build Coastguard Worker case C_NETRC_FILE: /* --netrc-file */
2296*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->netrc_file, nextarg, DENY_BLANK);
2297*6236dae4SAndroid Build Coastguard Worker break;
2298*6236dae4SAndroid Build Coastguard Worker case C_NETRC: /* --netrc */
2299*6236dae4SAndroid Build Coastguard Worker /* pick info from .netrc, if this is used for http, curl will
2300*6236dae4SAndroid Build Coastguard Worker automatically enforce user+password with the request */
2301*6236dae4SAndroid Build Coastguard Worker config->netrc = toggle;
2302*6236dae4SAndroid Build Coastguard Worker break;
2303*6236dae4SAndroid Build Coastguard Worker case C_BUFFER: /* --buffer */
2304*6236dae4SAndroid Build Coastguard Worker /* disable the output I/O buffering. note that the option is called
2305*6236dae4SAndroid Build Coastguard Worker --buffer but is mostly used in the negative form: --no-buffer */
2306*6236dae4SAndroid Build Coastguard Worker config->nobuffer = longopt ? !toggle : TRUE;
2307*6236dae4SAndroid Build Coastguard Worker break;
2308*6236dae4SAndroid Build Coastguard Worker case C_REMOTE_NAME_ALL: /* --remote-name-all */
2309*6236dae4SAndroid Build Coastguard Worker config->default_node_flags = toggle ? GETOUT_USEREMOTE : 0;
2310*6236dae4SAndroid Build Coastguard Worker break;
2311*6236dae4SAndroid Build Coastguard Worker case C_OUTPUT_DIR: /* --output-dir */
2312*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->output_dir, nextarg, DENY_BLANK);
2313*6236dae4SAndroid Build Coastguard Worker break;
2314*6236dae4SAndroid Build Coastguard Worker case C_CLOBBER: /* --clobber */
2315*6236dae4SAndroid Build Coastguard Worker config->file_clobber_mode = toggle ? CLOBBER_ALWAYS : CLOBBER_NEVER;
2316*6236dae4SAndroid Build Coastguard Worker break;
2317*6236dae4SAndroid Build Coastguard Worker case C_OUTPUT: /* --output */
2318*6236dae4SAndroid Build Coastguard Worker case C_REMOTE_NAME: /* --remote-name */
2319*6236dae4SAndroid Build Coastguard Worker /* output file */
2320*6236dae4SAndroid Build Coastguard Worker if(!config->url_out)
2321*6236dae4SAndroid Build Coastguard Worker config->url_out = config->url_list;
2322*6236dae4SAndroid Build Coastguard Worker if(config->url_out) {
2323*6236dae4SAndroid Build Coastguard Worker /* there is a node here, if it already is filled-in continue to find
2324*6236dae4SAndroid Build Coastguard Worker an "empty" node */
2325*6236dae4SAndroid Build Coastguard Worker while(config->url_out && (config->url_out->flags & GETOUT_OUTFILE))
2326*6236dae4SAndroid Build Coastguard Worker config->url_out = config->url_out->next;
2327*6236dae4SAndroid Build Coastguard Worker }
2328*6236dae4SAndroid Build Coastguard Worker
2329*6236dae4SAndroid Build Coastguard Worker /* now there might or might not be an available node to fill in! */
2330*6236dae4SAndroid Build Coastguard Worker
2331*6236dae4SAndroid Build Coastguard Worker if(config->url_out)
2332*6236dae4SAndroid Build Coastguard Worker /* existing node */
2333*6236dae4SAndroid Build Coastguard Worker url = config->url_out;
2334*6236dae4SAndroid Build Coastguard Worker else {
2335*6236dae4SAndroid Build Coastguard Worker if(!toggle && !config->default_node_flags)
2336*6236dae4SAndroid Build Coastguard Worker break;
2337*6236dae4SAndroid Build Coastguard Worker /* there was no free node, create one! */
2338*6236dae4SAndroid Build Coastguard Worker config->url_out = url = new_getout(config);
2339*6236dae4SAndroid Build Coastguard Worker }
2340*6236dae4SAndroid Build Coastguard Worker
2341*6236dae4SAndroid Build Coastguard Worker if(!url) {
2342*6236dae4SAndroid Build Coastguard Worker err = PARAM_NO_MEM;
2343*6236dae4SAndroid Build Coastguard Worker break;
2344*6236dae4SAndroid Build Coastguard Worker }
2345*6236dae4SAndroid Build Coastguard Worker
2346*6236dae4SAndroid Build Coastguard Worker /* fill in the outfile */
2347*6236dae4SAndroid Build Coastguard Worker if('o' == letter) {
2348*6236dae4SAndroid Build Coastguard Worker err = getstr(&url->outfile, nextarg, DENY_BLANK);
2349*6236dae4SAndroid Build Coastguard Worker url->flags &= ~GETOUT_USEREMOTE; /* switch off */
2350*6236dae4SAndroid Build Coastguard Worker }
2351*6236dae4SAndroid Build Coastguard Worker else {
2352*6236dae4SAndroid Build Coastguard Worker url->outfile = NULL; /* leave it */
2353*6236dae4SAndroid Build Coastguard Worker if(toggle)
2354*6236dae4SAndroid Build Coastguard Worker url->flags |= GETOUT_USEREMOTE; /* switch on */
2355*6236dae4SAndroid Build Coastguard Worker else
2356*6236dae4SAndroid Build Coastguard Worker url->flags &= ~GETOUT_USEREMOTE; /* switch off */
2357*6236dae4SAndroid Build Coastguard Worker }
2358*6236dae4SAndroid Build Coastguard Worker url->flags |= GETOUT_OUTFILE;
2359*6236dae4SAndroid Build Coastguard Worker break;
2360*6236dae4SAndroid Build Coastguard Worker case C_FTP_PORT: /* --ftp-port */
2361*6236dae4SAndroid Build Coastguard Worker /* This makes the FTP sessions use PORT instead of PASV */
2362*6236dae4SAndroid Build Coastguard Worker /* use <eth0> or <192.168.10.10> style addresses. Anything except
2363*6236dae4SAndroid Build Coastguard Worker this will make us try to get the "default" address.
2364*6236dae4SAndroid Build Coastguard Worker NOTE: this is a changed behavior since the released 4.1!
2365*6236dae4SAndroid Build Coastguard Worker */
2366*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->ftpport, nextarg, DENY_BLANK);
2367*6236dae4SAndroid Build Coastguard Worker break;
2368*6236dae4SAndroid Build Coastguard Worker case C_PROXYTUNNEL: /* --proxytunnel */
2369*6236dae4SAndroid Build Coastguard Worker /* proxy tunnel for non-http protocols */
2370*6236dae4SAndroid Build Coastguard Worker config->proxytunnel = toggle;
2371*6236dae4SAndroid Build Coastguard Worker break;
2372*6236dae4SAndroid Build Coastguard Worker
2373*6236dae4SAndroid Build Coastguard Worker case C_DISABLE: /* --disable */
2374*6236dae4SAndroid Build Coastguard Worker /* if used first, already taken care of, we do it like this so we do not
2375*6236dae4SAndroid Build Coastguard Worker cause an error! */
2376*6236dae4SAndroid Build Coastguard Worker break;
2377*6236dae4SAndroid Build Coastguard Worker case C_QUOTE: /* --quote */
2378*6236dae4SAndroid Build Coastguard Worker /* QUOTE command to send to FTP server */
2379*6236dae4SAndroid Build Coastguard Worker switch(nextarg[0]) {
2380*6236dae4SAndroid Build Coastguard Worker case '-':
2381*6236dae4SAndroid Build Coastguard Worker /* prefixed with a dash makes it a POST TRANSFER one */
2382*6236dae4SAndroid Build Coastguard Worker nextarg++;
2383*6236dae4SAndroid Build Coastguard Worker err = add2list(&config->postquote, nextarg);
2384*6236dae4SAndroid Build Coastguard Worker break;
2385*6236dae4SAndroid Build Coastguard Worker case '+':
2386*6236dae4SAndroid Build Coastguard Worker /* prefixed with a plus makes it a just-before-transfer one */
2387*6236dae4SAndroid Build Coastguard Worker nextarg++;
2388*6236dae4SAndroid Build Coastguard Worker err = add2list(&config->prequote, nextarg);
2389*6236dae4SAndroid Build Coastguard Worker break;
2390*6236dae4SAndroid Build Coastguard Worker default:
2391*6236dae4SAndroid Build Coastguard Worker err = add2list(&config->quote, nextarg);
2392*6236dae4SAndroid Build Coastguard Worker break;
2393*6236dae4SAndroid Build Coastguard Worker }
2394*6236dae4SAndroid Build Coastguard Worker break;
2395*6236dae4SAndroid Build Coastguard Worker case C_RANGE: /* --range */
2396*6236dae4SAndroid Build Coastguard Worker /* Specifying a range WITHOUT A DASH will create an illegal HTTP range
2397*6236dae4SAndroid Build Coastguard Worker (and will not actually be range by definition). The manpage
2398*6236dae4SAndroid Build Coastguard Worker previously claimed that to be a good way, why this code is added to
2399*6236dae4SAndroid Build Coastguard Worker work-around it. */
2400*6236dae4SAndroid Build Coastguard Worker if(ISDIGIT(*nextarg) && !strchr(nextarg, '-')) {
2401*6236dae4SAndroid Build Coastguard Worker char buffer[32];
2402*6236dae4SAndroid Build Coastguard Worker if(curlx_strtoofft(nextarg, NULL, 10, &value)) {
2403*6236dae4SAndroid Build Coastguard Worker warnf(global, "unsupported range point");
2404*6236dae4SAndroid Build Coastguard Worker err = PARAM_BAD_USE;
2405*6236dae4SAndroid Build Coastguard Worker }
2406*6236dae4SAndroid Build Coastguard Worker else {
2407*6236dae4SAndroid Build Coastguard Worker warnf(global,
2408*6236dae4SAndroid Build Coastguard Worker "A specified range MUST include at least one dash (-). "
2409*6236dae4SAndroid Build Coastguard Worker "Appending one for you");
2410*6236dae4SAndroid Build Coastguard Worker msnprintf(buffer, sizeof(buffer), "%" CURL_FORMAT_CURL_OFF_T "-",
2411*6236dae4SAndroid Build Coastguard Worker value);
2412*6236dae4SAndroid Build Coastguard Worker Curl_safefree(config->range);
2413*6236dae4SAndroid Build Coastguard Worker config->range = strdup(buffer);
2414*6236dae4SAndroid Build Coastguard Worker if(!config->range)
2415*6236dae4SAndroid Build Coastguard Worker err = PARAM_NO_MEM;
2416*6236dae4SAndroid Build Coastguard Worker }
2417*6236dae4SAndroid Build Coastguard Worker }
2418*6236dae4SAndroid Build Coastguard Worker else {
2419*6236dae4SAndroid Build Coastguard Worker /* byte range requested */
2420*6236dae4SAndroid Build Coastguard Worker const char *tmp_range = nextarg;
2421*6236dae4SAndroid Build Coastguard Worker while(*tmp_range) {
2422*6236dae4SAndroid Build Coastguard Worker if(!ISDIGIT(*tmp_range) && *tmp_range != '-' && *tmp_range != ',') {
2423*6236dae4SAndroid Build Coastguard Worker warnf(global, "Invalid character is found in given range. "
2424*6236dae4SAndroid Build Coastguard Worker "A specified range MUST have only digits in "
2425*6236dae4SAndroid Build Coastguard Worker "\'start\'-\'stop\'. The server's response to this "
2426*6236dae4SAndroid Build Coastguard Worker "request is uncertain.");
2427*6236dae4SAndroid Build Coastguard Worker break;
2428*6236dae4SAndroid Build Coastguard Worker }
2429*6236dae4SAndroid Build Coastguard Worker tmp_range++;
2430*6236dae4SAndroid Build Coastguard Worker }
2431*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->range, nextarg, DENY_BLANK);
2432*6236dae4SAndroid Build Coastguard Worker }
2433*6236dae4SAndroid Build Coastguard Worker break;
2434*6236dae4SAndroid Build Coastguard Worker case C_REMOTE_TIME: /* --remote-time */
2435*6236dae4SAndroid Build Coastguard Worker /* use remote file's time */
2436*6236dae4SAndroid Build Coastguard Worker config->remote_time = toggle;
2437*6236dae4SAndroid Build Coastguard Worker break;
2438*6236dae4SAndroid Build Coastguard Worker case C_SILENT: /* --silent */
2439*6236dae4SAndroid Build Coastguard Worker global->silent = toggle;
2440*6236dae4SAndroid Build Coastguard Worker break;
2441*6236dae4SAndroid Build Coastguard Worker case C_SKIP_EXISTING: /* --skip-existing */
2442*6236dae4SAndroid Build Coastguard Worker config->skip_existing = toggle;
2443*6236dae4SAndroid Build Coastguard Worker break;
2444*6236dae4SAndroid Build Coastguard Worker case C_SHOW_ERROR: /* --show-error */
2445*6236dae4SAndroid Build Coastguard Worker global->showerror = toggle;
2446*6236dae4SAndroid Build Coastguard Worker break;
2447*6236dae4SAndroid Build Coastguard Worker case C_TELNET_OPTION: /* --telnet-option */
2448*6236dae4SAndroid Build Coastguard Worker /* Telnet options */
2449*6236dae4SAndroid Build Coastguard Worker err = add2list(&config->telnet_options, nextarg);
2450*6236dae4SAndroid Build Coastguard Worker break;
2451*6236dae4SAndroid Build Coastguard Worker case C_UPLOAD_FILE: /* --upload-file */
2452*6236dae4SAndroid Build Coastguard Worker /* we are uploading */
2453*6236dae4SAndroid Build Coastguard Worker if(!config->url_ul)
2454*6236dae4SAndroid Build Coastguard Worker config->url_ul = config->url_list;
2455*6236dae4SAndroid Build Coastguard Worker if(config->url_ul) {
2456*6236dae4SAndroid Build Coastguard Worker /* there is a node here, if it already is filled-in continue to find
2457*6236dae4SAndroid Build Coastguard Worker an "empty" node */
2458*6236dae4SAndroid Build Coastguard Worker while(config->url_ul && (config->url_ul->flags & GETOUT_UPLOAD))
2459*6236dae4SAndroid Build Coastguard Worker config->url_ul = config->url_ul->next;
2460*6236dae4SAndroid Build Coastguard Worker }
2461*6236dae4SAndroid Build Coastguard Worker
2462*6236dae4SAndroid Build Coastguard Worker /* now there might or might not be an available node to fill in! */
2463*6236dae4SAndroid Build Coastguard Worker
2464*6236dae4SAndroid Build Coastguard Worker if(config->url_ul)
2465*6236dae4SAndroid Build Coastguard Worker /* existing node */
2466*6236dae4SAndroid Build Coastguard Worker url = config->url_ul;
2467*6236dae4SAndroid Build Coastguard Worker else
2468*6236dae4SAndroid Build Coastguard Worker /* there was no free node, create one! */
2469*6236dae4SAndroid Build Coastguard Worker config->url_ul = url = new_getout(config);
2470*6236dae4SAndroid Build Coastguard Worker
2471*6236dae4SAndroid Build Coastguard Worker if(!url) {
2472*6236dae4SAndroid Build Coastguard Worker err = PARAM_NO_MEM;
2473*6236dae4SAndroid Build Coastguard Worker break;
2474*6236dae4SAndroid Build Coastguard Worker }
2475*6236dae4SAndroid Build Coastguard Worker
2476*6236dae4SAndroid Build Coastguard Worker url->flags |= GETOUT_UPLOAD; /* mark -T used */
2477*6236dae4SAndroid Build Coastguard Worker if(!*nextarg)
2478*6236dae4SAndroid Build Coastguard Worker url->flags |= GETOUT_NOUPLOAD;
2479*6236dae4SAndroid Build Coastguard Worker else {
2480*6236dae4SAndroid Build Coastguard Worker /* "-" equals stdin, but keep the string around for now */
2481*6236dae4SAndroid Build Coastguard Worker err = getstr(&url->infile, nextarg, DENY_BLANK);
2482*6236dae4SAndroid Build Coastguard Worker }
2483*6236dae4SAndroid Build Coastguard Worker break;
2484*6236dae4SAndroid Build Coastguard Worker case C_USER: /* --user */
2485*6236dae4SAndroid Build Coastguard Worker /* user:password */
2486*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->userpwd, nextarg, ALLOW_BLANK);
2487*6236dae4SAndroid Build Coastguard Worker cleanarg(clearthis);
2488*6236dae4SAndroid Build Coastguard Worker break;
2489*6236dae4SAndroid Build Coastguard Worker case C_PROXY_USER: /* --proxy-user */
2490*6236dae4SAndroid Build Coastguard Worker /* Proxy user:password */
2491*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->proxyuserpwd, nextarg, ALLOW_BLANK);
2492*6236dae4SAndroid Build Coastguard Worker cleanarg(clearthis);
2493*6236dae4SAndroid Build Coastguard Worker break;
2494*6236dae4SAndroid Build Coastguard Worker case C_VERBOSE: /* --verbose */
2495*6236dae4SAndroid Build Coastguard Worker /* This option is a super-boolean with side effect when applied
2496*6236dae4SAndroid Build Coastguard Worker * more than once in the same argument flag, like `-vvv`. */
2497*6236dae4SAndroid Build Coastguard Worker if(!toggle) {
2498*6236dae4SAndroid Build Coastguard Worker global->verbosity = 0;
2499*6236dae4SAndroid Build Coastguard Worker if(set_trace_config(global, "-all"))
2500*6236dae4SAndroid Build Coastguard Worker err = PARAM_NO_MEM;
2501*6236dae4SAndroid Build Coastguard Worker global->tracetype = TRACE_NONE;
2502*6236dae4SAndroid Build Coastguard Worker break;
2503*6236dae4SAndroid Build Coastguard Worker }
2504*6236dae4SAndroid Build Coastguard Worker else if(!nopts) {
2505*6236dae4SAndroid Build Coastguard Worker /* fist `-v` in an argument resets to base verbosity */
2506*6236dae4SAndroid Build Coastguard Worker global->verbosity = 0;
2507*6236dae4SAndroid Build Coastguard Worker if(set_trace_config(global, "-all")) {
2508*6236dae4SAndroid Build Coastguard Worker err = PARAM_NO_MEM;
2509*6236dae4SAndroid Build Coastguard Worker break;
2510*6236dae4SAndroid Build Coastguard Worker }
2511*6236dae4SAndroid Build Coastguard Worker }
2512*6236dae4SAndroid Build Coastguard Worker /* the '%' thing here will cause the trace get sent to stderr */
2513*6236dae4SAndroid Build Coastguard Worker switch(global->verbosity) {
2514*6236dae4SAndroid Build Coastguard Worker case 0:
2515*6236dae4SAndroid Build Coastguard Worker global->verbosity = 1;
2516*6236dae4SAndroid Build Coastguard Worker Curl_safefree(global->trace_dump);
2517*6236dae4SAndroid Build Coastguard Worker global->trace_dump = strdup("%");
2518*6236dae4SAndroid Build Coastguard Worker if(!global->trace_dump)
2519*6236dae4SAndroid Build Coastguard Worker err = PARAM_NO_MEM;
2520*6236dae4SAndroid Build Coastguard Worker else {
2521*6236dae4SAndroid Build Coastguard Worker if(global->tracetype && (global->tracetype != TRACE_PLAIN))
2522*6236dae4SAndroid Build Coastguard Worker warnf(global,
2523*6236dae4SAndroid Build Coastguard Worker "-v, --verbose overrides an earlier trace option");
2524*6236dae4SAndroid Build Coastguard Worker global->tracetype = TRACE_PLAIN;
2525*6236dae4SAndroid Build Coastguard Worker }
2526*6236dae4SAndroid Build Coastguard Worker break;
2527*6236dae4SAndroid Build Coastguard Worker case 1:
2528*6236dae4SAndroid Build Coastguard Worker global->verbosity = 2;
2529*6236dae4SAndroid Build Coastguard Worker if(set_trace_config(global, "ids,time,protocol"))
2530*6236dae4SAndroid Build Coastguard Worker err = PARAM_NO_MEM;
2531*6236dae4SAndroid Build Coastguard Worker break;
2532*6236dae4SAndroid Build Coastguard Worker case 2:
2533*6236dae4SAndroid Build Coastguard Worker global->verbosity = 3;
2534*6236dae4SAndroid Build Coastguard Worker global->tracetype = TRACE_ASCII;
2535*6236dae4SAndroid Build Coastguard Worker if(set_trace_config(global, "ssl,read,write"))
2536*6236dae4SAndroid Build Coastguard Worker err = PARAM_NO_MEM;
2537*6236dae4SAndroid Build Coastguard Worker break;
2538*6236dae4SAndroid Build Coastguard Worker case 3:
2539*6236dae4SAndroid Build Coastguard Worker global->verbosity = 4;
2540*6236dae4SAndroid Build Coastguard Worker if(set_trace_config(global, "network"))
2541*6236dae4SAndroid Build Coastguard Worker err = PARAM_NO_MEM;
2542*6236dae4SAndroid Build Coastguard Worker break;
2543*6236dae4SAndroid Build Coastguard Worker default:
2544*6236dae4SAndroid Build Coastguard Worker /* no effect for now */
2545*6236dae4SAndroid Build Coastguard Worker break;
2546*6236dae4SAndroid Build Coastguard Worker }
2547*6236dae4SAndroid Build Coastguard Worker break;
2548*6236dae4SAndroid Build Coastguard Worker case C_VERSION: /* --version */
2549*6236dae4SAndroid Build Coastguard Worker if(toggle) /* --no-version yields no output! */
2550*6236dae4SAndroid Build Coastguard Worker err = PARAM_VERSION_INFO_REQUESTED;
2551*6236dae4SAndroid Build Coastguard Worker break;
2552*6236dae4SAndroid Build Coastguard Worker case C_WRITE_OUT: /* --write-out */
2553*6236dae4SAndroid Build Coastguard Worker /* get the output string */
2554*6236dae4SAndroid Build Coastguard Worker if('@' == *nextarg) {
2555*6236dae4SAndroid Build Coastguard Worker /* the data begins with a '@' letter, it means that a filename
2556*6236dae4SAndroid Build Coastguard Worker or - (stdin) follows */
2557*6236dae4SAndroid Build Coastguard Worker FILE *file;
2558*6236dae4SAndroid Build Coastguard Worker const char *fname;
2559*6236dae4SAndroid Build Coastguard Worker nextarg++; /* pass the @ */
2560*6236dae4SAndroid Build Coastguard Worker if(!strcmp("-", nextarg)) {
2561*6236dae4SAndroid Build Coastguard Worker fname = "<stdin>";
2562*6236dae4SAndroid Build Coastguard Worker file = stdin;
2563*6236dae4SAndroid Build Coastguard Worker }
2564*6236dae4SAndroid Build Coastguard Worker else {
2565*6236dae4SAndroid Build Coastguard Worker fname = nextarg;
2566*6236dae4SAndroid Build Coastguard Worker file = fopen(fname, FOPEN_READTEXT);
2567*6236dae4SAndroid Build Coastguard Worker if(!file) {
2568*6236dae4SAndroid Build Coastguard Worker errorf(global, "Failed to open %s", fname);
2569*6236dae4SAndroid Build Coastguard Worker err = PARAM_READ_ERROR;
2570*6236dae4SAndroid Build Coastguard Worker break;
2571*6236dae4SAndroid Build Coastguard Worker }
2572*6236dae4SAndroid Build Coastguard Worker }
2573*6236dae4SAndroid Build Coastguard Worker Curl_safefree(config->writeout);
2574*6236dae4SAndroid Build Coastguard Worker err = file2string(&config->writeout, file);
2575*6236dae4SAndroid Build Coastguard Worker if(file && (file != stdin))
2576*6236dae4SAndroid Build Coastguard Worker fclose(file);
2577*6236dae4SAndroid Build Coastguard Worker if(err)
2578*6236dae4SAndroid Build Coastguard Worker break;
2579*6236dae4SAndroid Build Coastguard Worker if(!config->writeout)
2580*6236dae4SAndroid Build Coastguard Worker warnf(global, "Failed to read %s", fname);
2581*6236dae4SAndroid Build Coastguard Worker }
2582*6236dae4SAndroid Build Coastguard Worker else
2583*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->writeout, nextarg, ALLOW_BLANK);
2584*6236dae4SAndroid Build Coastguard Worker break;
2585*6236dae4SAndroid Build Coastguard Worker case C_PREPROXY: /* --preproxy */
2586*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->preproxy, nextarg, DENY_BLANK);
2587*6236dae4SAndroid Build Coastguard Worker break;
2588*6236dae4SAndroid Build Coastguard Worker case C_PROXY: /* --proxy */
2589*6236dae4SAndroid Build Coastguard Worker /* --proxy */
2590*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->proxy, nextarg, ALLOW_BLANK);
2591*6236dae4SAndroid Build Coastguard Worker if(config->proxyver != CURLPROXY_HTTPS2)
2592*6236dae4SAndroid Build Coastguard Worker config->proxyver = CURLPROXY_HTTP;
2593*6236dae4SAndroid Build Coastguard Worker break;
2594*6236dae4SAndroid Build Coastguard Worker case C_REQUEST: /* --request */
2595*6236dae4SAndroid Build Coastguard Worker /* set custom request */
2596*6236dae4SAndroid Build Coastguard Worker err = getstr(&config->customrequest, nextarg, DENY_BLANK);
2597*6236dae4SAndroid Build Coastguard Worker break;
2598*6236dae4SAndroid Build Coastguard Worker case C_SPEED_TIME: /* --speed-time */
2599*6236dae4SAndroid Build Coastguard Worker /* low speed time */
2600*6236dae4SAndroid Build Coastguard Worker err = str2unum(&config->low_speed_time, nextarg);
2601*6236dae4SAndroid Build Coastguard Worker if(!err && !config->low_speed_limit)
2602*6236dae4SAndroid Build Coastguard Worker config->low_speed_limit = 1;
2603*6236dae4SAndroid Build Coastguard Worker break;
2604*6236dae4SAndroid Build Coastguard Worker case C_SPEED_LIMIT: /* --speed-limit */
2605*6236dae4SAndroid Build Coastguard Worker /* low speed limit */
2606*6236dae4SAndroid Build Coastguard Worker err = str2unum(&config->low_speed_limit, nextarg);
2607*6236dae4SAndroid Build Coastguard Worker if(!err && !config->low_speed_time)
2608*6236dae4SAndroid Build Coastguard Worker config->low_speed_time = 30;
2609*6236dae4SAndroid Build Coastguard Worker break;
2610*6236dae4SAndroid Build Coastguard Worker case C_PARALLEL: /* --parallel */
2611*6236dae4SAndroid Build Coastguard Worker global->parallel = toggle;
2612*6236dae4SAndroid Build Coastguard Worker break;
2613*6236dae4SAndroid Build Coastguard Worker case C_PARALLEL_MAX: { /* --parallel-max */
2614*6236dae4SAndroid Build Coastguard Worker long val;
2615*6236dae4SAndroid Build Coastguard Worker err = str2unum(&val, nextarg);
2616*6236dae4SAndroid Build Coastguard Worker if(err)
2617*6236dae4SAndroid Build Coastguard Worker break;
2618*6236dae4SAndroid Build Coastguard Worker if(val > MAX_PARALLEL)
2619*6236dae4SAndroid Build Coastguard Worker global->parallel_max = MAX_PARALLEL;
2620*6236dae4SAndroid Build Coastguard Worker else if(val < 1)
2621*6236dae4SAndroid Build Coastguard Worker global->parallel_max = PARALLEL_DEFAULT;
2622*6236dae4SAndroid Build Coastguard Worker else
2623*6236dae4SAndroid Build Coastguard Worker global->parallel_max = (unsigned short)val;
2624*6236dae4SAndroid Build Coastguard Worker break;
2625*6236dae4SAndroid Build Coastguard Worker }
2626*6236dae4SAndroid Build Coastguard Worker case C_PARALLEL_IMMEDIATE: /* --parallel-immediate */
2627*6236dae4SAndroid Build Coastguard Worker global->parallel_connect = toggle;
2628*6236dae4SAndroid Build Coastguard Worker break;
2629*6236dae4SAndroid Build Coastguard Worker case C_TIME_COND: /* --time-cond */
2630*6236dae4SAndroid Build Coastguard Worker switch(*nextarg) {
2631*6236dae4SAndroid Build Coastguard Worker case '+':
2632*6236dae4SAndroid Build Coastguard Worker nextarg++;
2633*6236dae4SAndroid Build Coastguard Worker FALLTHROUGH();
2634*6236dae4SAndroid Build Coastguard Worker default:
2635*6236dae4SAndroid Build Coastguard Worker /* If-Modified-Since: (section 14.28 in RFC2068) */
2636*6236dae4SAndroid Build Coastguard Worker config->timecond = CURL_TIMECOND_IFMODSINCE;
2637*6236dae4SAndroid Build Coastguard Worker break;
2638*6236dae4SAndroid Build Coastguard Worker case '-':
2639*6236dae4SAndroid Build Coastguard Worker /* If-Unmodified-Since: (section 14.24 in RFC2068) */
2640*6236dae4SAndroid Build Coastguard Worker config->timecond = CURL_TIMECOND_IFUNMODSINCE;
2641*6236dae4SAndroid Build Coastguard Worker nextarg++;
2642*6236dae4SAndroid Build Coastguard Worker break;
2643*6236dae4SAndroid Build Coastguard Worker case '=':
2644*6236dae4SAndroid Build Coastguard Worker /* Last-Modified: (section 14.29 in RFC2068) */
2645*6236dae4SAndroid Build Coastguard Worker config->timecond = CURL_TIMECOND_LASTMOD;
2646*6236dae4SAndroid Build Coastguard Worker nextarg++;
2647*6236dae4SAndroid Build Coastguard Worker break;
2648*6236dae4SAndroid Build Coastguard Worker }
2649*6236dae4SAndroid Build Coastguard Worker config->condtime = (curl_off_t)curl_getdate(nextarg, NULL);
2650*6236dae4SAndroid Build Coastguard Worker if(-1 == config->condtime) {
2651*6236dae4SAndroid Build Coastguard Worker /* now let's see if it is a filename to get the time from instead! */
2652*6236dae4SAndroid Build Coastguard Worker rc = getfiletime(nextarg, global, &value);
2653*6236dae4SAndroid Build Coastguard Worker if(!rc)
2654*6236dae4SAndroid Build Coastguard Worker /* pull the time out from the file */
2655*6236dae4SAndroid Build Coastguard Worker config->condtime = value;
2656*6236dae4SAndroid Build Coastguard Worker else {
2657*6236dae4SAndroid Build Coastguard Worker /* failed, remove time condition */
2658*6236dae4SAndroid Build Coastguard Worker config->timecond = CURL_TIMECOND_NONE;
2659*6236dae4SAndroid Build Coastguard Worker warnf(global,
2660*6236dae4SAndroid Build Coastguard Worker "Illegal date format for -z, --time-cond (and not "
2661*6236dae4SAndroid Build Coastguard Worker "a filename). Disabling time condition. "
2662*6236dae4SAndroid Build Coastguard Worker "See curl_getdate(3) for valid date syntax.");
2663*6236dae4SAndroid Build Coastguard Worker }
2664*6236dae4SAndroid Build Coastguard Worker }
2665*6236dae4SAndroid Build Coastguard Worker break;
2666*6236dae4SAndroid Build Coastguard Worker case C_MPTCP: /* --mptcp */
2667*6236dae4SAndroid Build Coastguard Worker config->mptcp = TRUE;
2668*6236dae4SAndroid Build Coastguard Worker break;
2669*6236dae4SAndroid Build Coastguard Worker default: /* unknown flag */
2670*6236dae4SAndroid Build Coastguard Worker err = PARAM_OPTION_UNKNOWN;
2671*6236dae4SAndroid Build Coastguard Worker break;
2672*6236dae4SAndroid Build Coastguard Worker }
2673*6236dae4SAndroid Build Coastguard Worker a = NULL;
2674*6236dae4SAndroid Build Coastguard Worker ++nopts; /* processed one option from `flag` input, loop for more */
2675*6236dae4SAndroid Build Coastguard Worker } while(!longopt && !singleopt && *++parse && !*usedarg && !err);
2676*6236dae4SAndroid Build Coastguard Worker
2677*6236dae4SAndroid Build Coastguard Worker error:
2678*6236dae4SAndroid Build Coastguard Worker if(nextalloc)
2679*6236dae4SAndroid Build Coastguard Worker free(nextarg);
2680*6236dae4SAndroid Build Coastguard Worker return err;
2681*6236dae4SAndroid Build Coastguard Worker }
2682*6236dae4SAndroid Build Coastguard Worker
parse_args(struct GlobalConfig * global,int argc,argv_item_t argv[])2683*6236dae4SAndroid Build Coastguard Worker ParameterError parse_args(struct GlobalConfig *global, int argc,
2684*6236dae4SAndroid Build Coastguard Worker argv_item_t argv[])
2685*6236dae4SAndroid Build Coastguard Worker {
2686*6236dae4SAndroid Build Coastguard Worker int i;
2687*6236dae4SAndroid Build Coastguard Worker bool stillflags;
2688*6236dae4SAndroid Build Coastguard Worker char *orig_opt = NULL;
2689*6236dae4SAndroid Build Coastguard Worker ParameterError result = PARAM_OK;
2690*6236dae4SAndroid Build Coastguard Worker struct OperationConfig *config = global->first;
2691*6236dae4SAndroid Build Coastguard Worker
2692*6236dae4SAndroid Build Coastguard Worker for(i = 1, stillflags = TRUE; i < argc && !result; i++) {
2693*6236dae4SAndroid Build Coastguard Worker orig_opt = curlx_convert_tchar_to_UTF8(argv[i]);
2694*6236dae4SAndroid Build Coastguard Worker if(!orig_opt)
2695*6236dae4SAndroid Build Coastguard Worker return PARAM_NO_MEM;
2696*6236dae4SAndroid Build Coastguard Worker
2697*6236dae4SAndroid Build Coastguard Worker if(stillflags && ('-' == orig_opt[0])) {
2698*6236dae4SAndroid Build Coastguard Worker bool passarg;
2699*6236dae4SAndroid Build Coastguard Worker
2700*6236dae4SAndroid Build Coastguard Worker if(!strcmp("--", orig_opt))
2701*6236dae4SAndroid Build Coastguard Worker /* This indicates the end of the flags and thus enables the
2702*6236dae4SAndroid Build Coastguard Worker following (URL) argument to start with -. */
2703*6236dae4SAndroid Build Coastguard Worker stillflags = FALSE;
2704*6236dae4SAndroid Build Coastguard Worker else {
2705*6236dae4SAndroid Build Coastguard Worker char *nextarg = NULL;
2706*6236dae4SAndroid Build Coastguard Worker if(i < (argc - 1)) {
2707*6236dae4SAndroid Build Coastguard Worker nextarg = curlx_convert_tchar_to_UTF8(argv[i + 1]);
2708*6236dae4SAndroid Build Coastguard Worker if(!nextarg) {
2709*6236dae4SAndroid Build Coastguard Worker curlx_unicodefree(orig_opt);
2710*6236dae4SAndroid Build Coastguard Worker return PARAM_NO_MEM;
2711*6236dae4SAndroid Build Coastguard Worker }
2712*6236dae4SAndroid Build Coastguard Worker }
2713*6236dae4SAndroid Build Coastguard Worker
2714*6236dae4SAndroid Build Coastguard Worker result = getparameter(orig_opt, nextarg, argv[i + 1], &passarg,
2715*6236dae4SAndroid Build Coastguard Worker global, config);
2716*6236dae4SAndroid Build Coastguard Worker
2717*6236dae4SAndroid Build Coastguard Worker curlx_unicodefree(nextarg);
2718*6236dae4SAndroid Build Coastguard Worker config = global->last;
2719*6236dae4SAndroid Build Coastguard Worker if(result == PARAM_NEXT_OPERATION) {
2720*6236dae4SAndroid Build Coastguard Worker /* Reset result as PARAM_NEXT_OPERATION is only used here and not
2721*6236dae4SAndroid Build Coastguard Worker returned from this function */
2722*6236dae4SAndroid Build Coastguard Worker result = PARAM_OK;
2723*6236dae4SAndroid Build Coastguard Worker
2724*6236dae4SAndroid Build Coastguard Worker if(config->url_list && config->url_list->url) {
2725*6236dae4SAndroid Build Coastguard Worker /* Allocate the next config */
2726*6236dae4SAndroid Build Coastguard Worker config->next = malloc(sizeof(struct OperationConfig));
2727*6236dae4SAndroid Build Coastguard Worker if(config->next) {
2728*6236dae4SAndroid Build Coastguard Worker /* Initialise the newly created config */
2729*6236dae4SAndroid Build Coastguard Worker config_init(config->next);
2730*6236dae4SAndroid Build Coastguard Worker
2731*6236dae4SAndroid Build Coastguard Worker /* Set the global config pointer */
2732*6236dae4SAndroid Build Coastguard Worker config->next->global = global;
2733*6236dae4SAndroid Build Coastguard Worker
2734*6236dae4SAndroid Build Coastguard Worker /* Update the last config pointer */
2735*6236dae4SAndroid Build Coastguard Worker global->last = config->next;
2736*6236dae4SAndroid Build Coastguard Worker
2737*6236dae4SAndroid Build Coastguard Worker /* Move onto the new config */
2738*6236dae4SAndroid Build Coastguard Worker config->next->prev = config;
2739*6236dae4SAndroid Build Coastguard Worker config = config->next;
2740*6236dae4SAndroid Build Coastguard Worker }
2741*6236dae4SAndroid Build Coastguard Worker else
2742*6236dae4SAndroid Build Coastguard Worker result = PARAM_NO_MEM;
2743*6236dae4SAndroid Build Coastguard Worker }
2744*6236dae4SAndroid Build Coastguard Worker else {
2745*6236dae4SAndroid Build Coastguard Worker errorf(global, "missing URL before --next");
2746*6236dae4SAndroid Build Coastguard Worker result = PARAM_BAD_USE;
2747*6236dae4SAndroid Build Coastguard Worker }
2748*6236dae4SAndroid Build Coastguard Worker }
2749*6236dae4SAndroid Build Coastguard Worker else if(!result && passarg)
2750*6236dae4SAndroid Build Coastguard Worker i++; /* we are supposed to skip this */
2751*6236dae4SAndroid Build Coastguard Worker }
2752*6236dae4SAndroid Build Coastguard Worker }
2753*6236dae4SAndroid Build Coastguard Worker else {
2754*6236dae4SAndroid Build Coastguard Worker bool used;
2755*6236dae4SAndroid Build Coastguard Worker
2756*6236dae4SAndroid Build Coastguard Worker /* Just add the URL please */
2757*6236dae4SAndroid Build Coastguard Worker result = getparameter("--url", orig_opt, argv[i], &used, global, config);
2758*6236dae4SAndroid Build Coastguard Worker }
2759*6236dae4SAndroid Build Coastguard Worker
2760*6236dae4SAndroid Build Coastguard Worker if(!result)
2761*6236dae4SAndroid Build Coastguard Worker curlx_unicodefree(orig_opt);
2762*6236dae4SAndroid Build Coastguard Worker }
2763*6236dae4SAndroid Build Coastguard Worker
2764*6236dae4SAndroid Build Coastguard Worker if(!result && config->content_disposition) {
2765*6236dae4SAndroid Build Coastguard Worker if(config->resume_from_current)
2766*6236dae4SAndroid Build Coastguard Worker result = PARAM_CONTDISP_RESUME_FROM;
2767*6236dae4SAndroid Build Coastguard Worker }
2768*6236dae4SAndroid Build Coastguard Worker
2769*6236dae4SAndroid Build Coastguard Worker if(result && result != PARAM_HELP_REQUESTED &&
2770*6236dae4SAndroid Build Coastguard Worker result != PARAM_MANUAL_REQUESTED &&
2771*6236dae4SAndroid Build Coastguard Worker result != PARAM_VERSION_INFO_REQUESTED &&
2772*6236dae4SAndroid Build Coastguard Worker result != PARAM_ENGINES_REQUESTED &&
2773*6236dae4SAndroid Build Coastguard Worker result != PARAM_CA_EMBED_REQUESTED) {
2774*6236dae4SAndroid Build Coastguard Worker const char *reason = param2text(result);
2775*6236dae4SAndroid Build Coastguard Worker
2776*6236dae4SAndroid Build Coastguard Worker if(orig_opt && strcmp(":", orig_opt))
2777*6236dae4SAndroid Build Coastguard Worker helpf(tool_stderr, "option %s: %s", orig_opt, reason);
2778*6236dae4SAndroid Build Coastguard Worker else
2779*6236dae4SAndroid Build Coastguard Worker helpf(tool_stderr, "%s", reason);
2780*6236dae4SAndroid Build Coastguard Worker }
2781*6236dae4SAndroid Build Coastguard Worker
2782*6236dae4SAndroid Build Coastguard Worker curlx_unicodefree(orig_opt);
2783*6236dae4SAndroid Build Coastguard Worker return result;
2784*6236dae4SAndroid Build Coastguard Worker }
2785