1
0
mirror of https://github.com/moparisthebest/curl synced 2024-08-13 17:03:50 -04:00

- Added the --libcurl [file] option to curl. Append this option to any

ordinary curl command line, and you will get a libcurl-using source code
  written to the file that does the equivalent operation of what your command
  line operation does!
This commit is contained in:
Daniel Stenberg 2007-01-25 15:58:00 +00:00
parent 83a43bea8a
commit dbdb7fa55a
4 changed files with 276 additions and 135 deletions

View File

@ -6,6 +6,12 @@
Changelog Changelog
Daniel (25 January 2007)
- Added the --libcurl [file] option to curl. Append this option to any
ordinary curl command line, and you will get a libcurl-using source code
written to the file that does the equivalent operation of what your command
line operation does!
Dan F (24 January 2007) Dan F (24 January 2007)
- Fixed a dangling pointer problem that prevented the http_proxy environment - Fixed a dangling pointer problem that prevented the http_proxy environment
variable from being properly used in many cases (and caused test case 63 variable from being properly used in many cases (and caused test case 63

View File

@ -2,7 +2,7 @@ Curl and libcurl 7.16.1
Public curl release number: 97 Public curl release number: 97
Releases counted from the very beginning: 124 Releases counted from the very beginning: 124
Available command line options: 114 Available command line options: 115
Available curl_easy_setopt() options: 137 Available curl_easy_setopt() options: 137
Number of public functions in libcurl: 54 Number of public functions in libcurl: 54
Amount of public web site mirrors: 39 Amount of public web site mirrors: 39
@ -15,6 +15,7 @@ This release includes the following changes:
o CURLOPT_CLOSEPOLICY is now deprecated o CURLOPT_CLOSEPOLICY is now deprecated
o --ftp-ssl-ccc and CURLOPT_FTP_SSL_CCC were added o --ftp-ssl-ccc and CURLOPT_FTP_SSL_CCC were added
o HTTP support for non-ASCII platforms o HTTP support for non-ASCII platforms
o --libcurl was added
This release includes the following bugfixes: This release includes the following bugfixes:

View File

@ -599,7 +599,7 @@ line. So, it could look similar to this:
url = "http://curl.haxx.se/docs/" url = "http://curl.haxx.se/docs/"
This option can be used multiple times. This option can be used multiple times to load multiple config files.
When curl is invoked, it always (unless \fI-q\fP is used) checks for a default When curl is invoked, it always (unless \fI-q\fP is used) checks for a default
config file and uses it if found. The default config file is checked for in config file and uses it if found. The default config file is checked for in
@ -614,6 +614,12 @@ resort the '%USERPROFILE%\Application Data'.
2) On windows, if there is no _curlrc file in the home dir, it checks for one 2) On windows, if there is no _curlrc file in the home dir, it checks for one
in the same dir the executable curl is placed. On unix-like systems, it will in the same dir the executable curl is placed. On unix-like systems, it will
simply try to load .curlrc from the determined home dir. simply try to load .curlrc from the determined home dir.
.IP "--libcurl <file>"
Append this option to any ordinary curl command line, and you will get a
libcurl-using source code written to the file that does the equivalent
operation of what your command line operation does!
If this option is used several times, the last given file name will be used.
.IP "--limit-rate <speed>" .IP "--limit-rate <speed>"
Specify the maximum transfer rate you want curl to use. This feature is useful Specify the maximum transfer rate you want curl to use. This feature is useful
if you have a limited pipe and you'd like your transfer not use your entire if you have a limited pipe and you'd like your transfer not use your entire

View File

