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