1e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/***************************************************************************
2e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET *                                  _   _ ____  _
3e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET *  Project                     ___| | | |  _ \| |
4e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET *                             / __| | | | |_) | |
5e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET *                            | (__| |_| |  _ <| |___
6e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET *                             \___|\___/|_| \_\_____|
7e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET *
8e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
9e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET *
10e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * This software is licensed as described in the file COPYING, which
11e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * you should have received as part of this distribution. The terms
12e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * are also available at http://curl.haxx.se/docs/copyright.html.
13e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET *
14e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * copies of the Software, and permit persons to whom the Software is
16e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * furnished to do so, under the terms of the COPYING file.
17e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET *
18e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * KIND, either express or implied.
20e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET *
21e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET ***************************************************************************/
22e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#include "tool_setup.h"
23e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
24e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#ifndef CURL_DISABLE_LIBCURL_OPTION
25e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
26e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define ENABLE_CURLX_PRINTF
27e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* use our own printf() functions */
28e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#include "curlx.h"
29e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
30e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#include "tool_cfgable.h"
31e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#include "tool_easysrc.h"
32e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#include "tool_setopt.h"
33e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
34e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#include "memdebug.h" /* keep this as LAST include */
35e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
36e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* Lookup tables for converting setopt values back to symbols */
37e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* For enums, values may be in any order. */
38e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* For bit masks, put combinations first, then single bits, */
39e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* and finally any "NONE" value. */
40e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
41e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define NV(e) {#e, e}
42e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define NV1(e, v) {#e, (v)}
43e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define NVEND {NULL, 0}         /* sentinel to mark end of list */
44e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
45e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETconst NameValue setopt_nv_CURLPROXY[] = {
46e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROXY_HTTP),
47e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROXY_HTTP_1_0),
48e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROXY_SOCKS4),
49e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROXY_SOCKS5),
50e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROXY_SOCKS4A),
51e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROXY_SOCKS5_HOSTNAME),
52e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NVEND,
53e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET};
54e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
55e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETconst NameValueUnsigned setopt_nv_CURLAUTH[] = {
56e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLAUTH_ANY),             /* combination */
57e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLAUTH_ANYSAFE),         /* combination */
58e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLAUTH_BASIC),
59e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLAUTH_DIGEST),
60e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLAUTH_GSSNEGOTIATE),
61e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLAUTH_NTLM),
62e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLAUTH_DIGEST_IE),
63e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLAUTH_NTLM_WB),
64e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLAUTH_ONLY),
65e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLAUTH_NONE),
66e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NVEND,
67e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET};
68e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
69e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETconst NameValue setopt_nv_CURL_HTTP_VERSION[] = {
70e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURL_HTTP_VERSION_NONE),
71e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURL_HTTP_VERSION_1_0),
72e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURL_HTTP_VERSION_1_1),
73e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NVEND,
74e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET};
75e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
76e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETconst NameValue setopt_nv_CURL_SSLVERSION[] = {
77e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURL_SSLVERSION_DEFAULT),
78e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURL_SSLVERSION_TLSv1),
79e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURL_SSLVERSION_SSLv2),
80e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURL_SSLVERSION_SSLv3),
81e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURL_SSLVERSION_TLSv1_0),
82e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURL_SSLVERSION_TLSv1_1),
83e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURL_SSLVERSION_TLSv1_2),
84e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NVEND,
85e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET};
86e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
87e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETconst NameValue setopt_nv_CURL_TIMECOND[] = {
88e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURL_TIMECOND_IFMODSINCE),
89e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURL_TIMECOND_IFUNMODSINCE),
90e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURL_TIMECOND_LASTMOD),
91e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURL_TIMECOND_NONE),
92e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NVEND,
93e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET};
94e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
95e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETconst NameValue setopt_nv_CURLFTPSSL_CCC[] = {
96e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLFTPSSL_CCC_NONE),
97e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLFTPSSL_CCC_PASSIVE),
98e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLFTPSSL_CCC_ACTIVE),
99e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NVEND,
100e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET};
101e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
102e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETconst NameValue setopt_nv_CURLUSESSL[] = {
103e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLUSESSL_NONE),
104e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLUSESSL_TRY),
105e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLUSESSL_CONTROL),
106e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLUSESSL_ALL),
107e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NVEND,
108e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET};
109e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
110e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETconst NameValue setopt_nv_CURL_NETRC[] = {
111e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURL_NETRC_IGNORED),
112e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURL_NETRC_OPTIONAL),
113e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURL_NETRC_REQUIRED),
114e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NVEND,
115e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET};
116e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
117e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* These mappings essentially triplicated - see
118e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * tool_libinfo.c and tool_paramhlp.c */
119e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETconst NameValue setopt_nv_CURLPROTO[] = {
120e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROTO_ALL),            /* combination */
121e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROTO_DICT),
122e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROTO_FILE),
123e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROTO_FTP),
124e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROTO_FTPS),
125e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROTO_GOPHER),
126e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROTO_HTTP),
127e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROTO_HTTPS),
128e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROTO_IMAP),
129e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROTO_IMAPS),
130e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROTO_LDAP),
131e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROTO_LDAPS),
132e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROTO_POP3),
133e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROTO_POP3S),
134e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROTO_RTSP),
135e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROTO_SCP),
136e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROTO_SFTP),
137e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROTO_SMB),
138e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROTO_SMBS),
139e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROTO_SMTP),
140e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROTO_SMTPS),
141e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROTO_TELNET),
142e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV(CURLPROTO_TFTP),
143e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NVEND,
144e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET};
145e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
146e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* These options have non-zero default values. */
147e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETstatic const NameValue setopt_nv_CURLNONZERODEFAULTS[] = {
148e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV1(CURLOPT_SSL_VERIFYPEER, 1),
149e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV1(CURLOPT_SSL_VERIFYHOST, 1),
150e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV1(CURLOPT_SSL_ENABLE_NPN, 1),
151e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NV1(CURLOPT_SSL_ENABLE_ALPN, 1),
152e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  NVEND
153e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET};
154e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
155e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* Format and add code; jump to nomem on malloc error */
156e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define ADD(args) do { \
157e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  ret = easysrc_add args; \
158e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(ret) \
159e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    goto nomem; \
160e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} WHILE_FALSE
161e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define ADDF(args) do { \
162e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  ret = easysrc_addf args; \
163e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(ret) \
164e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    goto nomem; \
165e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} WHILE_FALSE
166e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
167e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define DECL0(s) ADD((&easysrc_decl, s))
168e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define DECL1(f,a) ADDF((&easysrc_decl, f,a))
169e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
170e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define DATA0(s) ADD((&easysrc_data, s))
171e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define DATA1(f,a) ADDF((&easysrc_data, f,a))
172e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define DATA2(f,a,b) ADDF((&easysrc_data, f,a,b))
173e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define DATA3(f,a,b,c) ADDF((&easysrc_data, f,a,b,c))
174e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
175e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define CODE0(s) ADD((&easysrc_code, s))
176e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define CODE1(f,a) ADDF((&easysrc_code, f,a))
177e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define CODE2(f,a,b) ADDF((&easysrc_code, f,a,b))
178e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define CODE3(f,a,b,c) ADDF((&easysrc_code, f,a,b,c))
179e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
180e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define CLEAN0(s) ADD((&easysrc_clean, s))
181e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define CLEAN1(f,a) ADDF((&easysrc_clean, f,a))
182e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
183e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define REM0(s) ADD((&easysrc_toohard, s))
184e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define REM1(f,a) ADDF((&easysrc_toohard, f,a))
185e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define REM2(f,a,b) ADDF((&easysrc_toohard, f,a,b))
186e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
187e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* Escape string to C string syntax.  Return NULL if out of memory.
188e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * Is this correct for those wacky EBCDIC guys? */
189e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETstatic char *c_escape(const char *str)
190e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET{
191e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  size_t len = 0;
192e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  const char *s;
193e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  unsigned char c;
194e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  char *escaped, *e;
195e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  /* Allocate space based on worst-case */
196e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  len = strlen(str);
197e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  escaped = malloc(4 * len + 1);
198e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(!escaped)
199e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    return NULL;
200e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
201e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  e = escaped;
202e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  for(s=str; (c=*s) != '\0'; s++) {
203e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    if(c=='\n') {
204e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      strcpy(e, "\\n");
205e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      e += 2;
206e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    }
207e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    else if(c=='\r') {
208e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      strcpy(e, "\\r");
209e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      e += 2;
210e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    }
211e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    else if(c=='\t') {
212e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      strcpy(e, "\\t");
213e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      e += 2;
214e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    }
215e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    else if(c=='\\') {
216e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      strcpy(e, "\\\\");
217e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      e += 2;
218e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    }
219e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    else if(c=='"') {
220e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      strcpy(e, "\\\"");
221e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      e += 2;
222e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    }
223e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    else if(! isprint(c)) {
224e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      snprintf(e, 4, "\\%03o", c);
225e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      e += 4;
226e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    }
227e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    else
228e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      *e++ = c;
229e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  }
230e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  *e = '\0';
231e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  return escaped;
232e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET}
233e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
234e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* setopt wrapper for enum types */
235e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETCURLcode tool_setopt_enum(CURL *curl, struct GlobalConfig *config,
236e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET                          const char *name, CURLoption tag,
237e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET                          const NameValue *nvlist, long lval)
238e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET{
239e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  CURLcode ret = CURLE_OK;
240e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  bool skip = FALSE;
241e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
242e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  ret = curl_easy_setopt(curl, tag, lval);
243e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(!lval)
244e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    skip = TRUE;
245e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
246e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(config->libcurl && !skip && !ret) {
247e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    /* we only use this for real if --libcurl was used */
248e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    const NameValue *nv = NULL;
249e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    for(nv=nvlist; nv->name; nv++) {
250e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      if(nv->value == lval) break; /* found it */
251e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    }
252e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    if(! nv->name) {
253e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      /* If no definition was found, output an explicit value.
254e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET       * This could happen if new values are defined and used
255e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET       * but the NameValue list is not updated. */
256e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      CODE2("curl_easy_setopt(hnd, %s, %ldL);", name, lval);
257e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    }
258e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    else {
259e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      CODE2("curl_easy_setopt(hnd, %s, (long)%s);", name, nv->name);
260e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    }
261e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  }
262e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
263e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET nomem:
264e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  return ret;
265e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET}
266e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
267e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* setopt wrapper for flags */
268e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETCURLcode tool_setopt_flags(CURL *curl, struct GlobalConfig *config,
269e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET                           const char *name, CURLoption tag,
270e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET                           const NameValue *nvlist, long lval)
271e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET{
272e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  CURLcode ret = CURLE_OK;
273e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  bool skip = FALSE;
274e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
275e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  ret = curl_easy_setopt(curl, tag, lval);
276e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(!lval)
277e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    skip = TRUE;
278e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
279e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(config->libcurl && !skip && !ret) {
280e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    /* we only use this for real if --libcurl was used */
281e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    char preamble[80];          /* should accommodate any symbol name */
282e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    long rest = lval;           /* bits not handled yet */
283e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    const NameValue *nv = NULL;
284e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    snprintf(preamble, sizeof(preamble),
285e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET             "curl_easy_setopt(hnd, %s, ", name);
286e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    for(nv=nvlist; nv->name; nv++) {
287e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      if((nv->value & ~ rest) == 0) {
288e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        /* all value flags contained in rest */
289e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        rest &= ~ nv->value;    /* remove bits handled here */
290e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        CODE3("%s(long)%s%s",
291e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET              preamble, nv->name, rest ? " |" : ");");
292e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        if(!rest)
293e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET          break;                /* handled them all */
294e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        /* replace with all spaces for continuation line */
295e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        snprintf(preamble, sizeof(preamble), "%*s", strlen(preamble), "");
296e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      }
297e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    }
298e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    /* If any bits have no definition, output an explicit value.
299e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET     * This could happen if new bits are defined and used
300e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET     * but the NameValue list is not updated. */
301e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    if(rest)
302e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      CODE2("%s%ldL);", preamble, rest);
303e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  }
304e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
305e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET nomem:
306e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  return ret;
307e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET}
308e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
309e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* setopt wrapper for bitmasks */
310e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETCURLcode tool_setopt_bitmask(CURL *curl, struct GlobalConfig *config,
311e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET                             const char *name, CURLoption tag,
312e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET                             const NameValueUnsigned *nvlist,
313e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET                             long lval)
314e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET{
315e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  CURLcode ret = CURLE_OK;
316e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  bool skip = FALSE;
317e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
318e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  ret = curl_easy_setopt(curl, tag, lval);
319e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(!lval)
320e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    skip = TRUE;
321e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
322e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(config->libcurl && !skip && !ret) {
323e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    /* we only use this for real if --libcurl was used */
324e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    char preamble[80];
325e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    unsigned long rest = (unsigned long)lval;
326e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    const NameValueUnsigned *nv = NULL;
327e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    snprintf(preamble, sizeof(preamble),
328e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET             "curl_easy_setopt(hnd, %s, ", name);
329e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    for(nv=nvlist; nv->name; nv++) {
330e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      if((nv->value & ~ rest) == 0) {
331e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        /* all value flags contained in rest */
332e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        rest &= ~ nv->value;    /* remove bits handled here */
333e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        CODE3("%s(long)%s%s",
334e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET              preamble, nv->name, rest ? " |" : ");");
335e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        if(!rest)
336e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET          break;                /* handled them all */
337e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        /* replace with all spaces for continuation line */
338e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        snprintf(preamble, sizeof(preamble), "%*s", strlen(preamble), "");
339e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      }
340e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    }
341e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    /* If any bits have no definition, output an explicit value.
342e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET     * This could happen if new bits are defined and used
343e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET     * but the NameValue list is not updated. */
344e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    if(rest)
345e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      CODE2("%s%luUL);", preamble, rest);
346e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  }
347e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
348e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET nomem:
349e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  return ret;
350e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET}
351e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
352e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* setopt wrapper for CURLOPT_HTTPPOST */
353e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETCURLcode tool_setopt_httppost(CURL *curl, struct GlobalConfig *config,
354e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET                              const char *name, CURLoption tag,
355e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET                              struct curl_httppost *post)
356e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET{
357e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  CURLcode ret = CURLE_OK;
358e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  char *escaped = NULL;
359e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  bool skip = FALSE;
360e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
361e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  ret = curl_easy_setopt(curl, tag, post);
362e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(!post)
363e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    skip = TRUE;
364e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
365e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(config->libcurl && !skip && !ret) {
366e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    struct curl_httppost *pp, *p;
367e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    int i;
368e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    /* May use several httppost lists, if multiple POST actions */
369e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    i = ++ easysrc_form_count;
370e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    DECL1("struct curl_httppost *post%d;", i);
371e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    DATA1("post%d = NULL;", i);
372e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    CLEAN1("curl_formfree(post%d);", i);
373e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    CLEAN1("post%d = NULL;", i);
374e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    if(i == 1)
375e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      DECL0("struct curl_httppost *postend;");
376e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    DATA0("postend = NULL;");
377e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    for(p=post; p; p=p->next) {
378e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      DATA1("curl_formadd(&post%d, &postend,", i);
379e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      DATA1("             CURLFORM_COPYNAME, \"%s\",", p->name);
380e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      for(pp=p; pp; pp=pp->more) {
381e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        /* May be several files uploaded for one name;
382e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET         * these are linked through the 'more' pointer */
383e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        Curl_safefree(escaped);
384e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        escaped = c_escape(pp->contents);
385e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        if(!escaped) {
386e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET          ret = CURLE_OUT_OF_MEMORY;
387e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET          goto nomem;
388e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        }
389e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        if(pp->flags & HTTPPOST_FILENAME) {
390e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET          /* file upload as for -F @filename */
391e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET          DATA1("             CURLFORM_FILE, \"%s\",", escaped);
392e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        }
393e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        else if(pp->flags & HTTPPOST_READFILE) {
394e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET          /* content from file as for -F <filename */
395e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET          DATA1("             CURLFORM_FILECONTENT, \"%s\",", escaped);
396e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        }
397e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        else
398e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET          DATA1("             CURLFORM_COPYCONTENTS, \"%s\",", escaped);
399e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        if(pp->showfilename) {
400e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET          Curl_safefree(escaped);
401e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET          escaped = c_escape(pp->showfilename);
402e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET          if(!escaped) {
403e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET            ret = CURLE_OUT_OF_MEMORY;
404e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET            goto nomem;
405e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET          }
406e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET          DATA1("             CURLFORM_FILENAME, \"%s\",", escaped);
407e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        }
408e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        if(pp->contenttype) {
409e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET          Curl_safefree(escaped);
410e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET          escaped = c_escape(pp->contenttype);
411e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET          if(!escaped) {
412e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET            ret = CURLE_OUT_OF_MEMORY;
413e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET            goto nomem;
414e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET          }
415e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET          DATA1("             CURLFORM_CONTENTTYPE, \"%s\",", escaped);
416e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        }
417e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      }
418e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      DATA0("             CURLFORM_END);");
419e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    }
420e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    CODE2("curl_easy_setopt(hnd, %s, post%d);", name, i);
421e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  }
422e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
423e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET nomem:
424e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  Curl_safefree(escaped);
425e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  return ret;
426e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET}
427e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
428e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* setopt wrapper for curl_slist options */
429e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETCURLcode tool_setopt_slist(CURL *curl, struct GlobalConfig *config,
430e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET                           const char *name, CURLoption tag,
431e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET                           struct curl_slist *list)
432e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET{
433e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  CURLcode ret = CURLE_OK;
434e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  char *escaped = NULL;
435e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  bool skip = FALSE;
436e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
437e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  ret = curl_easy_setopt(curl, tag, list);
438e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(!list)
439e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    skip = TRUE;
440e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
441e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(config->libcurl && !skip && !ret) {
442e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    struct curl_slist *s;
443e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    int i;
444e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    /* May need several slist variables, so invent name */
445e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    i = ++ easysrc_slist_count;
446e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    DECL1("struct curl_slist *slist%d;", i);
447e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    DATA1("slist%d = NULL;", i);
448e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    CLEAN1("curl_slist_free_all(slist%d);", i);
449e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    CLEAN1("slist%d = NULL;", i);
450e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    for(s=list; s; s=s->next) {
451e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      Curl_safefree(escaped);
452e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      escaped = c_escape(s->data);
453e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      if(!escaped) {
454e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        ret = CURLE_OUT_OF_MEMORY;
455e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        goto nomem;
456e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      }
457e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      DATA3("slist%d = curl_slist_append(slist%d, \"%s\");", i, i, escaped);
458e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    }
459e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    CODE2("curl_easy_setopt(hnd, %s, slist%d);", name, i);
460e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  }
461e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
462e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET nomem:
463e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  Curl_safefree(escaped);
464e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  return ret;
465e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET}
466e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
467e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* generic setopt wrapper for all other options.
468e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * Some type information is encoded in the tag value. */
469e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETCURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *config,
470e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET                     const char *name, CURLoption tag, ...)
471e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET{
472e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  va_list arg;
473e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  char buf[256];
474e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  const char *value = NULL;
475e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  bool remark = FALSE;
476e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  bool skip = FALSE;
477e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  bool escape = FALSE;
478e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  char *escaped = NULL;
479e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  CURLcode ret = CURLE_OK;
480e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
481e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  va_start(arg, tag);
482e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
483e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(tag < CURLOPTTYPE_OBJECTPOINT) {
484e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    /* Value is expected to be a long */
485e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    long lval = va_arg(arg, long);
486e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    long defval = 0L;
487e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    const NameValue *nv = NULL;
488e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    for(nv=setopt_nv_CURLNONZERODEFAULTS; nv->name; nv++) {
489e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      if(!strcmp(name, nv->name)) {
490e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        defval = nv->value;
491e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        break; /* found it */
492e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      }
493e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    }
494e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
495e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    snprintf(buf, sizeof(buf), "%ldL", lval);
496e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    value = buf;
497e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    ret = curl_easy_setopt(curl, tag, lval);
498e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    if(lval == defval)
499e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      skip = TRUE;
500e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  }
501e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  else if(tag < CURLOPTTYPE_OFF_T) {
502e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    /* Value is some sort of object pointer */
503e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    void *pval = va_arg(arg, void *);
504e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
505e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    /* function pointers are never printable */
506e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    if(tag >= CURLOPTTYPE_FUNCTIONPOINT) {
507e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      if(pval) {
508e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        value = "functionpointer";
509e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        remark = TRUE;
510e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      }
511e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      else
512e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        skip = TRUE;
513e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    }
514e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
515e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    else if(pval && str) {
516e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      value = (char *)pval;
517e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      escape = TRUE;
518e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    }
519e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    else if(pval) {
520e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      value = "objectpointer";
521e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      remark = TRUE;
522e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    }
523e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    else
524e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      skip = TRUE;
525e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
526e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    ret = curl_easy_setopt(curl, tag, pval);
527e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
528e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  }
529e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  else {
530e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    /* Value is expected to be curl_off_t */
531e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    curl_off_t oval = va_arg(arg, curl_off_t);
532e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    snprintf(buf, sizeof(buf),
533e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET             "(curl_off_t)%" CURL_FORMAT_CURL_OFF_T, oval);
534e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    value = buf;
535e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    ret = curl_easy_setopt(curl, tag, oval);
536e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
537e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    if(!oval)
538e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      skip = TRUE;
539e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  }
540e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
541e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  va_end(arg);
542e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
543e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  if(config->libcurl && !skip && !ret) {
544e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    /* we only use this for real if --libcurl was used */
545e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
546e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    if(remark)
547e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      REM2("%s set to a %s", name, value);
548e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    else {
549e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      if(escape) {
550e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        escaped = c_escape(value);
551e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        if(!escaped) {
552e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET          ret = CURLE_OUT_OF_MEMORY;
553e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET          goto nomem;
554e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        }
555e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        CODE2("curl_easy_setopt(hnd, %s, \"%s\");", name, escaped);
556e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      }
557e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      else
558e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        CODE2("curl_easy_setopt(hnd, %s, %s);", name, value);
559e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    }
560e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  }
561e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
562e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET nomem:
563e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  Curl_safefree(escaped);
564e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  return ret;
565e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET}
566e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
567e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#endif /* CURL_DISABLE_LIBCURL_OPTION */
568