@ -366,6 +366,8 @@ struct Configurable {
bool ignorecl; /* --ignore-content-length */ bool ignorecl; /* --ignore-content-length */
bool disable_sessionid; bool disable_sessionid;
char *libcurl; /* output libcurl code to this file name */
struct OutStruct *outs; struct OutStruct *outs;
}; };
@ -549,6 +551,7 @@ static void help(void)
" --krb4 <level> Enable krb4 with specified security level (F)", " --krb4 <level> Enable krb4 with specified security level (F)",
" -k/--insecure Allow connections to SSL sites without certs (H)", " -k/--insecure Allow connections to SSL sites without certs (H)",
" -K/--config Specify which config file to read", " -K/--config Specify which config file to read",
" --libcurl <file> Dump libcurl equivalent code of this command line",
" -l/--list-only List only names of an FTP directory (F)", " -l/--list-only List only names of an FTP directory (F)",
" --limit-rate <rate> Limit transfer speed to this rate", " --limit-rate <rate> Limit transfer speed to this rate",
" --local-port <num>[-num] Force use of these local port numbers\n", " --local-port <num>[-num] Force use of these local port numbers\n",
@ -1362,6 +1365,7 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
{"$w", "no-sessionid", FALSE}, {"$w", "no-sessionid", FALSE},
{"$x", "ftp-ssl-control", FALSE}, {"$x", "ftp-ssl-control", FALSE},
{"$y", "ftp-ssl-ccc", FALSE}, {"$y", "ftp-ssl-ccc", FALSE},
{"$z", "libcurl", TRUE},
{"0", "http1.0", FALSE}, {"0", "http1.0", FALSE},
{"1", "tlsv1", FALSE}, {"1", "tlsv1", FALSE},
@ -1789,6 +1793,9 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
case 'y': /* --ftp-ssl-ccc */ case 'y': /* --ftp-ssl-ccc */
config->ftp_ssl_ccc ^= TRUE; config->ftp_ssl_ccc ^= TRUE;
break; break;
case 'z': /* --libcurl */
GetStr(&config->libcurl, nextarg);
break;
} }
break; break;
case '#': /* --progress-bar */ case '#': /* --progress-bar */
@ -2711,12 +2718,6 @@ static size_t my_fread(void *buffer, size_t sz, size_t nmemb, void *userp)
struct InStruct *in=(struct InStruct *)userp; struct InStruct *in=(struct InStruct *)userp;
rc = fread(buffer, sz, nmemb, in->stream); rc = fread(buffer, sz, nmemb, in->stream);
#if 0
if (sizeof(rc) > sizeof(unsigned int))
fprintf(stderr, "CALLBACK returning %lu bytes data\n", rc);
else
fprintf(stderr, "CALLBACK returning %u bytes data\n", rc);
#endif
return rc; return rc;
} }
@ -3201,6 +3202,129 @@ output_expected(char* url, char* uploadfile)
return FALSE; /* non-HTTP upload, probably no output should be expected */ return FALSE; /* non-HTTP upload, probably no output should be expected */
} }
#define my_setopt(x,y,z) _my_setopt(x, #y, y, z)
static struct curl_slist *easycode;
CURLcode _my_setopt(CURL *curl, const char *name, CURLoption tag, ...);
CURLcode _my_setopt(CURL *curl, const char *name, CURLoption tag, ...)
{
va_list arg;
CURLcode ret;
char buffer[128];
char value[256];
bool remark=FALSE;
va_start(arg, tag);
if(tag < CURLOPTTYPE_OBJECTPOINT) {
long lval = va_arg(arg, long);
snprintf(value, sizeof(value), "%ld", lval);
ret = curl_easy_setopt(curl, tag, lval);
}
else if(tag < CURLOPTTYPE_OFF_T) {
/* we treat both object and function pointers like this */
void *pval = va_arg(arg, void *);
unsigned char *ptr = (unsigned char *)pval;
/* attempt to figure out if it is a string (since the tag numerical doesn't
offer this info) and then output it as a string if so */
if(pval && isgraph(ptr[0]) && isgraph(ptr[1]))
snprintf(value, sizeof(value), "\"%s\"", (char *)ptr);
else if(pval) {
snprintf(value, sizeof(value), "%p", pval);
remark = TRUE;
}
else {
strcpy(value, "NULL"); /* value fits more than 5 bytes */
}
ret = curl_easy_setopt(curl, tag, pval);
}
else {
curl_off_t oval = va_arg(arg, curl_off_t);
snprintf(value, sizeof(value), "(curl_off_t)"CURL_FORMAT_OFF_T, oval);
ret = curl_easy_setopt(curl, tag, oval);
}
sprintf(buffer, "%scurl_easy_setopt(hnd, %s, %s);%s",
remark?"/* ":"",
name, value,
remark?" [REMARK] */":"");
easycode = curl_slist_append(easycode, buffer);
va_end(arg);
return ret;
}
static const char *srchead[]={
"/********* Sample code generated by the curl command line tool **********",
" * Lines with [REMARK] below might need to be modified to make this code ",
" * usable. Add appropriate error code checking where appropriate.",
" * Compile this with a suitable header include path. Then link with ",
" * libcurl.",
" * If you use any *_LARGE options, make sure your compiler figure",
" * out the correct size for the curl_off_t variable.",
" ************************************************************************/",
"[m]",
"#include <curl/curl.h>",
"",
"int main(int argc, char *argv[])",
"{",
" CURLcode ret;",
NULL
};
static void dumpeasycode(struct Configurable *config)
{
struct curl_slist *ptr = easycode;
char *o = config->libcurl;
if(o) {
FILE *out;
bool fopened = FALSE;
if(strcmp(o, "-")) {
out = fopen(o, "wt");
fopened = TRUE;
}
else
out= stdout;
if(!out)
warnf(config, "Failed to open %s to write libcurl code!\n", o);
else {
int i;
const char *c;
for(i=0; (c = srchead[i]); i++) {
if(!memcmp((char *)c, "[m]", 3)) {
#if defined(_FILE_OFFSET_BITS) && (_FILE_OFFSET_BITS > 32)
fprintf(out, "#define _FILE_OFFSET_BITS %d "
"/* for curl_off_t magic */\n",
_FILE_OFFSET_BITS);
#endif
}
else
fprintf(out, "%s\n", c);
}
while(ptr) {
fprintf(out, " %s\n", ptr->data);
ptr = ptr->next;
}
fprintf(out,
"}\n"
"/* */\n");
if(fopened)
fclose(out);
}
}
curl_slist_free_all(easycode);
}
static int static int
operate(struct Configurable *config, int argc, char *argv[]) operate(struct Configurable *config, int argc, char *argv[])
{ {
@ -3433,7 +3557,7 @@ operate(struct Configurable *config, int argc, char *argv[])
clean_getout(config); clean_getout(config);
return CURLE_FAILED_INIT; return CURLE_FAILED_INIT;
} }
easycode = curl_slist_append(easycode, "CURL *hnd = curl_easy_init();");
if (config->list_engines) { if (config->list_engines) {
struct curl_slist *engines = NULL; struct curl_slist *engines = NULL;
@ -3781,272 +3905,271 @@ operate(struct Configurable *config, int argc, char *argv[])
#endif #endif
if(1 == config->tcp_nodelay) if(1 == config->tcp_nodelay)
curl_easy_setopt(curl, CURLOPT_TCP_NODELAY, 1); my_setopt(curl, CURLOPT_TCP_NODELAY, 1);
/* where to store */ /* where to store */
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (FILE *)&outs); my_setopt(curl, CURLOPT_WRITEDATA, (FILE *)&outs);
/* what call to write */ /* what call to write */
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite); my_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);
/* for uploads */ /* for uploads */
input.stream = infd; input.stream = infd;
input.config = config; input.config = config;
curl_easy_setopt(curl, CURLOPT_READDATA, &input); my_setopt(curl, CURLOPT_READDATA, &input);
/* what call to read */ /* what call to read */
curl_easy_setopt(curl, CURLOPT_READFUNCTION, my_fread); my_setopt(curl, CURLOPT_READFUNCTION, my_fread);
/* libcurl 7.12.3 business: */ /* libcurl 7.12.3 business: */
curl_easy_setopt(curl, CURLOPT_IOCTLDATA, &input); my_setopt(curl, CURLOPT_IOCTLDATA, &input);
curl_easy_setopt(curl, CURLOPT_IOCTLFUNCTION, my_ioctl); my_setopt(curl, CURLOPT_IOCTLFUNCTION, my_ioctl);
if(config->recvpersecond) if(config->recvpersecond)
/* tell libcurl to use a smaller sized buffer as it allows us to /* tell libcurl to use a smaller sized buffer as it allows us to
make better sleeps! 7.9.9 stuff! */ make better sleeps! 7.9.9 stuff! */
curl_easy_setopt(curl, CURLOPT_BUFFERSIZE, config->recvpersecond); my_setopt(curl, CURLOPT_BUFFERSIZE, config->recvpersecond);
/* size of uploaded file: */ /* size of uploaded file: */
curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, uploadfilesize); my_setopt(curl, CURLOPT_INFILESIZE_LARGE, uploadfilesize);
curl_easy_setopt(curl, CURLOPT_URL, url); /* what to fetch */ my_setopt(curl, CURLOPT_URL, url); /* what to fetch */
curl_easy_setopt(curl, CURLOPT_PROXY, config->proxy); /* proxy to use */ my_setopt(curl, CURLOPT_PROXY, config->proxy); /* proxy to use */
curl_easy_setopt(curl, CURLOPT_HEADER, config->conf&CONF_HEADER); my_setopt(curl, CURLOPT_HEADER, config->conf&CONF_HEADER);
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, config->conf&CONF_NOPROGRESS); my_setopt(curl, CURLOPT_NOPROGRESS, config->conf&CONF_NOPROGRESS);
curl_easy_setopt(curl, CURLOPT_NOBODY, config->conf&CONF_NOBODY); my_setopt(curl, CURLOPT_NOBODY, config->conf&CONF_NOBODY);
curl_easy_setopt(curl, CURLOPT_FAILONERROR, my_setopt(curl, CURLOPT_FAILONERROR,
config->conf&CONF_FAILONERROR); config->conf&CONF_FAILONERROR);
curl_easy_setopt(curl, CURLOPT_UPLOAD, uploadfile?TRUE:FALSE); my_setopt(curl, CURLOPT_UPLOAD, uploadfile?TRUE:FALSE);
curl_easy_setopt(curl, CURLOPT_FTPLISTONLY, my_setopt(curl, CURLOPT_FTPLISTONLY,
config->conf&CONF_FTPLISTONLY); config->conf&CONF_FTPLISTONLY);
curl_easy_setopt(curl, CURLOPT_FTPAPPEND, config->conf&CONF_FTPAPPEND); my_setopt(curl, CURLOPT_FTPAPPEND, config->conf&CONF_FTPAPPEND);
if (config->conf&CONF_NETRC_OPT) if (config->conf&CONF_NETRC_OPT)
curl_easy_setopt(curl, CURLOPT_NETRC, CURL_NETRC_OPTIONAL); my_setopt(curl, CURLOPT_NETRC, CURL_NETRC_OPTIONAL);
else if (config->conf&CONF_NETRC) else if (config->conf&CONF_NETRC)
curl_easy_setopt(curl, CURLOPT_NETRC, CURL_NETRC_REQUIRED); my_setopt(curl, CURLOPT_NETRC, CURL_NETRC_REQUIRED);
else else
curl_easy_setopt(curl, CURLOPT_NETRC, CURL_NETRC_IGNORED); my_setopt(curl, CURLOPT_NETRC, CURL_NETRC_IGNORED);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, my_setopt(curl, CURLOPT_FOLLOWLOCATION,
config->conf&CONF_FOLLOWLOCATION); config->conf&CONF_FOLLOWLOCATION);
curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, my_setopt(curl, CURLOPT_UNRESTRICTED_AUTH,
config->conf&CONF_UNRESTRICTED_AUTH); config->conf&CONF_UNRESTRICTED_AUTH);
curl_easy_setopt(curl, CURLOPT_TRANSFERTEXT, config->conf&CONF_GETTEXT); my_setopt(curl, CURLOPT_TRANSFERTEXT, config->conf&CONF_GETTEXT);
curl_easy_setopt(curl, CURLOPT_USERPWD, config->userpwd); my_setopt(curl, CURLOPT_USERPWD, config->userpwd);
curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, config->proxyuserpwd); my_setopt(curl, CURLOPT_PROXYUSERPWD, config->proxyuserpwd);
curl_easy_setopt(curl, CURLOPT_RANGE, config->range); my_setopt(curl, CURLOPT_RANGE, config->range);
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorbuffer); my_setopt(curl, CURLOPT_ERRORBUFFER, errorbuffer);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, config->timeout); my_setopt(curl, CURLOPT_TIMEOUT, config->timeout);
switch(config->httpreq) { switch(config->httpreq) {
case HTTPREQ_SIMPLEPOST: case HTTPREQ_SIMPLEPOST:
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, config->postfields); my_setopt(curl, CURLOPT_POSTFIELDS, config->postfields);
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, config->postfieldsize); my_setopt(curl, CURLOPT_POSTFIELDSIZE, config->postfieldsize);
break; break;
case HTTPREQ_POST: case HTTPREQ_POST:
curl_easy_setopt(curl, CURLOPT_HTTPPOST, config->httppost); my_setopt(curl, CURLOPT_HTTPPOST, config->httppost);
break; break;
default: default:
break; break;
} }
curl_easy_setopt(curl, CURLOPT_REFERER, config->referer); my_setopt(curl, CURLOPT_REFERER, config->referer);
curl_easy_setopt(curl, CURLOPT_AUTOREFERER, my_setopt(curl, CURLOPT_AUTOREFERER,
config->conf&CONF_AUTO_REFERER); config->conf&CONF_AUTO_REFERER);
curl_easy_setopt(curl, CURLOPT_USERAGENT, config->useragent); my_setopt(curl, CURLOPT_USERAGENT, config->useragent);
curl_easy_setopt(curl, CURLOPT_FTPPORT, config->ftpport); my_setopt(curl, CURLOPT_FTPPORT, config->ftpport);
curl_easy_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, my_setopt(curl, CURLOPT_LOW_SPEED_LIMIT,
config->low_speed_limit); config->low_speed_limit);
curl_easy_setopt(curl, CURLOPT_LOW_SPEED_TIME, config->low_speed_time); my_setopt(curl, CURLOPT_LOW_SPEED_TIME, config->low_speed_time);
curl_easy_setopt(curl, CURLOPT_MAX_SEND_SPEED_LARGE, my_setopt(curl, CURLOPT_MAX_SEND_SPEED_LARGE,
config->sendpersecond); config->sendpersecond);
curl_easy_setopt(curl, CURLOPT_MAX_RECV_SPEED_LARGE, my_setopt(curl, CURLOPT_MAX_RECV_SPEED_LARGE,
config->recvpersecond); config->recvpersecond);
my_setopt(curl, CURLOPT_RESUME_FROM_LARGE,
curl_easy_setopt(curl, CURLOPT_RESUME_FROM_LARGE, config->use_resume?config->resume_from:0);
config->use_resume?config->resume_from:0); my_setopt(curl, CURLOPT_COOKIE, config->cookie);
curl_easy_setopt(curl, CURLOPT_COOKIE, config->cookie); my_setopt(curl, CURLOPT_HTTPHEADER, config->headers);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, config->headers); my_setopt(curl, CURLOPT_SSLCERT, config->cert);
curl_easy_setopt(curl, CURLOPT_SSLCERT, config->cert); my_setopt(curl, CURLOPT_SSLCERTTYPE, config->cert_type);
curl_easy_setopt(curl, CURLOPT_SSLCERTTYPE, config->cert_type); my_setopt(curl, CURLOPT_SSLKEY, config->key);
curl_easy_setopt(curl, CURLOPT_SSLKEY, config->key); my_setopt(curl, CURLOPT_SSLKEYTYPE, config->key_type);
curl_easy_setopt(curl, CURLOPT_SSLKEYTYPE, config->key_type); my_setopt(curl, CURLOPT_SSLKEYPASSWD, config->key_passwd);
curl_easy_setopt(curl, CURLOPT_SSLKEYPASSWD, config->key_passwd);
/* default to strict verifyhost */ /* default to strict verifyhost */
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2); my_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2);
if(config->cacert || config->capath) { if(config->cacert || config->capath) {
if (config->cacert) if (config->cacert)
curl_easy_setopt(curl, CURLOPT_CAINFO, config->cacert); my_setopt(curl, CURLOPT_CAINFO, config->cacert);
if (config->capath) if (config->capath)
curl_easy_setopt(curl, CURLOPT_CAPATH, config->capath); my_setopt(curl, CURLOPT_CAPATH, config->capath);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, TRUE); my_setopt(curl, CURLOPT_SSL_VERIFYPEER, TRUE);
} }
if(config->insecure_ok) { if(config->insecure_ok) {
/* new stuff needed for libcurl 7.10 */ /* new stuff needed for libcurl 7.10 */
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE); my_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1); my_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1);
} }
if((config->conf&CONF_NOBODY) || if((config->conf&CONF_NOBODY) ||
config->remote_time) { config->remote_time) {
/* no body or use remote time */ /* no body or use remote time */
curl_easy_setopt(curl, CURLOPT_FILETIME, TRUE); my_setopt(curl, CURLOPT_FILETIME, TRUE);
} }
curl_easy_setopt(curl, CURLOPT_MAXREDIRS, config->maxredirs); my_setopt(curl, CURLOPT_MAXREDIRS, config->maxredirs);
curl_easy_setopt(curl, CURLOPT_CRLF, config->crlf); my_setopt(curl, CURLOPT_CRLF, config->crlf);
curl_easy_setopt(curl, CURLOPT_QUOTE, config->quote); my_setopt(curl, CURLOPT_QUOTE, config->quote);
curl_easy_setopt(curl, CURLOPT_POSTQUOTE, config->postquote); my_setopt(curl, CURLOPT_POSTQUOTE, config->postquote);
curl_easy_setopt(curl, CURLOPT_PREQUOTE, config->prequote); my_setopt(curl, CURLOPT_PREQUOTE, config->prequote);
curl_easy_setopt(curl, CURLOPT_WRITEHEADER, my_setopt(curl, CURLOPT_WRITEHEADER,
config->headerfile?&heads:NULL); config->headerfile?&heads:NULL);
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, config->cookiefile); my_setopt(curl, CURLOPT_COOKIEFILE, config->cookiefile);
/* cookie jar was added in 7.9 */ /* cookie jar was added in 7.9 */
if(config->cookiejar) if(config->cookiejar)
curl_easy_setopt(curl, CURLOPT_COOKIEJAR, config->cookiejar); my_setopt(curl, CURLOPT_COOKIEJAR, config->cookiejar);
/* cookie session added in 7.9.7 */ /* cookie session added in 7.9.7 */
curl_easy_setopt(curl, CURLOPT_COOKIESESSION, config->cookiesession); my_setopt(curl, CURLOPT_COOKIESESSION, config->cookiesession);
curl_easy_setopt(curl, CURLOPT_SSLVERSION, config->ssl_version); my_setopt(curl, CURLOPT_SSLVERSION, config->ssl_version);
curl_easy_setopt(curl, CURLOPT_TIMECONDITION, config->timecond); my_setopt(curl, CURLOPT_TIMECONDITION, config->timecond);
curl_easy_setopt(curl, CURLOPT_TIMEVALUE, config->condtime); my_setopt(curl, CURLOPT_TIMEVALUE, config->condtime);
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, config->customrequest); my_setopt(curl, CURLOPT_CUSTOMREQUEST, config->customrequest);
curl_easy_setopt(curl, CURLOPT_STDERR, config->errors); my_setopt(curl, CURLOPT_STDERR, config->errors);
/* three new ones in libcurl 7.3: */ /* three new ones in libcurl 7.3: */
curl_easy_setopt(curl, CURLOPT_HTTPPROXYTUNNEL, config->proxytunnel); my_setopt(curl, CURLOPT_HTTPPROXYTUNNEL, config->proxytunnel);
curl_easy_setopt(curl, CURLOPT_INTERFACE, config->iface); my_setopt(curl, CURLOPT_INTERFACE, config->iface);
curl_easy_setopt(curl, CURLOPT_KRB4LEVEL, config->krb4level); my_setopt(curl, CURLOPT_KRB4LEVEL, config->krb4level);
progressbarinit(&progressbar, config); progressbarinit(&progressbar, config);
if((config->progressmode == CURL_PROGRESS_BAR) && if((config->progressmode == CURL_PROGRESS_BAR) &&
!(config->conf&(CONF_NOPROGRESS|CONF_MUTE))) { !(config->conf&(CONF_NOPROGRESS|CONF_MUTE))) {
/* we want the alternative style, then we have to implement it /* we want the alternative style, then we have to implement it
ourselves! */ ourselves! */
curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, myprogress); my_setopt(curl, CURLOPT_PROGRESSFUNCTION, myprogress);
curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, &progressbar); my_setopt(curl, CURLOPT_PROGRESSDATA, &progressbar);
} }
/* new in libcurl 7.6.2: */ /* new in libcurl 7.6.2: */
curl_easy_setopt(curl, CURLOPT_TELNETOPTIONS, config->telnet_options); my_setopt(curl, CURLOPT_TELNETOPTIONS, config->telnet_options);
/* new in libcurl 7.7: */ /* new in libcurl 7.7: */
curl_easy_setopt(curl, CURLOPT_RANDOM_FILE, config->random_file); my_setopt(curl, CURLOPT_RANDOM_FILE, config->random_file);
curl_easy_setopt(curl, CURLOPT_EGDSOCKET, config->egd_file); my_setopt(curl, CURLOPT_EGDSOCKET, config->egd_file);
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, config->connecttimeout); my_setopt(curl, CURLOPT_CONNECTTIMEOUT, config->connecttimeout);
if(config->cipher_list) if(config->cipher_list)
curl_easy_setopt(curl, CURLOPT_SSL_CIPHER_LIST, config->cipher_list); my_setopt(curl, CURLOPT_SSL_CIPHER_LIST, config->cipher_list);
if(config->httpversion) if(config->httpversion)
curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, config->httpversion); my_setopt(curl, CURLOPT_HTTP_VERSION, config->httpversion);
/* new in libcurl 7.9.2: */ /* new in libcurl 7.9.2: */
if(config->disable_epsv) if(config->disable_epsv)
/* disable it */ /* disable it */
curl_easy_setopt(curl, CURLOPT_FTP_USE_EPSV, FALSE); my_setopt(curl, CURLOPT_FTP_USE_EPSV, FALSE);
/* new in libcurl 7.10.5 */ /* new in libcurl 7.10.5 */
if(config->disable_eprt) if(config->disable_eprt)
/* disable it */ /* disable it */
curl_easy_setopt(curl, CURLOPT_FTP_USE_EPRT, FALSE); my_setopt(curl, CURLOPT_FTP_USE_EPRT, FALSE);
/* new in libcurl 7.10.6 (default is Basic) */ /* new in libcurl 7.10.6 (default is Basic) */
if(config->authtype) if(config->authtype)
curl_easy_setopt(curl, CURLOPT_HTTPAUTH, config->authtype); my_setopt(curl, CURLOPT_HTTPAUTH, config->authtype);
/* new in curl 7.9.7 */ /* new in curl 7.9.7 */
if(config->trace_dump) { if(config->trace_dump) {
curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); my_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace);
curl_easy_setopt(curl, CURLOPT_DEBUGDATA, config); my_setopt(curl, CURLOPT_DEBUGDATA, config);
curl_easy_setopt(curl, CURLOPT_VERBOSE, TRUE); my_setopt(curl, CURLOPT_VERBOSE, TRUE);
} }
res = CURLE_OK; res = CURLE_OK;
/* new in curl ?? */ /* new in curl ?? */
if (config->engine) { if (config->engine) {
res = curl_easy_setopt(curl, CURLOPT_SSLENGINE, config->engine); res = my_setopt(curl, CURLOPT_SSLENGINE, config->engine);
curl_easy_setopt(curl, CURLOPT_SSLENGINE_DEFAULT, 1); my_setopt(curl, CURLOPT_SSLENGINE_DEFAULT, 1);
} }
if (res != CURLE_OK) if (res != CURLE_OK)
goto show_error; goto show_error;
/* new in curl 7.10 */ /* new in curl 7.10 */
curl_easy_setopt(curl, CURLOPT_ENCODING, my_setopt(curl, CURLOPT_ENCODING,
(config->encoding) ? "" : NULL); (config->encoding) ? "" : NULL);
/* new in curl 7.10.7 */ /* new in curl 7.10.7 */
curl_easy_setopt(curl, CURLOPT_FTP_CREATE_MISSING_DIRS, my_setopt(curl, CURLOPT_FTP_CREATE_MISSING_DIRS,
config->ftp_create_dirs); config->ftp_create_dirs);
if(config->proxyanyauth) if(config->proxyanyauth)
curl_easy_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_ANY); my_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_ANY);
else if(config->proxyntlm) else if(config->proxyntlm)
curl_easy_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_NTLM); my_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_NTLM);
else if(config->proxydigest) else if(config->proxydigest)
curl_easy_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_DIGEST); my_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_DIGEST);
else if(config->proxybasic) else if(config->proxybasic)
curl_easy_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_BASIC); my_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_BASIC);
/* new in curl 7.10.8 */ /* new in curl 7.10.8 */
if(config->max_filesize) if(config->max_filesize)
curl_easy_setopt(curl, CURLOPT_MAXFILESIZE_LARGE, my_setopt(curl, CURLOPT_MAXFILESIZE_LARGE,
config->max_filesize); config->max_filesize);
if(4 == config->ip_version) if(4 == config->ip_version)
curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); my_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
else if(6 == config->ip_version) else if(6 == config->ip_version)
curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6); my_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6);
else else
curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_WHATEVER); my_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_WHATEVER);
/* new in curl 7.15.5 */ /* new in curl 7.15.5 */
if(config->ftp_ssl_reqd) if(config->ftp_ssl_reqd)
curl_easy_setopt(curl, CURLOPT_FTP_SSL, CURLFTPSSL_ALL); my_setopt(curl, CURLOPT_FTP_SSL, CURLFTPSSL_ALL);
/* new in curl 7.11.0 */ /* new in curl 7.11.0 */
else if(config->ftp_ssl) else if(config->ftp_ssl)
curl_easy_setopt(curl, CURLOPT_FTP_SSL, CURLFTPSSL_TRY); my_setopt(curl, CURLOPT_FTP_SSL, CURLFTPSSL_TRY);
/* new in curl 7.16.0 */ /* new in curl 7.16.0 */
else if(config->ftp_ssl_control) else if(config->ftp_ssl_control)
curl_easy_setopt(curl, CURLOPT_FTP_SSL, CURLFTPSSL_CONTROL); my_setopt(curl, CURLOPT_FTP_SSL, CURLFTPSSL_CONTROL);
/* new in curl 7.16.1 */ /* new in curl 7.16.1 */
if(config->ftp_ssl_ccc) if(config->ftp_ssl_ccc)
curl_easy_setopt(curl, CURLOPT_FTP_SSL_CCC, TRUE); my_setopt(curl, CURLOPT_FTP_SSL_CCC, TRUE);
/* new in curl 7.11.1, modified in 7.15.2 */ /* new in curl 7.11.1, modified in 7.15.2 */
if(config->socksproxy) { if(config->socksproxy) {
curl_easy_setopt(curl, CURLOPT_PROXY, config->socksproxy); my_setopt(curl, CURLOPT_PROXY, config->socksproxy);
curl_easy_setopt(curl, CURLOPT_PROXYTYPE, config->socksver); my_setopt(curl, CURLOPT_PROXYTYPE, config->socksver);
} }
/* curl 7.13.0 */ /* curl 7.13.0 */
curl_easy_setopt(curl, CURLOPT_FTP_ACCOUNT, config->ftp_account); my_setopt(curl, CURLOPT_FTP_ACCOUNT, config->ftp_account);
curl_easy_setopt(curl, CURLOPT_IGNORE_CONTENT_LENGTH, config->ignorecl); my_setopt(curl, CURLOPT_IGNORE_CONTENT_LENGTH, config->ignorecl);
/* curl 7.14.2 */ /* curl 7.14.2 */
curl_easy_setopt(curl, CURLOPT_FTP_SKIP_PASV_IP, config->ftp_skip_ip); my_setopt(curl, CURLOPT_FTP_SKIP_PASV_IP, config->ftp_skip_ip);
/* curl 7.15.1 */ /* curl 7.15.1 */
curl_easy_setopt(curl, CURLOPT_FTP_FILEMETHOD, config->ftp_filemethod); my_setopt(curl, CURLOPT_FTP_FILEMETHOD, config->ftp_filemethod);
/* curl 7.15.2 */ /* curl 7.15.2 */
if(config->localport) { if(config->localport) {
curl_easy_setopt(curl, CURLOPT_LOCALPORT, config->localport); my_setopt(curl, CURLOPT_LOCALPORT, config->localport);
curl_easy_setopt(curl, CURLOPT_LOCALPORTRANGE, my_setopt(curl, CURLOPT_LOCALPORTRANGE,
config->localportrange); config->localportrange);
} }
/* curl 7.15.5 */ /* curl 7.15.5 */
curl_easy_setopt(curl, CURLOPT_FTP_ALTERNATIVE_TO_USER, my_setopt(curl, CURLOPT_FTP_ALTERNATIVE_TO_USER,
config->ftp_alternative_to_user); config->ftp_alternative_to_user);
/* curl 7.16.0 */ /* curl 7.16.0 */
curl_easy_setopt(curl, CURLOPT_SSL_SESSIONID_CACHE, my_setopt(curl, CURLOPT_SSL_SESSIONID_CACHE,
!config->disable_sessionid); !config->disable_sessionid);
retry_numretries = config->req_retry; retry_numretries = config->req_retry;
@ -4054,6 +4177,8 @@ operate(struct Configurable *config, int argc, char *argv[])
do { do {
res = curl_easy_perform(curl); res = curl_easy_perform(curl);
easycode = curl_slist_append(easycode,
"ret = curl_easy_perform(hnd);");
/* if retry-max-time is non-zero, make sure we haven't exceeded the /* if retry-max-time is non-zero, make sure we haven't exceeded the
time */ time */
@ -4295,6 +4420,7 @@ quit_curl:
/* cleanup the curl handle! */ /* cleanup the curl handle! */
curl_easy_cleanup(curl); curl_easy_cleanup(curl);
easycode = curl_slist_append(easycode, "curl_easy_cleanup(hnd);");
if(config->headerfile && !headerfilep && heads.stream) if(config->headerfile && !headerfilep && heads.stream)
fclose(heads.stream); fclose(heads.stream);
@ -4310,6 +4436,8 @@ quit_curl:
main_free(); /* cleanup */ main_free(); /* cleanup */
dumpeasycode(config);
return res; return res;
} }