mirror of
https://github.com/curl/curl.git
synced 2026-07-24 19:17:20 +03:00
examples: consistent variable naming across examples
- 'CURL *' handles are called 'curl' - 'CURLM *' handles are called 'multi' - write callbacks are called 'write_cb' - read callbacs are called 'read_cb' - CURLcode variables are called 'res' It makes the examples look and feel more consistent. It allows for easier copy and pasting between examples. Closes #19299
This commit is contained in:
parent
0313223853
commit
928363f28c
59 changed files with 715 additions and 725 deletions
|
|
@ -91,68 +91,68 @@ static size_t write_cb(char *data, size_t n, size_t l, void *userp)
|
|||
return n * l;
|
||||
}
|
||||
|
||||
static void add_transfer(CURLM *cm, unsigned int i, int *left)
|
||||
static void add_transfer(CURLM *multi, unsigned int i, int *left)
|
||||
{
|
||||
CURL *eh = curl_easy_init();
|
||||
if(eh) {
|
||||
curl_easy_setopt(eh, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
curl_easy_setopt(eh, CURLOPT_URL, urls[i]);
|
||||
curl_easy_setopt(eh, CURLOPT_PRIVATE, urls[i]);
|
||||
curl_multi_add_handle(cm, eh);
|
||||
CURL *curl = curl_easy_init();
|
||||
if(curl) {
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
curl_easy_setopt(curl, CURLOPT_URL, urls[i]);
|
||||
curl_easy_setopt(curl, CURLOPT_PRIVATE, urls[i]);
|
||||
curl_multi_add_handle(multi, curl);
|
||||
}
|
||||
(*left)++;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
CURLM *cm;
|
||||
CURLM *multi;
|
||||
|
||||
CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
|
||||
if(res)
|
||||
return (int)res;
|
||||
|
||||
cm = curl_multi_init();
|
||||
if(cm) {
|
||||
multi = curl_multi_init();
|
||||
if(multi) {
|
||||
CURLMsg *msg;
|
||||
unsigned int transfers = 0;
|
||||
int msgs_left = -1;
|
||||
int left = 0;
|
||||
|
||||
/* Limit the amount of simultaneous connections curl should allow: */
|
||||
curl_multi_setopt(cm, CURLMOPT_MAXCONNECTS, (long)MAX_PARALLEL);
|
||||
curl_multi_setopt(multi, CURLMOPT_MAXCONNECTS, (long)MAX_PARALLEL);
|
||||
|
||||
for(transfers = 0; transfers < MAX_PARALLEL && transfers < NUM_URLS;
|
||||
transfers++)
|
||||
add_transfer(cm, transfers, &left);
|
||||
add_transfer(multi, transfers, &left);
|
||||
|
||||
do {
|
||||
int still_alive = 1;
|
||||
curl_multi_perform(cm, &still_alive);
|
||||
curl_multi_perform(multi, &still_alive);
|
||||
|
||||
/* !checksrc! disable EQUALSNULL 1 */
|
||||
while((msg = curl_multi_info_read(cm, &msgs_left)) != NULL) {
|
||||
while((msg = curl_multi_info_read(multi, &msgs_left)) != NULL) {
|
||||
if(msg->msg == CURLMSG_DONE) {
|
||||
char *url;
|
||||
CURL *e = msg->easy_handle;
|
||||
curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, &url);
|
||||
CURL *curl = msg->easy_handle;
|
||||
curl_easy_getinfo(curl, CURLINFO_PRIVATE, &url);
|
||||
fprintf(stderr, "R: %d - %s <%s>\n",
|
||||
msg->data.result, curl_easy_strerror(msg->data.result), url);
|
||||
curl_multi_remove_handle(cm, e);
|
||||
curl_easy_cleanup(e);
|
||||
curl_multi_remove_handle(multi, curl);
|
||||
curl_easy_cleanup(curl);
|
||||
left--;
|
||||
}
|
||||
else {
|
||||
fprintf(stderr, "E: CURLMsg (%d)\n", msg->msg);
|
||||
}
|
||||
if(transfers < NUM_URLS)
|
||||
add_transfer(cm, transfers++, &left);
|
||||
add_transfer(multi, transfers++, &left);
|
||||
}
|
||||
if(left)
|
||||
curl_multi_wait(cm, NULL, 0, 1000, NULL);
|
||||
curl_multi_wait(multi, NULL, 0, 1000, NULL);
|
||||
|
||||
} while(left);
|
||||
|
||||
curl_multi_cleanup(cm);
|
||||
curl_multi_cleanup(multi);
|
||||
}
|
||||
curl_global_cleanup();
|
||||
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ static int my_seek(void *userp, curl_off_t offset, int origin)
|
|||
}
|
||||
|
||||
/* read callback function, fread() look alike */
|
||||
static size_t read_callback(char *ptr, size_t size, size_t nmemb, void *stream)
|
||||
static size_t read_cb(char *ptr, size_t size, size_t nmemb, void *stream)
|
||||
{
|
||||
size_t nread;
|
||||
|
||||
|
|
@ -124,7 +124,7 @@ int main(int argc, char **argv)
|
|||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
/* we want to use our own read function */
|
||||
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
|
||||
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_cb);
|
||||
|
||||
/* which file to upload */
|
||||
curl_easy_setopt(curl, CURLOPT_READDATA, (void *) fp);
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ typedef size_t ossl_valsize_t;
|
|||
typedef int ossl_valsize_t;
|
||||
#endif
|
||||
|
||||
static size_t writefunction(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
{
|
||||
fwrite(ptr, size, nmemb, (FILE *)stream);
|
||||
return nmemb * size;
|
||||
|
|
@ -115,37 +115,37 @@ static CURLcode sslctx_function(CURL *curl, void *sslctx, void *pointer)
|
|||
|
||||
int main(void)
|
||||
{
|
||||
CURL *ch;
|
||||
CURL *curl;
|
||||
|
||||
CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
|
||||
if(res)
|
||||
return (int)res;
|
||||
|
||||
ch = curl_easy_init();
|
||||
if(ch) {
|
||||
curl_easy_setopt(ch, CURLOPT_VERBOSE, 0L);
|
||||
curl_easy_setopt(ch, CURLOPT_HEADER, 0L);
|
||||
curl_easy_setopt(ch, CURLOPT_NOPROGRESS, 1L);
|
||||
curl_easy_setopt(ch, CURLOPT_NOSIGNAL, 1L);
|
||||
curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, writefunction);
|
||||
curl_easy_setopt(ch, CURLOPT_WRITEDATA, stdout);
|
||||
curl_easy_setopt(ch, CURLOPT_HEADERFUNCTION, writefunction);
|
||||
curl_easy_setopt(ch, CURLOPT_HEADERDATA, stderr);
|
||||
curl_easy_setopt(ch, CURLOPT_SSLCERTTYPE, "PEM");
|
||||
curl_easy_setopt(ch, CURLOPT_SSL_VERIFYPEER, 1L);
|
||||
curl_easy_setopt(ch, CURLOPT_URL, "https://www.example.com/");
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
curl_easy_setopt(curl, CURLOPT_VERBOSE, 0L);
|
||||
curl_easy_setopt(curl, CURLOPT_HEADER, 0L);
|
||||
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, stdout);
|
||||
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, write_cb);
|
||||
curl_easy_setopt(curl, CURLOPT_HEADERDATA, stderr);
|
||||
curl_easy_setopt(curl, CURLOPT_SSLCERTTYPE, "PEM");
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com/");
|
||||
|
||||
/* Turn off the default CA locations, otherwise libcurl loads CA
|
||||
* certificates from the locations that were detected/specified at
|
||||
* build-time
|
||||
*/
|
||||
curl_easy_setopt(ch, CURLOPT_CAINFO, NULL);
|
||||
curl_easy_setopt(ch, CURLOPT_CAPATH, NULL);
|
||||
curl_easy_setopt(curl, CURLOPT_CAINFO, NULL);
|
||||
curl_easy_setopt(curl, CURLOPT_CAPATH, NULL);
|
||||
|
||||
/* first try: retrieve page without ca certificates -> should fail
|
||||
* unless libcurl was built --with-ca-fallback enabled at build-time
|
||||
*/
|
||||
res = curl_easy_perform(ch);
|
||||
res = curl_easy_perform(curl);
|
||||
if(res == CURLE_OK)
|
||||
printf("*** transfer succeeded ***\n");
|
||||
else
|
||||
|
|
@ -155,24 +155,24 @@ int main(void)
|
|||
* performance of multiple transfers but it is necessary order to
|
||||
* demonstrate this example. recall that the ssl ctx callback is only
|
||||
* called _before_ an SSL connection is established, therefore it does not
|
||||
* affect existing verified SSL connections already in the connection cache
|
||||
* associated with this handle. normally you would set the ssl ctx function
|
||||
* before making any transfers, and not use this option.
|
||||
* affect existing verified SSL connections already in the connection
|
||||
* cache associated with this handle. normally you would set the ssl ctx
|
||||
* function before making any transfers, and not use this option.
|
||||
*/
|
||||
curl_easy_setopt(ch, CURLOPT_FRESH_CONNECT, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_FRESH_CONNECT, 1L);
|
||||
|
||||
/* second try: retrieve page using cacerts' certificate -> succeeds to load
|
||||
* the certificate by installing a function doing the necessary
|
||||
/* second try: retrieve page using cacerts' certificate -> succeeds to
|
||||
* load the certificate by installing a function doing the necessary
|
||||
* "modifications" to the SSL CONTEXT just before link init
|
||||
*/
|
||||
curl_easy_setopt(ch, CURLOPT_SSL_CTX_FUNCTION, sslctx_function);
|
||||
res = curl_easy_perform(ch);
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_CTX_FUNCTION, sslctx_function);
|
||||
res = curl_easy_perform(curl);
|
||||
if(res == CURLE_OK)
|
||||
printf("*** transfer succeeded ***\n");
|
||||
else
|
||||
printf("*** transfer failed ***\n");
|
||||
|
||||
curl_easy_cleanup(ch);
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
curl_global_cleanup();
|
||||
return (int)res;
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
|
||||
#include <curl/curl.h>
|
||||
|
||||
static size_t wrfu(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
{
|
||||
(void)stream;
|
||||
(void)ptr;
|
||||
|
|
@ -49,7 +49,7 @@ int main(void)
|
|||
if(curl) {
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com/");
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, wrfu);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@
|
|||
|
||||
#define CHKSPEED_VERSION "1.0"
|
||||
|
||||
static size_t WriteCallback(void *ptr, size_t size, size_t nmemb, void *data)
|
||||
static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *data)
|
||||
{
|
||||
/* we are not interested in the downloaded bytes itself,
|
||||
so we only return the size we would have saved ... */
|
||||
|
|
@ -63,7 +63,7 @@ static size_t WriteCallback(void *ptr, size_t size, size_t nmemb, void *data)
|
|||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
CURL *curl_handle;
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
int prtall = 0, prtsep = 0, prttime = 0;
|
||||
const char *url = URL_1M;
|
||||
|
|
@ -161,33 +161,33 @@ int main(int argc, char *argv[])
|
|||
return (int)res;
|
||||
|
||||
/* init the curl session */
|
||||
curl_handle = curl_easy_init();
|
||||
if(curl_handle) {
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
|
||||
/* specify URL to get */
|
||||
curl_easy_setopt(curl_handle, CURLOPT_URL, url);
|
||||
curl_easy_setopt(curl, CURLOPT_URL, url);
|
||||
|
||||
/* send all data to this function */
|
||||
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteCallback);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
|
||||
/* some servers do not like requests that are made without a user-agent
|
||||
field, so we provide one */
|
||||
curl_easy_setopt(curl_handle, CURLOPT_USERAGENT,
|
||||
curl_easy_setopt(curl, CURLOPT_USERAGENT,
|
||||
"libcurl-speedchecker/" CHKSPEED_VERSION);
|
||||
|
||||
/* get it! */
|
||||
res = curl_easy_perform(curl_handle);
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
if(CURLE_OK == res) {
|
||||
curl_off_t val;
|
||||
|
||||
/* check for bytes downloaded */
|
||||
res = curl_easy_getinfo(curl_handle, CURLINFO_SIZE_DOWNLOAD_T, &val);
|
||||
res = curl_easy_getinfo(curl, CURLINFO_SIZE_DOWNLOAD_T, &val);
|
||||
if((CURLE_OK == res) && (val > 0))
|
||||
printf("Data downloaded: %" CURL_FORMAT_CURL_OFF_T " bytes.\n", val);
|
||||
|
||||
/* check for total download time */
|
||||
res = curl_easy_getinfo(curl_handle, CURLINFO_TOTAL_TIME_T, &val);
|
||||
res = curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME_T, &val);
|
||||
if((CURLE_OK == res) && (val > 0))
|
||||
printf("Total download time: %" CURL_FORMAT_CURL_OFF_T
|
||||
".%06" CURL_FORMAT_CURL_OFF_T " sec.\n",
|
||||
|
|
@ -195,7 +195,7 @@ int main(int argc, char *argv[])
|
|||
val % 1000000);
|
||||
|
||||
/* check for average download speed */
|
||||
res = curl_easy_getinfo(curl_handle, CURLINFO_SPEED_DOWNLOAD_T, &val);
|
||||
res = curl_easy_getinfo(curl, CURLINFO_SPEED_DOWNLOAD_T, &val);
|
||||
if((CURLE_OK == res) && (val > 0))
|
||||
printf("Average download speed: "
|
||||
"%" CURL_FORMAT_CURL_OFF_T " kbyte/sec.\n",
|
||||
|
|
@ -203,7 +203,7 @@ int main(int argc, char *argv[])
|
|||
|
||||
if(prtall) {
|
||||
/* check for name resolution time */
|
||||
res = curl_easy_getinfo(curl_handle, CURLINFO_NAMELOOKUP_TIME_T, &val);
|
||||
res = curl_easy_getinfo(curl, CURLINFO_NAMELOOKUP_TIME_T, &val);
|
||||
if((CURLE_OK == res) && (val > 0))
|
||||
printf("Name lookup time: %" CURL_FORMAT_CURL_OFF_T
|
||||
".%06" CURL_FORMAT_CURL_OFF_T " sec.\n",
|
||||
|
|
@ -211,7 +211,7 @@ int main(int argc, char *argv[])
|
|||
val % 1000000);
|
||||
|
||||
/* check for connect time */
|
||||
res = curl_easy_getinfo(curl_handle, CURLINFO_CONNECT_TIME_T, &val);
|
||||
res = curl_easy_getinfo(curl, CURLINFO_CONNECT_TIME_T, &val);
|
||||
if((CURLE_OK == res) && (val > 0))
|
||||
printf("Connect time: %" CURL_FORMAT_CURL_OFF_T
|
||||
".%06" CURL_FORMAT_CURL_OFF_T " sec.\n",
|
||||
|
|
@ -225,7 +225,7 @@ int main(int argc, char *argv[])
|
|||
}
|
||||
|
||||
/* cleanup curl stuff */
|
||||
curl_easy_cleanup(curl_handle);
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
|
||||
/* we are done with libcurl, so clean it up */
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ struct memory {
|
|||
size_t size;
|
||||
};
|
||||
|
||||
static size_t grow_buffer(void *contents, size_t sz, size_t nmemb, void *ctx)
|
||||
static size_t write_cb(void *contents, size_t sz, size_t nmemb, void *ctx)
|
||||
{
|
||||
size_t realsize = sz * nmemb;
|
||||
struct memory *mem = (struct memory*) ctx;
|
||||
|
|
@ -78,48 +78,48 @@ static size_t grow_buffer(void *contents, size_t sz, size_t nmemb, void *ctx)
|
|||
|
||||
static CURL *make_handle(const char *url)
|
||||
{
|
||||
CURL *handle = curl_easy_init();
|
||||
CURL *curl = curl_easy_init();
|
||||
struct memory *mem;
|
||||
|
||||
/* Important: use HTTP2 over HTTPS */
|
||||
curl_easy_setopt(handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2TLS);
|
||||
curl_easy_setopt(handle, CURLOPT_URL, url);
|
||||
curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2TLS);
|
||||
curl_easy_setopt(curl, CURLOPT_URL, url);
|
||||
|
||||
/* buffer body */
|
||||
mem = malloc(sizeof(*mem));
|
||||
mem->size = 0;
|
||||
mem->buf = malloc(1);
|
||||
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, grow_buffer);
|
||||
curl_easy_setopt(handle, CURLOPT_WRITEDATA, mem);
|
||||
curl_easy_setopt(handle, CURLOPT_PRIVATE, mem);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, mem);
|
||||
curl_easy_setopt(curl, CURLOPT_PRIVATE, mem);
|
||||
|
||||
/* For completeness */
|
||||
curl_easy_setopt(handle, CURLOPT_ACCEPT_ENCODING, "");
|
||||
curl_easy_setopt(handle, CURLOPT_TIMEOUT, 5L);
|
||||
curl_easy_setopt(handle, CURLOPT_FOLLOWLOCATION, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, "");
|
||||
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 5L);
|
||||
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
|
||||
/* only allow redirects to HTTP and HTTPS URLs */
|
||||
curl_easy_setopt(handle, CURLOPT_REDIR_PROTOCOLS_STR, "http,https");
|
||||
curl_easy_setopt(handle, CURLOPT_AUTOREFERER, 1L);
|
||||
curl_easy_setopt(handle, CURLOPT_MAXREDIRS, 10L);
|
||||
curl_easy_setopt(curl, CURLOPT_REDIR_PROTOCOLS_STR, "http,https");
|
||||
curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 10L);
|
||||
/* each transfer needs to be done within 20 seconds! */
|
||||
curl_easy_setopt(handle, CURLOPT_TIMEOUT_MS, 20000L);
|
||||
curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 20000L);
|
||||
/* connect fast or fail */
|
||||
curl_easy_setopt(handle, CURLOPT_CONNECTTIMEOUT_MS, 2000L);
|
||||
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, 2000L);
|
||||
/* skip files larger than a gigabyte */
|
||||
curl_easy_setopt(handle, CURLOPT_MAXFILESIZE_LARGE,
|
||||
curl_easy_setopt(curl, CURLOPT_MAXFILESIZE_LARGE,
|
||||
(curl_off_t)1024*1024*1024);
|
||||
curl_easy_setopt(handle, CURLOPT_COOKIEFILE, "");
|
||||
curl_easy_setopt(handle, CURLOPT_FILETIME, 1L);
|
||||
curl_easy_setopt(handle, CURLOPT_USERAGENT, "mini crawler");
|
||||
curl_easy_setopt(handle, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
|
||||
curl_easy_setopt(handle, CURLOPT_UNRESTRICTED_AUTH, 1L);
|
||||
curl_easy_setopt(handle, CURLOPT_PROXYAUTH, CURLAUTH_ANY);
|
||||
curl_easy_setopt(handle, CURLOPT_EXPECT_100_TIMEOUT_MS, 0L);
|
||||
return handle;
|
||||
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "");
|
||||
curl_easy_setopt(curl, CURLOPT_FILETIME, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_USERAGENT, "mini crawler");
|
||||
curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
|
||||
curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_ANY);
|
||||
curl_easy_setopt(curl, CURLOPT_EXPECT_100_TIMEOUT_MS, 0L);
|
||||
return curl;
|
||||
}
|
||||
|
||||
/* HREF finder implemented in libxml2 but could be any HTML parser */
|
||||
static size_t follow_links(CURLM *multi_handle, struct memory *mem,
|
||||
static size_t follow_links(CURLM *multi, struct memory *mem,
|
||||
const char *url)
|
||||
{
|
||||
int opts = HTML_PARSE_NOBLANKS | HTML_PARSE_NOERROR | \
|
||||
|
|
@ -160,7 +160,7 @@ static size_t follow_links(CURLM *multi_handle, struct memory *mem,
|
|||
if(!link || strlen(link) < 20)
|
||||
continue;
|
||||
if(!strncmp(link, "http://", 7) || !strncmp(link, "https://", 8)) {
|
||||
curl_multi_add_handle(multi_handle, make_handle(link));
|
||||
curl_multi_add_handle(multi, make_handle(link));
|
||||
if(count++ == max_link_per_page)
|
||||
break;
|
||||
}
|
||||
|
|
@ -177,7 +177,7 @@ static int is_html(char *ctype)
|
|||
|
||||
int main(void)
|
||||
{
|
||||
CURLM *multi_handle;
|
||||
CURLM *multi;
|
||||
int msgs_left;
|
||||
int pending;
|
||||
int complete;
|
||||
|
|
@ -190,18 +190,18 @@ int main(void)
|
|||
|
||||
signal(SIGINT, sighandler);
|
||||
LIBXML_TEST_VERSION
|
||||
multi_handle = curl_multi_init();
|
||||
if(multi_handle) {
|
||||
curl_multi_setopt(multi_handle, CURLMOPT_MAX_TOTAL_CONNECTIONS, max_con);
|
||||
curl_multi_setopt(multi_handle, CURLMOPT_MAX_HOST_CONNECTIONS, 6L);
|
||||
multi = curl_multi_init();
|
||||
if(multi) {
|
||||
curl_multi_setopt(multi, CURLMOPT_MAX_TOTAL_CONNECTIONS, max_con);
|
||||
curl_multi_setopt(multi, CURLMOPT_MAX_HOST_CONNECTIONS, 6L);
|
||||
|
||||
/* enables http/2 if available */
|
||||
#ifdef CURLPIPE_MULTIPLEX
|
||||
curl_multi_setopt(multi_handle, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
|
||||
curl_multi_setopt(multi, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
|
||||
#endif
|
||||
|
||||
/* sets html start page */
|
||||
curl_multi_add_handle(multi_handle, make_handle(start_page));
|
||||
curl_multi_add_handle(multi, make_handle(start_page));
|
||||
|
||||
pending = 0;
|
||||
complete = 0;
|
||||
|
|
@ -210,29 +210,29 @@ int main(void)
|
|||
int numfds;
|
||||
CURLMsg *m;
|
||||
|
||||
curl_multi_wait(multi_handle, NULL, 0, 1000, &numfds);
|
||||
curl_multi_perform(multi_handle, &still_running);
|
||||
curl_multi_wait(multi, NULL, 0, 1000, &numfds);
|
||||
curl_multi_perform(multi, &still_running);
|
||||
|
||||
/* See how the transfers went */
|
||||
m = NULL;
|
||||
while((m = curl_multi_info_read(multi_handle, &msgs_left))) {
|
||||
while((m = curl_multi_info_read(multi, &msgs_left))) {
|
||||
if(m->msg == CURLMSG_DONE) {
|
||||
CURL *handle = m->easy_handle;
|
||||
CURL *curl = m->easy_handle;
|
||||
char *url;
|
||||
struct memory *mem;
|
||||
curl_easy_getinfo(handle, CURLINFO_PRIVATE, &mem);
|
||||
curl_easy_getinfo(handle, CURLINFO_EFFECTIVE_URL, &url);
|
||||
curl_easy_getinfo(curl, CURLINFO_PRIVATE, &mem);
|
||||
curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &url);
|
||||
if(m->data.result == CURLE_OK) {
|
||||
long res_status;
|
||||
curl_easy_getinfo(handle, CURLINFO_RESPONSE_CODE, &res_status);
|
||||
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &res_status);
|
||||
if(res_status == 200) {
|
||||
char *ctype;
|
||||
curl_easy_getinfo(handle, CURLINFO_CONTENT_TYPE, &ctype);
|
||||
curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ctype);
|
||||
printf("[%d] HTTP 200 (%s): %s\n", complete, ctype, url);
|
||||
if(is_html(ctype) && mem->size > 100) {
|
||||
if(pending < max_requests &&
|
||||
(complete + pending) < max_total) {
|
||||
pending += follow_links(multi_handle, mem, url);
|
||||
pending += follow_links(multi_curl, mem, url);
|
||||
still_running = 1;
|
||||
}
|
||||
}
|
||||
|
|
@ -244,8 +244,8 @@ int main(void)
|
|||
else {
|
||||
printf("[%d] Connection failure: %s\n", complete, url);
|
||||
}
|
||||
curl_multi_remove_handle(multi_handle, handle);
|
||||
curl_easy_cleanup(handle);
|
||||
curl_multi_remove_handle(multi, curl);
|
||||
curl_easy_cleanup(curl);
|
||||
free(mem->buf);
|
||||
free(mem);
|
||||
complete++;
|
||||
|
|
@ -253,7 +253,7 @@ int main(void)
|
|||
}
|
||||
}
|
||||
}
|
||||
curl_multi_cleanup(multi_handle);
|
||||
curl_multi_cleanup(multi);
|
||||
}
|
||||
curl_global_cleanup();
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -81,12 +81,12 @@ static void dump(const char *text, FILE *stream, unsigned char *ptr,
|
|||
fflush(stream);
|
||||
}
|
||||
|
||||
static int my_trace(CURL *handle, curl_infotype type,
|
||||
static int my_trace(CURL *curl, curl_infotype type,
|
||||
char *data, size_t size, void *userp)
|
||||
{
|
||||
struct data *config = (struct data *)userp;
|
||||
const char *text;
|
||||
(void)handle;
|
||||
(void)curl;
|
||||
|
||||
switch(type) {
|
||||
case CURLINFO_TEXT:
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ struct GlobalInfo {
|
|||
|
||||
/* Information associated with a specific easy handle */
|
||||
struct ConnInfo {
|
||||
CURL *easy;
|
||||
CURL *curl;
|
||||
char *url;
|
||||
struct GlobalInfo *global;
|
||||
char error[CURL_ERROR_SIZE];
|
||||
|
|
@ -99,7 +99,7 @@ struct ConnInfo {
|
|||
/* Information associated with a specific socket */
|
||||
struct SockInfo {
|
||||
curl_socket_t sockfd;
|
||||
CURL *easy;
|
||||
CURL *curl;
|
||||
int action;
|
||||
long timeout;
|
||||
struct GlobalInfo *global;
|
||||
|
|
@ -172,20 +172,18 @@ static void check_multi_info(struct GlobalInfo *g)
|
|||
CURLMsg *msg;
|
||||
int msgs_left;
|
||||
struct ConnInfo *conn;
|
||||
CURL *easy;
|
||||
CURLcode res;
|
||||
|
||||
fprintf(MSG_OUT, "REMAINING: %d\n", g->still_running);
|
||||
while((msg = curl_multi_info_read(g->multi, &msgs_left))) {
|
||||
if(msg->msg == CURLMSG_DONE) {
|
||||
easy = msg->easy_handle;
|
||||
res = msg->data.result;
|
||||
curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
|
||||
curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &eff_url);
|
||||
CURL *curl = msg->easy_handle;
|
||||
CURLcode res = msg->data.result;
|
||||
curl_easy_getinfo(curl, CURLINFO_PRIVATE, &conn);
|
||||
curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &eff_url);
|
||||
fprintf(MSG_OUT, "DONE: %s => (%d) %s\n", eff_url, res, conn->error);
|
||||
curl_multi_remove_handle(g->multi, easy);
|
||||
curl_multi_remove_handle(g->multi, curl);
|
||||
free(conn->url);
|
||||
curl_easy_cleanup(easy);
|
||||
curl_easy_cleanup(curl);
|
||||
free(conn);
|
||||
}
|
||||
}
|
||||
|
|
@ -270,7 +268,7 @@ static void setsock(struct SockInfo *f, curl_socket_t s, CURL *e, int act,
|
|||
|
||||
f->sockfd = s;
|
||||
f->action = act;
|
||||
f->easy = e;
|
||||
f->curl = e;
|
||||
|
||||
ev.events = kind;
|
||||
ev.data.fd = s;
|
||||
|
|
@ -280,13 +278,13 @@ static void setsock(struct SockInfo *f, curl_socket_t s, CURL *e, int act,
|
|||
}
|
||||
|
||||
/* Initialize a new SockInfo structure */
|
||||
static void addsock(curl_socket_t s, CURL *easy, int action,
|
||||
static void addsock(curl_socket_t s, CURL *curl, int action,
|
||||
struct GlobalInfo *g)
|
||||
{
|
||||
struct SockInfo *fdp = (struct SockInfo*)calloc(1, sizeof(struct SockInfo));
|
||||
|
||||
fdp->global = g;
|
||||
setsock(fdp, s, easy, action, g);
|
||||
setsock(fdp, s, curl, action, g);
|
||||
curl_multi_assign(g->multi, s, fdp);
|
||||
}
|
||||
|
||||
|
|
@ -347,28 +345,28 @@ static void new_conn(const char *url, struct GlobalInfo *g)
|
|||
conn = (struct ConnInfo*)calloc(1, sizeof(*conn));
|
||||
conn->error[0] = '\0';
|
||||
|
||||
conn->easy = curl_easy_init();
|
||||
if(!conn->easy) {
|
||||
conn->curl = curl_easy_init();
|
||||
if(!conn->curl) {
|
||||
fprintf(MSG_OUT, "curl_easy_init() failed, exiting!\n");
|
||||
exit(2);
|
||||
}
|
||||
conn->global = g;
|
||||
conn->url = strdup(url);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_URL, conn->url);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_WRITEDATA, conn);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_VERBOSE, 1L);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_ERRORBUFFER, conn->error);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_PRIVATE, conn);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_NOPROGRESS, 0L);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_PROGRESSFUNCTION, prog_cb);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_PROGRESSDATA, conn);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_FOLLOWLOCATION, 1L);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_LOW_SPEED_TIME, 3L);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_LOW_SPEED_LIMIT, 10L);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_URL, conn->url);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_WRITEDATA, conn);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_VERBOSE, 1L);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_ERRORBUFFER, conn->error);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_PRIVATE, conn);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_NOPROGRESS, 0L);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_PROGRESSFUNCTION, prog_cb);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_PROGRESSDATA, conn);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_FOLLOWLOCATION, 1L);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_LOW_SPEED_TIME, 3L);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_LOW_SPEED_LIMIT, 10L);
|
||||
fprintf(MSG_OUT,
|
||||
"Adding easy %p to multi %p (%s)\n", conn->easy, g->multi, url);
|
||||
rc = curl_multi_add_handle(g->multi, conn->easy);
|
||||
"Adding easy %p to multi %p (%s)\n", conn->curl, g->multi, url);
|
||||
rc = curl_multi_add_handle(g->multi, conn->curl);
|
||||
mcode_or_die("new_conn: curl_multi_add_handle", rc);
|
||||
|
||||
/* note that the add_handle() sets a timeout to trigger soon so that the
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ struct GlobalInfo {
|
|||
|
||||
/* Information associated with a specific easy handle */
|
||||
struct ConnInfo {
|
||||
CURL *easy;
|
||||
CURL *curl;
|
||||
char *url;
|
||||
struct GlobalInfo *global;
|
||||
char error[CURL_ERROR_SIZE];
|
||||
|
|
@ -99,7 +99,7 @@ struct ConnInfo {
|
|||
/* Information associated with a specific socket */
|
||||
struct SockInfo {
|
||||
curl_socket_t sockfd;
|
||||
CURL *easy;
|
||||
CURL *curl;
|
||||
int action;
|
||||
long timeout;
|
||||
struct ev_io ev;
|
||||
|
|
@ -169,20 +169,18 @@ static void check_multi_info(struct GlobalInfo *g)
|
|||
CURLMsg *msg;
|
||||
int msgs_left;
|
||||
struct ConnInfo *conn;
|
||||
CURL *easy;
|
||||
CURLcode res;
|
||||
|
||||
fprintf(MSG_OUT, "REMAINING: %d\n", g->still_running);
|
||||
while((msg = curl_multi_info_read(g->multi, &msgs_left))) {
|
||||
if(msg->msg == CURLMSG_DONE) {
|
||||
easy = msg->easy_handle;
|
||||
res = msg->data.result;
|
||||
curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
|
||||
curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &eff_url);
|
||||
CURL *curl = msg->easy_handle;
|
||||
CURLcode res = msg->data.result;
|
||||
curl_easy_getinfo(curl, CURLINFO_PRIVATE, &conn);
|
||||
curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &eff_url);
|
||||
fprintf(MSG_OUT, "DONE: %s => (%d) %s\n", eff_url, res, conn->error);
|
||||
curl_multi_remove_handle(g->multi, easy);
|
||||
curl_multi_remove_handle(g->multi, curl);
|
||||
free(conn->url);
|
||||
curl_easy_cleanup(easy);
|
||||
curl_easy_cleanup(curl);
|
||||
free(conn);
|
||||
}
|
||||
}
|
||||
|
|
@ -247,7 +245,7 @@ static void setsock(struct SockInfo *f, curl_socket_t s, CURL *e, int act,
|
|||
|
||||
f->sockfd = s;
|
||||
f->action = act;
|
||||
f->easy = e;
|
||||
f->curl = e;
|
||||
if(f->evset)
|
||||
ev_io_stop(g->loop, &f->ev);
|
||||
ev_io_init(&f->ev, event_cb, f->sockfd, kind);
|
||||
|
|
@ -257,13 +255,13 @@ static void setsock(struct SockInfo *f, curl_socket_t s, CURL *e, int act,
|
|||
}
|
||||
|
||||
/* Initialize a new SockInfo structure */
|
||||
static void addsock(curl_socket_t s, CURL *easy, int action,
|
||||
static void addsock(curl_socket_t s, CURL *curl, int action,
|
||||
struct GlobalInfo *g)
|
||||
{
|
||||
struct SockInfo *fdp = calloc(1, sizeof(struct SockInfo));
|
||||
|
||||
fdp->global = g;
|
||||
setsock(fdp, s, easy, action, g);
|
||||
setsock(fdp, s, curl, action, g);
|
||||
curl_multi_assign(g->multi, s, fdp);
|
||||
}
|
||||
|
||||
|
|
@ -330,28 +328,28 @@ static void new_conn(const char *url, struct GlobalInfo *g)
|
|||
conn = calloc(1, sizeof(*conn));
|
||||
conn->error[0]='\0';
|
||||
|
||||
conn->easy = curl_easy_init();
|
||||
if(!conn->easy) {
|
||||
conn->curl = curl_easy_init();
|
||||
if(!conn->curl) {
|
||||
fprintf(MSG_OUT, "curl_easy_init() failed, exiting!\n");
|
||||
exit(2);
|
||||
}
|
||||
conn->global = g;
|
||||
conn->url = strdup(url);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_URL, conn->url);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_WRITEDATA, conn);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_VERBOSE, 1L);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_ERRORBUFFER, conn->error);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_PRIVATE, conn);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_NOPROGRESS, 0L);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_XFERINFOFUNCTION, xferinfo_cb);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_PROGRESSDATA, conn);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_LOW_SPEED_TIME, 3L);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_LOW_SPEED_LIMIT, 10L);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_URL, conn->url);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_WRITEDATA, conn);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_VERBOSE, 1L);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_ERRORBUFFER, conn->error);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_PRIVATE, conn);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_NOPROGRESS, 0L);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_XFERINFOFUNCTION, xferinfo_cb);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_PROGRESSDATA, conn);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_LOW_SPEED_TIME, 3L);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_LOW_SPEED_LIMIT, 10L);
|
||||
|
||||
fprintf(MSG_OUT,
|
||||
"Adding easy %p to multi %p (%s)\n", conn->easy, g->multi, url);
|
||||
rc = curl_multi_add_handle(g->multi, conn->easy);
|
||||
"Adding easy %p to multi %p (%s)\n", conn->curl, g->multi, url);
|
||||
rc = curl_multi_add_handle(g->multi, conn->curl);
|
||||
mcode_or_die("new_conn: curl_multi_add_handle", rc);
|
||||
|
||||
/* note that add_handle() sets a timeout to trigger soon so that the
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@
|
|||
#define INADDR_NONE 0xffffffff
|
||||
#endif
|
||||
|
||||
static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
{
|
||||
size_t written = fwrite(ptr, size, nmemb, (FILE *)stream);
|
||||
return written;
|
||||
|
|
@ -143,7 +143,7 @@ int main(void)
|
|||
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
|
||||
|
||||
/* send all data to this function */
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
|
||||
/* call this function to get a socket */
|
||||
curl_easy_setopt(curl, CURLOPT_OPENSOCKETFUNCTION, opensocket);
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@
|
|||
* </DESC>
|
||||
*/
|
||||
|
||||
static size_t my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream)
|
||||
static size_t write_cb(void *buffer, size_t size, size_t nmemb, void *stream)
|
||||
{
|
||||
(void)buffer;
|
||||
(void)stream;
|
||||
|
|
@ -54,7 +54,7 @@ int main(void)
|
|||
*/
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "ftp://ftp.example.com/");
|
||||
/* Define our callback to get called when there is data to be written */
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
|
||||
/* Switch on full protocol/debug output */
|
||||
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@ static long file_is_downloaded(void *input)
|
|||
return CURL_CHUNK_END_FUNC_OK;
|
||||
}
|
||||
|
||||
static size_t write_it(char *buff, size_t size, size_t nmemb,
|
||||
static size_t write_cb(char *buff, size_t size, size_t nmemb,
|
||||
void *cb_data)
|
||||
{
|
||||
struct callback_data *data = cb_data;
|
||||
|
|
@ -94,7 +94,7 @@ static size_t write_it(char *buff, size_t size, size_t nmemb,
|
|||
int main(int argc, char **argv)
|
||||
{
|
||||
/* curl easy handle */
|
||||
CURL *handle;
|
||||
CURL *curl;
|
||||
|
||||
/* help data */
|
||||
struct callback_data data = { 0 };
|
||||
|
|
@ -105,40 +105,40 @@ int main(int argc, char **argv)
|
|||
return (int)res;
|
||||
|
||||
/* initialization of easy handle */
|
||||
handle = curl_easy_init();
|
||||
if(!handle) {
|
||||
curl = curl_easy_init();
|
||||
if(!curl) {
|
||||
curl_global_cleanup();
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
/* turn on wildcard matching */
|
||||
curl_easy_setopt(handle, CURLOPT_WILDCARDMATCH, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_WILDCARDMATCH, 1L);
|
||||
|
||||
/* callback is called before download of concrete file started */
|
||||
curl_easy_setopt(handle, CURLOPT_CHUNK_BGN_FUNCTION, file_is_coming);
|
||||
curl_easy_setopt(curl, CURLOPT_CHUNK_BGN_FUNCTION, file_is_coming);
|
||||
|
||||
/* callback is called after data from the file have been transferred */
|
||||
curl_easy_setopt(handle, CURLOPT_CHUNK_END_FUNCTION, file_is_downloaded);
|
||||
curl_easy_setopt(curl, CURLOPT_CHUNK_END_FUNCTION, file_is_downloaded);
|
||||
|
||||
/* this callback writes contents into files */
|
||||
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, write_it);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
|
||||
/* put transfer data into callbacks */
|
||||
curl_easy_setopt(handle, CURLOPT_CHUNK_DATA, &data);
|
||||
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &data);
|
||||
curl_easy_setopt(curl, CURLOPT_CHUNK_DATA, &data);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data);
|
||||
|
||||
/* curl_easy_setopt(handle, CURLOPT_VERBOSE, 1L); */
|
||||
/* curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); */
|
||||
|
||||
/* set a URL containing wildcard pattern (only in the last part) */
|
||||
if(argc == 2)
|
||||
curl_easy_setopt(handle, CURLOPT_URL, argv[1]);
|
||||
curl_easy_setopt(curl, CURLOPT_URL, argv[1]);
|
||||
else
|
||||
curl_easy_setopt(handle, CURLOPT_URL, "ftp://example.com/test/*");
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/test/*");
|
||||
|
||||
/* and start transfer! */
|
||||
res = curl_easy_perform(handle);
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
curl_easy_cleanup(handle);
|
||||
curl_easy_cleanup(curl);
|
||||
curl_global_cleanup();
|
||||
return (int)res;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ struct FtpFile {
|
|||
FILE *stream;
|
||||
};
|
||||
|
||||
static size_t my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream)
|
||||
static size_t write_cb(void *buffer, size_t size, size_t nmemb, void *stream)
|
||||
{
|
||||
struct FtpFile *out = (struct FtpFile *)stream;
|
||||
if(!out->stream) {
|
||||
|
|
@ -69,7 +69,7 @@ int main(void)
|
|||
curl_easy_setopt(curl, CURLOPT_URL,
|
||||
"ftp://ftp.example.com/curl/curl-7.9.2.tar.gz");
|
||||
/* Define our callback to get called when there is data to be written */
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
/* Set a pointer to our struct to pass to the callback */
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile);
|
||||
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ struct FtpFile {
|
|||
FILE *stream;
|
||||
};
|
||||
|
||||
static size_t my_fwrite(void *buffer, size_t size, size_t nmemb,
|
||||
static size_t write_cb(void *buffer, size_t size, size_t nmemb,
|
||||
void *stream)
|
||||
{
|
||||
struct FtpFile *out = (struct FtpFile *)stream;
|
||||
|
|
@ -73,7 +73,7 @@ int main(void)
|
|||
curl_easy_setopt(curl, CURLOPT_URL,
|
||||
"ftp://user@server/home/user/file.txt");
|
||||
/* Define our callback to get called when there is data to be written */
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
/* Set a pointer to our struct to pass to the callback */
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile);
|
||||
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@
|
|||
you MUST also provide a read callback with CURLOPT_READFUNCTION. Failing to
|
||||
do so might give you a crash since a DLL may not use the variable's memory
|
||||
when passed in to it from an app like this. */
|
||||
static size_t read_callback(char *ptr, size_t size, size_t nmemb, void *stream)
|
||||
static size_t read_cb(char *ptr, size_t size, size_t nmemb, void *stream)
|
||||
{
|
||||
unsigned long nread;
|
||||
/* in real-world cases, this would probably get this data differently
|
||||
|
|
@ -123,7 +123,7 @@ int main(void)
|
|||
headerlist = curl_slist_append(headerlist, buf_2);
|
||||
|
||||
/* we want to use our own read function */
|
||||
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
|
||||
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_cb);
|
||||
|
||||
/* enable uploading */
|
||||
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ struct WriteThis {
|
|||
size_t sizeleft;
|
||||
};
|
||||
|
||||
static size_t read_callback(char *ptr, size_t size, size_t nmemb, void *userp)
|
||||
static size_t read_cb(char *ptr, size_t size, size_t nmemb, void *userp)
|
||||
{
|
||||
struct WriteThis *upload = (struct WriteThis *)userp;
|
||||
size_t max = size*nmemb;
|
||||
|
|
@ -99,7 +99,7 @@ int main(void)
|
|||
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
|
||||
|
||||
/* we want to use our own read function */
|
||||
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
|
||||
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_cb);
|
||||
|
||||
/* pointer to pass to our read function */
|
||||
curl_easy_setopt(curl, CURLOPT_READDATA, &upload);
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ static size_t getcontentlengthfunc(void *ptr, size_t size, size_t nmemb,
|
|||
}
|
||||
|
||||
/* discard downloaded data */
|
||||
static size_t discardfunc(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
{
|
||||
(void)ptr;
|
||||
(void)stream;
|
||||
|
|
@ -53,7 +53,7 @@ static size_t discardfunc(void *ptr, size_t size, size_t nmemb, void *stream)
|
|||
}
|
||||
|
||||
/* read data to upload */
|
||||
static size_t readfunc(char *ptr, size_t size, size_t nmemb, void *stream)
|
||||
static size_t read_cb(char *ptr, size_t size, size_t nmemb, void *stream)
|
||||
{
|
||||
FILE *f = stream;
|
||||
size_t n;
|
||||
|
|
@ -67,12 +67,12 @@ static size_t readfunc(char *ptr, size_t size, size_t nmemb, void *stream)
|
|||
}
|
||||
|
||||
|
||||
static int upload(CURL *curlhandle, const char *remotepath,
|
||||
static int upload(CURL *curl, const char *remotepath,
|
||||
const char *localpath, long timeout, long tries)
|
||||
{
|
||||
FILE *f;
|
||||
long uploaded_len = 0;
|
||||
CURLcode r = CURLE_GOT_NOTHING;
|
||||
CURLcode res = CURLE_GOT_NOTHING;
|
||||
int c;
|
||||
|
||||
f = fopen(localpath, "rb");
|
||||
|
|
@ -83,32 +83,32 @@ static int upload(CURL *curlhandle, const char *remotepath,
|
|||
return 0;
|
||||
}
|
||||
|
||||
curl_easy_setopt(curlhandle, CURLOPT_UPLOAD, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
|
||||
|
||||
curl_easy_setopt(curlhandle, CURLOPT_URL, remotepath);
|
||||
curl_easy_setopt(curl, CURLOPT_URL, remotepath);
|
||||
|
||||
if(timeout)
|
||||
curl_easy_setopt(curlhandle, CURLOPT_SERVER_RESPONSE_TIMEOUT, timeout);
|
||||
curl_easy_setopt(curl, CURLOPT_SERVER_RESPONSE_TIMEOUT, timeout);
|
||||
|
||||
curl_easy_setopt(curlhandle, CURLOPT_HEADERFUNCTION, getcontentlengthfunc);
|
||||
curl_easy_setopt(curlhandle, CURLOPT_HEADERDATA, &uploaded_len);
|
||||
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, getcontentlengthfunc);
|
||||
curl_easy_setopt(curl, CURLOPT_HEADERDATA, &uploaded_len);
|
||||
|
||||
curl_easy_setopt(curlhandle, CURLOPT_WRITEFUNCTION, discardfunc);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
|
||||
curl_easy_setopt(curlhandle, CURLOPT_READFUNCTION, readfunc);
|
||||
curl_easy_setopt(curlhandle, CURLOPT_READDATA, f);
|
||||
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_cb);
|
||||
curl_easy_setopt(curl, CURLOPT_READDATA, f);
|
||||
|
||||
/* enable active mode */
|
||||
curl_easy_setopt(curlhandle, CURLOPT_FTPPORT, "-");
|
||||
curl_easy_setopt(curl, CURLOPT_FTPPORT, "-");
|
||||
|
||||
/* allow the server no more than 7 seconds to connect back */
|
||||
curl_easy_setopt(curlhandle, CURLOPT_ACCEPTTIMEOUT_MS, 7000L);
|
||||
curl_easy_setopt(curl, CURLOPT_ACCEPTTIMEOUT_MS, 7000L);
|
||||
|
||||
curl_easy_setopt(curlhandle, CURLOPT_FTP_CREATE_MISSING_DIRS, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_FTP_CREATE_MISSING_DIRS, 1L);
|
||||
|
||||
curl_easy_setopt(curlhandle, CURLOPT_VERBOSE, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||
|
||||
for(c = 0; (r != CURLE_OK) && (c < tries); c++) {
|
||||
for(c = 0; (res != CURLE_OK) && (c < tries); c++) {
|
||||
/* are we resuming? */
|
||||
if(c) { /* yes */
|
||||
/* determine the length of the file already written */
|
||||
|
|
@ -116,55 +116,52 @@ static int upload(CURL *curlhandle, const char *remotepath,
|
|||
/*
|
||||
* With NOBODY and NOHEADER, libcurl issues a SIZE command, but the only
|
||||
* way to retrieve the result is to parse the returned Content-Length
|
||||
* header. Thus, getcontentlengthfunc(). We need discardfunc() above
|
||||
* header. Thus, getcontentlengthfunc(). We need write_cb() above
|
||||
* because HEADER dumps the headers to stdout without it.
|
||||
*/
|
||||
curl_easy_setopt(curlhandle, CURLOPT_NOBODY, 1L);
|
||||
curl_easy_setopt(curlhandle, CURLOPT_HEADER, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_NOBODY, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_HEADER, 1L);
|
||||
|
||||
r = curl_easy_perform(curlhandle);
|
||||
if(r != CURLE_OK)
|
||||
res = curl_easy_perform(curl);
|
||||
if(res != CURLE_OK)
|
||||
continue;
|
||||
|
||||
curl_easy_setopt(curlhandle, CURLOPT_NOBODY, 0L);
|
||||
curl_easy_setopt(curlhandle, CURLOPT_HEADER, 0L);
|
||||
curl_easy_setopt(curl, CURLOPT_NOBODY, 0L);
|
||||
curl_easy_setopt(curl, CURLOPT_HEADER, 0L);
|
||||
|
||||
fseek(f, uploaded_len, SEEK_SET);
|
||||
|
||||
curl_easy_setopt(curlhandle, CURLOPT_APPEND, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_APPEND, 1L);
|
||||
}
|
||||
else { /* no */
|
||||
curl_easy_setopt(curlhandle, CURLOPT_APPEND, 0L);
|
||||
curl_easy_setopt(curl, CURLOPT_APPEND, 0L);
|
||||
}
|
||||
|
||||
r = curl_easy_perform(curlhandle);
|
||||
res = curl_easy_perform(curl);
|
||||
}
|
||||
|
||||
fclose(f);
|
||||
|
||||
if(r == CURLE_OK)
|
||||
if(res == CURLE_OK)
|
||||
return 1;
|
||||
else {
|
||||
fprintf(stderr, "%s\n", curl_easy_strerror(r));
|
||||
fprintf(stderr, "%s\n", curl_easy_strerror(res));
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
CURL *curlhandle = NULL;
|
||||
CURL *curl = NULL;
|
||||
|
||||
CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
|
||||
if(res)
|
||||
return (int)res;
|
||||
|
||||
curlhandle = curl_easy_init();
|
||||
if(curlhandle) {
|
||||
|
||||
upload(curlhandle, "ftp://user:pass@example.com/path/file", "C:\\file",
|
||||
0, 3);
|
||||
|
||||
curl_easy_cleanup(curlhandle);
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
upload(curl, "ftp://user:pass@example.com/path/file", "C:\\file", 0, 3);
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
curl_global_cleanup();
|
||||
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ struct MemoryStruct {
|
|||
size_t size;
|
||||
};
|
||||
|
||||
static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb,
|
||||
static size_t write_cb(void *contents, size_t size, size_t nmemb,
|
||||
void *userp)
|
||||
{
|
||||
size_t realsize = size * nmemb;
|
||||
|
|
@ -61,7 +61,7 @@ static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb,
|
|||
|
||||
int main(void)
|
||||
{
|
||||
CURL *curl_handle;
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
|
||||
struct MemoryStruct chunk;
|
||||
|
|
@ -74,24 +74,24 @@ int main(void)
|
|||
chunk.size = 0; /* no data at this point */
|
||||
|
||||
/* init the curl session */
|
||||
curl_handle = curl_easy_init();
|
||||
if(curl_handle) {
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
|
||||
/* specify URL to get */
|
||||
curl_easy_setopt(curl_handle, CURLOPT_URL, "https://www.example.com/");
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com/");
|
||||
|
||||
/* send all data to this function */
|
||||
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
|
||||
/* we pass our 'chunk' struct to the callback function */
|
||||
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
|
||||
|
||||
/* some servers do not like requests that are made without a user-agent
|
||||
field, so we provide one */
|
||||
curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");
|
||||
curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");
|
||||
|
||||
/* get it! */
|
||||
res = curl_easy_perform(curl_handle);
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
/* check for errors */
|
||||
if(res != CURLE_OK) {
|
||||
|
|
@ -110,7 +110,7 @@ int main(void)
|
|||
}
|
||||
|
||||
/* cleanup curl stuff */
|
||||
curl_easy_cleanup(curl_handle);
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
|
||||
free(chunk.memory);
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@ struct GlobalInfo {
|
|||
|
||||
/* Information associated with a specific easy handle */
|
||||
struct ConnInfo {
|
||||
CURL *easy;
|
||||
CURL *curl;
|
||||
char *url;
|
||||
struct GlobalInfo *global;
|
||||
char error[CURL_ERROR_SIZE];
|
||||
|
|
@ -87,7 +87,7 @@ struct ConnInfo {
|
|||
/* Information associated with a specific socket */
|
||||
struct SockInfo {
|
||||
curl_socket_t sockfd;
|
||||
CURL *easy;
|
||||
CURL *curl;
|
||||
int action;
|
||||
long timeout;
|
||||
GIOChannel *ch;
|
||||
|
|
@ -124,16 +124,16 @@ static void check_multi_info(struct GlobalInfo *g)
|
|||
MSG_OUT("REMAINING: %d\n", g->still_running);
|
||||
while((msg = curl_multi_info_read(g->multi, &msgs_left))) {
|
||||
if(msg->msg == CURLMSG_DONE) {
|
||||
CURL *easy = msg->easy_handle;
|
||||
CURL *curl = msg->easy_handle;
|
||||
CURLcode res = msg->data.result;
|
||||
char *eff_url;
|
||||
struct ConnInfo *conn;
|
||||
curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
|
||||
curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &eff_url);
|
||||
curl_easy_getinfo(curl, CURLINFO_PRIVATE, &conn);
|
||||
curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &eff_url);
|
||||
MSG_OUT("DONE: %s => (%d) %s\n", eff_url, res, conn->error);
|
||||
curl_multi_remove_handle(g->multi, easy);
|
||||
curl_multi_remove_handle(g->multi, curl);
|
||||
free(conn->url);
|
||||
curl_easy_cleanup(easy);
|
||||
curl_easy_cleanup(curl);
|
||||
free(conn);
|
||||
}
|
||||
}
|
||||
|
|
@ -223,7 +223,7 @@ static void setsock(struct SockInfo *f, curl_socket_t s, CURL *e, int act,
|
|||
|
||||
f->sockfd = s;
|
||||
f->action = act;
|
||||
f->easy = e;
|
||||
f->curl = e;
|
||||
if(f->ev) {
|
||||
g_source_remove(f->ev);
|
||||
}
|
||||
|
|
@ -231,14 +231,14 @@ static void setsock(struct SockInfo *f, curl_socket_t s, CURL *e, int act,
|
|||
}
|
||||
|
||||
/* Initialize a new SockInfo structure */
|
||||
static void addsock(curl_socket_t s, CURL *easy, int action,
|
||||
static void addsock(curl_socket_t s, CURL *curl, int action,
|
||||
struct GlobalInfo *g)
|
||||
{
|
||||
struct SockInfo *fdp = g_malloc0(sizeof(struct SockInfo));
|
||||
|
||||
fdp->global = g;
|
||||
fdp->ch = g_io_channel_unix_new(s);
|
||||
setsock(fdp, s, easy, action, g);
|
||||
setsock(fdp, s, curl, action, g);
|
||||
curl_multi_assign(g->multi, s, fdp);
|
||||
}
|
||||
|
||||
|
|
@ -301,29 +301,29 @@ static void new_conn(const char *url, struct GlobalInfo *g)
|
|||
|
||||
conn = g_malloc0(sizeof(*conn));
|
||||
conn->error[0] = '\0';
|
||||
conn->easy = curl_easy_init();
|
||||
if(!conn->easy) {
|
||||
conn->curl = curl_easy_init();
|
||||
if(!conn->curl) {
|
||||
MSG_OUT("curl_easy_init() failed, exiting!\n");
|
||||
exit(2);
|
||||
}
|
||||
conn->global = g;
|
||||
conn->url = g_strdup(url);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_URL, conn->url);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_WRITEDATA, &conn);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_VERBOSE, SHOW_VERBOSE);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_ERRORBUFFER, conn->error);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_PRIVATE, conn);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_NOPROGRESS, SHOW_PROGRESS ? 0L : 1L);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_XFERINFOFUNCTION, xferinfo_cb);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_PROGRESSDATA, conn);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_FOLLOWLOCATION, 1L);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_CONNECTTIMEOUT, 30L);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_LOW_SPEED_LIMIT, 1L);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_LOW_SPEED_TIME, 30L);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_URL, conn->url);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_WRITEDATA, &conn);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_VERBOSE, SHOW_VERBOSE);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_ERRORBUFFER, conn->error);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_PRIVATE, conn);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_NOPROGRESS, SHOW_PROGRESS ? 0L : 1L);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_XFERINFOFUNCTION, xferinfo_cb);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_PROGRESSDATA, conn);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_FOLLOWLOCATION, 1L);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_CONNECTTIMEOUT, 30L);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_LOW_SPEED_LIMIT, 1L);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_LOW_SPEED_TIME, 30L);
|
||||
|
||||
MSG_OUT("Adding easy %p to multi %p (%s)\n", conn->easy, g->multi, url);
|
||||
rc = curl_multi_add_handle(g->multi, conn->easy);
|
||||
MSG_OUT("Adding easy %p to multi %p (%s)\n", conn->curl, g->multi, url);
|
||||
rc = curl_multi_add_handle(g->multi, conn->curl);
|
||||
mcode_or_die("new_conn: curl_multi_add_handle", rc);
|
||||
|
||||
/* note that add_handle() sets a timeout to trigger soon so that the
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ struct GlobalInfo {
|
|||
|
||||
/* Information associated with a specific easy handle */
|
||||
struct ConnInfo {
|
||||
CURL *easy;
|
||||
CURL *curl;
|
||||
char *url;
|
||||
struct GlobalInfo *global;
|
||||
char error[CURL_ERROR_SIZE];
|
||||
|
|
@ -99,7 +99,7 @@ struct ConnInfo {
|
|||
/* Information associated with a specific socket */
|
||||
struct SockInfo {
|
||||
curl_socket_t sockfd;
|
||||
CURL *easy;
|
||||
CURL *curl;
|
||||
int action;
|
||||
long timeout;
|
||||
struct event ev;
|
||||
|
|
@ -162,20 +162,18 @@ static void check_multi_info(struct GlobalInfo *g)
|
|||
CURLMsg *msg;
|
||||
int msgs_left;
|
||||
struct ConnInfo *conn;
|
||||
CURL *easy;
|
||||
CURLcode res;
|
||||
|
||||
fprintf(MSG_OUT, "REMAINING: %d\n", g->still_running);
|
||||
while((msg = curl_multi_info_read(g->multi, &msgs_left))) {
|
||||
if(msg->msg == CURLMSG_DONE) {
|
||||
easy = msg->easy_handle;
|
||||
res = msg->data.result;
|
||||
curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
|
||||
curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &eff_url);
|
||||
CURL *curl = msg->easy_handle;
|
||||
CURLcode res = msg->data.result;
|
||||
curl_easy_getinfo(curl, CURLINFO_PRIVATE, &conn);
|
||||
curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &eff_url);
|
||||
fprintf(MSG_OUT, "DONE: %s => (%d) %s\n", eff_url, res, conn->error);
|
||||
curl_multi_remove_handle(g->multi, easy);
|
||||
curl_multi_remove_handle(g->multi, curl);
|
||||
free(conn->url);
|
||||
curl_easy_cleanup(easy);
|
||||
curl_easy_cleanup(curl);
|
||||
free(conn);
|
||||
}
|
||||
}
|
||||
|
|
@ -240,7 +238,7 @@ static void setsock(struct SockInfo *f, curl_socket_t s, CURL *e, int act,
|
|||
|
||||
f->sockfd = s;
|
||||
f->action = act;
|
||||
f->easy = e;
|
||||
f->curl = e;
|
||||
if(event_initialized(&f->ev)) {
|
||||
event_del(&f->ev);
|
||||
}
|
||||
|
|
@ -249,13 +247,13 @@ static void setsock(struct SockInfo *f, curl_socket_t s, CURL *e, int act,
|
|||
}
|
||||
|
||||
/* Initialize a new SockInfo structure */
|
||||
static void addsock(curl_socket_t s, CURL *easy, int action,
|
||||
static void addsock(curl_socket_t s, CURL *curl, int action,
|
||||
struct GlobalInfo *g)
|
||||
{
|
||||
struct SockInfo *fdp = calloc(1, sizeof(struct SockInfo));
|
||||
|
||||
fdp->global = g;
|
||||
setsock(fdp, s, easy, action, g);
|
||||
setsock(fdp, s, curl, action, g);
|
||||
curl_multi_assign(g->multi, s, fdp);
|
||||
}
|
||||
|
||||
|
|
@ -317,26 +315,26 @@ static void new_conn(const char *url, struct GlobalInfo *g)
|
|||
conn = calloc(1, sizeof(*conn));
|
||||
conn->error[0] = '\0';
|
||||
|
||||
conn->easy = curl_easy_init();
|
||||
if(!conn->easy) {
|
||||
conn->curl = curl_easy_init();
|
||||
if(!conn->curl) {
|
||||
fprintf(MSG_OUT, "curl_easy_init() failed, exiting!\n");
|
||||
exit(2);
|
||||
}
|
||||
conn->global = g;
|
||||
conn->url = strdup(url);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_URL, conn->url);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_WRITEDATA, conn);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_VERBOSE, 1L);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_ERRORBUFFER, conn->error);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_PRIVATE, conn);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_NOPROGRESS, 0L);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_XFERINFOFUNCTION, xferinfo_cb);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_PROGRESSDATA, conn);
|
||||
curl_easy_setopt(conn->easy, CURLOPT_FOLLOWLOCATION, 1L);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_URL, conn->url);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_WRITEDATA, conn);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_VERBOSE, 1L);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_ERRORBUFFER, conn->error);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_PRIVATE, conn);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_NOPROGRESS, 0L);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_XFERINFOFUNCTION, xferinfo_cb);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_PROGRESSDATA, conn);
|
||||
curl_easy_setopt(conn->curl, CURLOPT_FOLLOWLOCATION, 1L);
|
||||
fprintf(MSG_OUT,
|
||||
"Adding easy %p to multi %p (%s)\n", conn->easy, g->multi, url);
|
||||
rc = curl_multi_add_handle(g->multi, conn->easy);
|
||||
"Adding easy %p to multi %p (%s)\n", conn->curl, g->multi, url);
|
||||
rc = curl_multi_add_handle(g->multi, conn->curl);
|
||||
mcode_or_die("new_conn: curl_multi_add_handle", rc);
|
||||
|
||||
/* note that the add_handle() sets a time-out to trigger soon so that
|
||||
|
|
|
|||
|
|
@ -46,13 +46,13 @@ struct state {
|
|||
|
||||
/* "read" is from the point of the library, it wants data from us. One domain
|
||||
entry per invoke. */
|
||||
static CURLSTScode hstsread(CURL *easy, struct curl_hstsentry *e,
|
||||
static CURLSTScode hstsread(CURL *curl, struct curl_hstsentry *e,
|
||||
void *userp)
|
||||
{
|
||||
const char *host;
|
||||
const char *expire;
|
||||
struct state *s = (struct state *)userp;
|
||||
(void)easy;
|
||||
(void)curl;
|
||||
host = preload_hosts[s->index].name;
|
||||
expire = preload_hosts[s->index++].exp;
|
||||
|
||||
|
|
@ -67,10 +67,10 @@ static CURLSTScode hstsread(CURL *easy, struct curl_hstsentry *e,
|
|||
return CURLSTS_OK;
|
||||
}
|
||||
|
||||
static CURLSTScode hstswrite(CURL *easy, struct curl_hstsentry *e,
|
||||
static CURLSTScode hstswrite(CURL *curl, struct curl_hstsentry *e,
|
||||
struct curl_index *i, void *userp)
|
||||
{
|
||||
(void)easy;
|
||||
(void)curl;
|
||||
(void)userp; /* we have no custom input */
|
||||
printf("[%u/%u] %s %s\n", (unsigned int)i->index, (unsigned int)i->total,
|
||||
e->name, e->expire);
|
||||
|
|
|
|||
|
|
@ -86,43 +86,43 @@ static size_t writer(char *data, size_t size, size_t nmemb,
|
|||
// libcurl connection initialization
|
||||
//
|
||||
|
||||
static bool init(CURL *&conn, const char *url)
|
||||
static bool init(CURL *&curl, const char *url)
|
||||
{
|
||||
CURLcode code;
|
||||
CURLcode res;
|
||||
|
||||
conn = curl_easy_init();
|
||||
curl = curl_easy_init();
|
||||
|
||||
if(conn == NULL) {
|
||||
fprintf(stderr, "Failed to create CURL connection\n");
|
||||
if(!curl) {
|
||||
fprintf(stderr, "Failed to create CURL handle\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
code = curl_easy_setopt(conn, CURLOPT_ERRORBUFFER, errorBuffer);
|
||||
if(code != CURLE_OK) {
|
||||
fprintf(stderr, "Failed to set error buffer [%d]\n", code);
|
||||
res = curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);
|
||||
if(res != CURLE_OK) {
|
||||
fprintf(stderr, "Failed to set error buffer [%d]\n", res);
|
||||
return false;
|
||||
}
|
||||
|
||||
code = curl_easy_setopt(conn, CURLOPT_URL, url);
|
||||
if(code != CURLE_OK) {
|
||||
res = curl_easy_setopt(curl, CURLOPT_URL, url);
|
||||
if(res != CURLE_OK) {
|
||||
fprintf(stderr, "Failed to set URL [%s]\n", errorBuffer);
|
||||
return false;
|
||||
}
|
||||
|
||||
code = curl_easy_setopt(conn, CURLOPT_FOLLOWLOCATION, 1L);
|
||||
if(code != CURLE_OK) {
|
||||
res = curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
|
||||
if(res != CURLE_OK) {
|
||||
fprintf(stderr, "Failed to set redirect option [%s]\n", errorBuffer);
|
||||
return false;
|
||||
}
|
||||
|
||||
code = curl_easy_setopt(conn, CURLOPT_WRITEFUNCTION, writer);
|
||||
if(code != CURLE_OK) {
|
||||
res = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
|
||||
if(res != CURLE_OK) {
|
||||
fprintf(stderr, "Failed to set writer [%s]\n", errorBuffer);
|
||||
return false;
|
||||
}
|
||||
|
||||
code = curl_easy_setopt(conn, CURLOPT_WRITEDATA, &buffer);
|
||||
if(code != CURLE_OK) {
|
||||
res = curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
|
||||
if(res != CURLE_OK) {
|
||||
fprintf(stderr, "Failed to set write data [%s]\n", errorBuffer);
|
||||
return false;
|
||||
}
|
||||
|
|
@ -262,7 +262,7 @@ static void parseHtml(const std::string &html,
|
|||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
CURL *conn = NULL;
|
||||
CURL *curl = NULL;
|
||||
CURLcode res;
|
||||
std::string title;
|
||||
|
||||
|
|
@ -277,18 +277,18 @@ int main(int argc, char *argv[])
|
|||
if(res)
|
||||
return (int)res;
|
||||
|
||||
// Initialize CURL connection
|
||||
// Initialize CURL handle
|
||||
|
||||
if(!init(conn, argv[1])) {
|
||||
fprintf(stderr, "Connection initialization failed\n");
|
||||
if(!init(curl, argv[1])) {
|
||||
fprintf(stderr, "Handle initialization failed\n");
|
||||
curl_global_cleanup();
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
// Retrieve content for the URL
|
||||
|
||||
res = curl_easy_perform(conn);
|
||||
curl_easy_cleanup(conn);
|
||||
res = curl_easy_perform(curl);
|
||||
curl_easy_cleanup(curl);
|
||||
|
||||
if(res != CURLE_OK) {
|
||||
fprintf(stderr, "Failed to get '%s' [%s]\n", argv[1], errorBuffer);
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@
|
|||
|
||||
struct transfer {
|
||||
FILE *out;
|
||||
CURL *easy;
|
||||
CURL *curl;
|
||||
int num;
|
||||
};
|
||||
|
||||
|
|
@ -101,13 +101,13 @@ static void dump(const char *text, int num, unsigned char *ptr,
|
|||
}
|
||||
}
|
||||
|
||||
static int my_trace(CURL *handle, curl_infotype type,
|
||||
static int my_trace(CURL *curl, curl_infotype type,
|
||||
char *data, size_t size, void *userp)
|
||||
{
|
||||
const char *text;
|
||||
struct transfer *t = (struct transfer *)userp;
|
||||
int num = t->num;
|
||||
(void)handle;
|
||||
(void)curl;
|
||||
|
||||
switch(type) {
|
||||
case CURLINFO_TEXT:
|
||||
|
|
@ -142,9 +142,9 @@ static int my_trace(CURL *handle, curl_infotype type,
|
|||
static int setup(struct transfer *t, int num)
|
||||
{
|
||||
char filename[128];
|
||||
CURL *easy;
|
||||
CURL *curl;
|
||||
|
||||
easy = t->easy = NULL;
|
||||
curl = t->curl = NULL;
|
||||
|
||||
t->num = num;
|
||||
snprintf(filename, sizeof(filename), "dl-%d", num);
|
||||
|
|
@ -155,29 +155,29 @@ static int setup(struct transfer *t, int num)
|
|||
return 1;
|
||||
}
|
||||
|
||||
easy = t->easy = curl_easy_init();
|
||||
if(easy) {
|
||||
curl = t->curl = curl_easy_init();
|
||||
if(curl) {
|
||||
|
||||
/* write to this file */
|
||||
curl_easy_setopt(easy, CURLOPT_WRITEDATA, t->out);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, t->out);
|
||||
|
||||
/* set the same URL */
|
||||
curl_easy_setopt(easy, CURLOPT_URL, "https://localhost:8443/index.html");
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "https://localhost:8443/index.html");
|
||||
|
||||
/* please be verbose */
|
||||
curl_easy_setopt(easy, CURLOPT_VERBOSE, 1L);
|
||||
curl_easy_setopt(easy, CURLOPT_DEBUGFUNCTION, my_trace);
|
||||
curl_easy_setopt(easy, CURLOPT_DEBUGDATA, t);
|
||||
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace);
|
||||
curl_easy_setopt(curl, CURLOPT_DEBUGDATA, t);
|
||||
|
||||
/* enlarge the receive buffer for potentially higher transfer speeds */
|
||||
curl_easy_setopt(easy, CURLOPT_BUFFERSIZE, 100000L);
|
||||
curl_easy_setopt(curl, CURLOPT_BUFFERSIZE, 100000L);
|
||||
|
||||
/* HTTP/2 please */
|
||||
curl_easy_setopt(easy, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
|
||||
curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
|
||||
|
||||
#if (CURLPIPE_MULTIPLEX > 0)
|
||||
/* wait for pipe connection to confirm */
|
||||
curl_easy_setopt(easy, CURLOPT_PIPEWAIT, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_PIPEWAIT, 1L);
|
||||
#endif
|
||||
}
|
||||
return 0;
|
||||
|
|
@ -190,7 +190,7 @@ int main(int argc, char **argv)
|
|||
{
|
||||
CURLcode res;
|
||||
struct transfer *trans;
|
||||
CURLM *multi_handle = NULL;
|
||||
CURLM *multi = NULL;
|
||||
int i;
|
||||
int still_running = 0; /* keep number of running handles */
|
||||
int num_transfers;
|
||||
|
|
@ -215,8 +215,8 @@ int main(int argc, char **argv)
|
|||
}
|
||||
|
||||
/* init a multi stack */
|
||||
multi_handle = curl_multi_init();
|
||||
if(!multi_handle)
|
||||
multi = curl_multi_init();
|
||||
if(!multi)
|
||||
goto error;
|
||||
|
||||
for(i = 0; i < num_transfers; i++) {
|
||||
|
|
@ -225,17 +225,17 @@ int main(int argc, char **argv)
|
|||
}
|
||||
|
||||
/* add the individual transfer */
|
||||
curl_multi_add_handle(multi_handle, trans[i].easy);
|
||||
curl_multi_add_handle(multi, trans[i].curl);
|
||||
}
|
||||
|
||||
curl_multi_setopt(multi_handle, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
|
||||
curl_multi_setopt(multi, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
|
||||
|
||||
do {
|
||||
CURLMcode mc = curl_multi_perform(multi_handle, &still_running);
|
||||
CURLMcode mc = curl_multi_perform(multi, &still_running);
|
||||
|
||||
if(still_running)
|
||||
/* wait for activity, timeout or "nothing" */
|
||||
mc = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
|
||||
mc = curl_multi_poll(multi, NULL, 0, 1000, NULL);
|
||||
|
||||
if(mc)
|
||||
break;
|
||||
|
|
@ -244,15 +244,15 @@ int main(int argc, char **argv)
|
|||
|
||||
error:
|
||||
|
||||
if(multi_handle) {
|
||||
if(multi) {
|
||||
for(i = 0; i < num_transfers; i++) {
|
||||
curl_multi_remove_handle(multi_handle, trans[i].easy);
|
||||
curl_easy_cleanup(trans[i].easy);
|
||||
curl_multi_remove_handle(multi, trans[i].curl);
|
||||
curl_easy_cleanup(trans[i].curl);
|
||||
|
||||
if(trans[i].out)
|
||||
fclose(trans[i].out);
|
||||
}
|
||||
curl_multi_cleanup(multi_handle);
|
||||
curl_multi_cleanup(multi);
|
||||
}
|
||||
|
||||
free(trans);
|
||||
|
|
|
|||
|
|
@ -66,30 +66,30 @@ static void init_memory(struct Memory *chunk)
|
|||
chunk->size = 0; /* no data at this point */
|
||||
}
|
||||
|
||||
static void setup(CURL *hnd)
|
||||
static void setup(CURL *curl)
|
||||
{
|
||||
/* set the same URL */
|
||||
curl_easy_setopt(hnd, CURLOPT_URL, "https://localhost:8443/index.html");
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "https://localhost:8443/index.html");
|
||||
|
||||
/* HTTP/2 please */
|
||||
curl_easy_setopt(hnd, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
|
||||
curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
|
||||
|
||||
/* we use a self-signed test server, skip verification during debugging */
|
||||
curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYPEER, 0L);
|
||||
curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYHOST, 0L);
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
|
||||
|
||||
/* write data to a struct */
|
||||
curl_easy_setopt(hnd, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
init_memory(&files[0]);
|
||||
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, &files[0]);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &files[0]);
|
||||
|
||||
/* wait for pipe connection to confirm */
|
||||
curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_PIPEWAIT, 1L);
|
||||
}
|
||||
|
||||
/* called when there is an incoming push */
|
||||
static int server_push_callback(CURL *parent,
|
||||
CURL *easy,
|
||||
CURL *curl,
|
||||
size_t num_headers,
|
||||
struct curl_pushheaders *headers,
|
||||
void *userp)
|
||||
|
|
@ -105,7 +105,7 @@ static int server_push_callback(CURL *parent,
|
|||
|
||||
/* write to this buffer */
|
||||
init_memory(&files[pushindex]);
|
||||
curl_easy_setopt(easy, CURLOPT_WRITEDATA, &files[pushindex]);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &files[pushindex]);
|
||||
pushindex++;
|
||||
|
||||
headp = curl_pushheader_byname(headers, ":path");
|
||||
|
|
@ -122,7 +122,7 @@ static int server_push_callback(CURL *parent,
|
|||
*/
|
||||
int main(void)
|
||||
{
|
||||
CURL *easy;
|
||||
CURL *curl;
|
||||
CURLM *multi;
|
||||
int transfers = 1; /* we start with one */
|
||||
int i;
|
||||
|
|
@ -134,13 +134,13 @@ int main(void)
|
|||
/* init a multi stack */
|
||||
multi = curl_multi_init();
|
||||
|
||||
easy = curl_easy_init();
|
||||
curl = curl_easy_init();
|
||||
|
||||
/* set options */
|
||||
setup(easy);
|
||||
setup(curl);
|
||||
|
||||
/* add the easy transfer */
|
||||
curl_multi_add_handle(multi, easy);
|
||||
curl_multi_add_handle(multi, curl);
|
||||
|
||||
curl_multi_setopt(multi, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
|
||||
curl_multi_setopt(multi, CURLMOPT_PUSHFUNCTION, server_push_callback);
|
||||
|
|
@ -167,10 +167,10 @@ int main(void)
|
|||
int msgq = 0;
|
||||
m = curl_multi_info_read(multi, &msgq);
|
||||
if(m && (m->msg == CURLMSG_DONE)) {
|
||||
CURL *e = m->easy_handle;
|
||||
curl = m->easy_handle;
|
||||
transfers--;
|
||||
curl_multi_remove_handle(multi, e);
|
||||
curl_easy_cleanup(e);
|
||||
curl_multi_remove_handle(multi, curl);
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
} while(m);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -89,11 +89,11 @@ static void dump(const char *text, unsigned char *ptr, size_t size, char nohex)
|
|||
}
|
||||
}
|
||||
|
||||
static int my_trace(CURL *handle, curl_infotype type,
|
||||
static int my_trace(CURL *curl, curl_infotype type,
|
||||
char *data, size_t size, void *userp)
|
||||
{
|
||||
const char *text;
|
||||
(void)handle;
|
||||
(void)curl;
|
||||
(void)userp;
|
||||
switch(type) {
|
||||
case CURLINFO_TEXT:
|
||||
|
|
@ -127,32 +127,32 @@ static int my_trace(CURL *handle, curl_infotype type,
|
|||
|
||||
#define OUTPUTFILE "dl"
|
||||
|
||||
static int setup(CURL *hnd, const char *url)
|
||||
static int setup(CURL *curl, const char *url)
|
||||
{
|
||||
out_download = fopen(OUTPUTFILE, "wb");
|
||||
if(!out_download)
|
||||
return 1; /* failed */
|
||||
|
||||
/* set the same URL */
|
||||
curl_easy_setopt(hnd, CURLOPT_URL, url);
|
||||
curl_easy_setopt(curl, CURLOPT_URL, url);
|
||||
|
||||
/* HTTP/2 please */
|
||||
curl_easy_setopt(hnd, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
|
||||
curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
|
||||
|
||||
/* we use a self-signed test server, skip verification during debugging */
|
||||
curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYPEER, 0L);
|
||||
curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYHOST, 0L);
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
|
||||
|
||||
/* write to this file */
|
||||
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, out_download);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, out_download);
|
||||
|
||||
/* please be verbose */
|
||||
curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
|
||||
curl_easy_setopt(hnd, CURLOPT_DEBUGFUNCTION, my_trace);
|
||||
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace);
|
||||
|
||||
#if CURLPIPE_MULTIPLEX > 0
|
||||
/* wait for pipe connection to confirm */
|
||||
curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_PIPEWAIT, 1L);
|
||||
#endif
|
||||
return 0; /* all is good */
|
||||
}
|
||||
|
|
@ -161,7 +161,7 @@ static FILE *out_push;
|
|||
|
||||
/* called when there is an incoming push */
|
||||
static int server_push_callback(CURL *parent,
|
||||
CURL *easy,
|
||||
CURL *curl,
|
||||
size_t num_headers,
|
||||
struct curl_pushheaders *headers,
|
||||
void *userp)
|
||||
|
|
@ -185,7 +185,7 @@ static int server_push_callback(CURL *parent,
|
|||
}
|
||||
|
||||
/* write to this file */
|
||||
curl_easy_setopt(easy, CURLOPT_WRITEDATA, out_push);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, out_push);
|
||||
|
||||
fprintf(stderr, "**** push callback approves stream %u, got %lu headers!\n",
|
||||
count, (unsigned long)num_headers);
|
||||
|
|
@ -211,8 +211,8 @@ static int server_push_callback(CURL *parent,
|
|||
int main(int argc, char *argv[])
|
||||
{
|
||||
CURLcode res;
|
||||
CURL *easy;
|
||||
CURLM *multi_handle;
|
||||
CURL *curl;
|
||||
CURLM *multi;
|
||||
int transfers = 1; /* we start with one */
|
||||
const char *url = "https://localhost:8443/index.html";
|
||||
|
||||
|
|
@ -224,33 +224,33 @@ int main(int argc, char *argv[])
|
|||
return (int)res;
|
||||
|
||||
/* init a multi stack */
|
||||
multi_handle = curl_multi_init();
|
||||
if(!multi_handle)
|
||||
multi = curl_multi_init();
|
||||
if(!multi)
|
||||
goto error;
|
||||
|
||||
easy = curl_easy_init();
|
||||
curl = curl_easy_init();
|
||||
|
||||
/* set options */
|
||||
if(!easy || setup(easy, url)) {
|
||||
if(!curl || setup(curl, url)) {
|
||||
fprintf(stderr, "failed\n");
|
||||
goto error;
|
||||
}
|
||||
|
||||
curl_multi_setopt(multi_handle, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
|
||||
curl_multi_setopt(multi_handle, CURLMOPT_PUSHFUNCTION, server_push_callback);
|
||||
curl_multi_setopt(multi_handle, CURLMOPT_PUSHDATA, &transfers);
|
||||
curl_multi_setopt(multi, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
|
||||
curl_multi_setopt(multi, CURLMOPT_PUSHFUNCTION, server_push_callback);
|
||||
curl_multi_setopt(multi, CURLMOPT_PUSHDATA, &transfers);
|
||||
|
||||
/* add the easy transfer */
|
||||
curl_multi_add_handle(multi_handle, easy);
|
||||
curl_multi_add_handle(multi, curl);
|
||||
|
||||
do {
|
||||
struct CURLMsg *m;
|
||||
int still_running; /* keep number of running handles */
|
||||
CURLMcode mc = curl_multi_perform(multi_handle, &still_running);
|
||||
CURLMcode mc = curl_multi_perform(multi, &still_running);
|
||||
|
||||
if(still_running)
|
||||
/* wait for activity, timeout or "nothing" */
|
||||
mc = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
|
||||
mc = curl_multi_poll(multi, NULL, 0, 1000, NULL);
|
||||
|
||||
if(mc)
|
||||
break;
|
||||
|
|
@ -262,12 +262,12 @@ int main(int argc, char *argv[])
|
|||
*/
|
||||
do {
|
||||
int msgq = 0;
|
||||
m = curl_multi_info_read(multi_handle, &msgq);
|
||||
m = curl_multi_info_read(multi, &msgq);
|
||||
if(m && (m->msg == CURLMSG_DONE)) {
|
||||
CURL *e = m->easy_handle;
|
||||
curl = m->easy_handle;
|
||||
transfers--;
|
||||
curl_multi_remove_handle(multi_handle, e);
|
||||
curl_easy_cleanup(e);
|
||||
curl_multi_remove_handle(multi, curl);
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
} while(m);
|
||||
|
||||
|
|
@ -275,8 +275,8 @@ int main(int argc, char *argv[])
|
|||
|
||||
error:
|
||||
|
||||
if(multi_handle)
|
||||
curl_multi_cleanup(multi_handle);
|
||||
if(multi)
|
||||
curl_multi_cleanup(multi);
|
||||
|
||||
curl_global_cleanup();
|
||||
|
||||
|
|
|
|||
|
|
@ -88,7 +88,7 @@ struct input {
|
|||
FILE *in;
|
||||
FILE *out;
|
||||
size_t bytes_read; /* count up */
|
||||
CURL *easy;
|
||||
CURL *curl;
|
||||
int num;
|
||||
};
|
||||
|
||||
|
|
@ -139,7 +139,7 @@ static void dump(const char *text, int num, unsigned char *ptr,
|
|||
}
|
||||
}
|
||||
|
||||
static int my_trace(CURL *handle, curl_infotype type,
|
||||
static int my_trace(CURL *curl, curl_infotype type,
|
||||
char *data, size_t size, void *userp)
|
||||
{
|
||||
char timebuf[60];
|
||||
|
|
@ -151,7 +151,7 @@ static int my_trace(CURL *handle, curl_infotype type,
|
|||
struct timeval tv;
|
||||
time_t secs;
|
||||
struct tm *now;
|
||||
(void)handle;
|
||||
(void)curl;
|
||||
|
||||
gettimeofday(&tv, NULL);
|
||||
if(!known_offset) {
|
||||
|
|
@ -193,7 +193,7 @@ static int my_trace(CURL *handle, curl_infotype type,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static size_t read_callback(char *ptr, size_t size, size_t nmemb, void *userp)
|
||||
static size_t read_cb(char *ptr, size_t size, size_t nmemb, void *userp)
|
||||
{
|
||||
struct input *i = userp;
|
||||
size_t retcode = fread(ptr, size, nmemb, i->in);
|
||||
|
|
@ -207,9 +207,9 @@ static int setup(struct input *t, int num, const char *upload)
|
|||
char filename[128];
|
||||
struct stat file_info;
|
||||
curl_off_t uploadsize;
|
||||
CURL *easy;
|
||||
CURL *curl;
|
||||
|
||||
easy = t->easy = NULL;
|
||||
curl = t->curl = NULL;
|
||||
|
||||
t->num = num;
|
||||
snprintf(filename, sizeof(filename), "dl-%d", num);
|
||||
|
|
@ -246,40 +246,40 @@ static int setup(struct input *t, int num, const char *upload)
|
|||
|
||||
uploadsize = file_info.st_size;
|
||||
|
||||
easy = t->easy = curl_easy_init();
|
||||
if(easy) {
|
||||
curl = t->curl = curl_easy_init();
|
||||
if(curl) {
|
||||
|
||||
/* write to this file */
|
||||
curl_easy_setopt(easy, CURLOPT_WRITEDATA, t->out);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, t->out);
|
||||
|
||||
/* we want to use our own read function */
|
||||
curl_easy_setopt(easy, CURLOPT_READFUNCTION, read_callback);
|
||||
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_cb);
|
||||
/* read from this file */
|
||||
curl_easy_setopt(easy, CURLOPT_READDATA, t);
|
||||
curl_easy_setopt(curl, CURLOPT_READDATA, t);
|
||||
/* provide the size of the upload */
|
||||
curl_easy_setopt(easy, CURLOPT_INFILESIZE_LARGE, uploadsize);
|
||||
curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, uploadsize);
|
||||
|
||||
/* send in the URL to store the upload as */
|
||||
curl_easy_setopt(easy, CURLOPT_URL, url);
|
||||
curl_easy_setopt(curl, CURLOPT_URL, url);
|
||||
|
||||
/* upload please */
|
||||
curl_easy_setopt(easy, CURLOPT_UPLOAD, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
|
||||
|
||||
/* please be verbose */
|
||||
curl_easy_setopt(easy, CURLOPT_VERBOSE, 1L);
|
||||
curl_easy_setopt(easy, CURLOPT_DEBUGFUNCTION, my_trace);
|
||||
curl_easy_setopt(easy, CURLOPT_DEBUGDATA, t);
|
||||
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace);
|
||||
curl_easy_setopt(curl, CURLOPT_DEBUGDATA, t);
|
||||
|
||||
/* HTTP/2 please */
|
||||
curl_easy_setopt(easy, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
|
||||
curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
|
||||
|
||||
/* we use a self-signed test server, skip verification during debugging */
|
||||
curl_easy_setopt(easy, CURLOPT_SSL_VERIFYPEER, 0L);
|
||||
curl_easy_setopt(easy, CURLOPT_SSL_VERIFYHOST, 0L);
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
|
||||
|
||||
#if (CURLPIPE_MULTIPLEX > 0)
|
||||
/* wait for pipe connection to confirm */
|
||||
curl_easy_setopt(easy, CURLOPT_PIPEWAIT, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_PIPEWAIT, 1L);
|
||||
#endif
|
||||
}
|
||||
return 0;
|
||||
|
|
@ -292,7 +292,7 @@ int main(int argc, char **argv)
|
|||
{
|
||||
CURLcode res;
|
||||
struct input *trans;
|
||||
CURLM *multi_handle = NULL;
|
||||
CURLM *multi = NULL;
|
||||
int i;
|
||||
const char *filename = "index.html";
|
||||
int still_running = 0; /* keep number of running handles */
|
||||
|
|
@ -322,8 +322,8 @@ int main(int argc, char **argv)
|
|||
}
|
||||
|
||||
/* init a multi stack */
|
||||
multi_handle = curl_multi_init();
|
||||
if(!multi_handle)
|
||||
multi = curl_multi_init();
|
||||
if(!multi)
|
||||
goto error;
|
||||
|
||||
for(i = 0; i < num_transfers; i++) {
|
||||
|
|
@ -332,20 +332,20 @@ int main(int argc, char **argv)
|
|||
}
|
||||
|
||||
/* add the individual transfer */
|
||||
curl_multi_add_handle(multi_handle, trans[i].easy);
|
||||
curl_multi_add_handle(multi, trans[i].curl);
|
||||
}
|
||||
|
||||
curl_multi_setopt(multi_handle, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
|
||||
curl_multi_setopt(multi, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
|
||||
|
||||
/* We do HTTP/2 so let's stick to one connection per host */
|
||||
curl_multi_setopt(multi_handle, CURLMOPT_MAX_HOST_CONNECTIONS, 1L);
|
||||
curl_multi_setopt(multi, CURLMOPT_MAX_HOST_CONNECTIONS, 1L);
|
||||
|
||||
do {
|
||||
CURLMcode mc = curl_multi_perform(multi_handle, &still_running);
|
||||
CURLMcode mc = curl_multi_perform(multi, &still_running);
|
||||
|
||||
if(still_running)
|
||||
/* wait for activity, timeout or "nothing" */
|
||||
mc = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
|
||||
mc = curl_multi_poll(multi, NULL, 0, 1000, NULL);
|
||||
|
||||
if(mc)
|
||||
break;
|
||||
|
|
@ -354,17 +354,17 @@ int main(int argc, char **argv)
|
|||
|
||||
error:
|
||||
|
||||
if(multi_handle) {
|
||||
if(multi) {
|
||||
for(i = 0; i < num_transfers; i++) {
|
||||
curl_multi_remove_handle(multi_handle, trans[i].easy);
|
||||
curl_easy_cleanup(trans[i].easy);
|
||||
curl_multi_remove_handle(multi, trans[i].curl);
|
||||
curl_easy_cleanup(trans[i].curl);
|
||||
|
||||
if(trans[i].in)
|
||||
fclose(trans[i].in);
|
||||
if(trans[i].out)
|
||||
fclose(trans[i].out);
|
||||
}
|
||||
curl_multi_cleanup(multi_handle);
|
||||
curl_multi_cleanup(multi);
|
||||
}
|
||||
|
||||
free(trans);
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@
|
|||
* http://www.apacheweek.com/features/put
|
||||
*/
|
||||
|
||||
static size_t read_callback(char *ptr, size_t size, size_t nmemb, void *stream)
|
||||
static size_t read_cb(char *ptr, size_t size, size_t nmemb, void *stream)
|
||||
{
|
||||
size_t retcode;
|
||||
unsigned long nread;
|
||||
|
|
@ -111,7 +111,7 @@ int main(int argc, char **argv)
|
|||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
/* we want to use our own read function */
|
||||
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
|
||||
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_cb);
|
||||
|
||||
/* enable uploading (implies PUT over HTTP) */
|
||||
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ struct upload_status {
|
|||
size_t bytes_read;
|
||||
};
|
||||
|
||||
static size_t payload_source(char *ptr, size_t size, size_t nmemb, void *userp)
|
||||
static size_t read_cb(char *ptr, size_t size, size_t nmemb, void *userp)
|
||||
{
|
||||
struct upload_status *upload_ctx = (struct upload_status *)userp;
|
||||
const char *data;
|
||||
|
|
@ -108,7 +108,7 @@ int main(void)
|
|||
/* In this case, we are using a callback function to specify the data. You
|
||||
* could just use the CURLOPT_READDATA option to specify a FILE pointer to
|
||||
* read from. */
|
||||
curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source);
|
||||
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_cb);
|
||||
curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx);
|
||||
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
|
||||
|
||||
|
|
|
|||
|
|
@ -46,10 +46,10 @@ int main(void)
|
|||
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
CURLM *mcurl;
|
||||
CURLM *multi;
|
||||
|
||||
mcurl = curl_multi_init();
|
||||
if(mcurl) {
|
||||
multi = curl_multi_init();
|
||||
if(multi) {
|
||||
int still_running = 1;
|
||||
|
||||
/* Set username and password */
|
||||
|
|
@ -61,22 +61,22 @@ int main(void)
|
|||
"INBOX/;UID=1");
|
||||
|
||||
/* Tell the multi stack about our easy handle */
|
||||
curl_multi_add_handle(mcurl, curl);
|
||||
curl_multi_add_handle(multi, curl);
|
||||
|
||||
do {
|
||||
CURLMcode mc = curl_multi_perform(mcurl, &still_running);
|
||||
CURLMcode mc = curl_multi_perform(multi, &still_running);
|
||||
|
||||
if(still_running)
|
||||
/* wait for activity, timeout or "nothing" */
|
||||
mc = curl_multi_poll(mcurl, NULL, 0, 1000, NULL);
|
||||
mc = curl_multi_poll(multi, NULL, 0, 1000, NULL);
|
||||
|
||||
if(mc)
|
||||
break;
|
||||
} while(still_running);
|
||||
|
||||
/* Always cleanup */
|
||||
curl_multi_remove_handle(mcurl, curl);
|
||||
curl_multi_cleanup(mcurl);
|
||||
curl_multi_remove_handle(multi, curl);
|
||||
curl_multi_cleanup(multi);
|
||||
}
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -172,14 +172,14 @@ static int mem_addf(struct mem *mem, const char *format, ...)
|
|||
return -1;
|
||||
}
|
||||
|
||||
static int mydebug(CURL *handle, curl_infotype type,
|
||||
static int mydebug(CURL *curl, curl_infotype type,
|
||||
char *data, size_t size, void *userdata)
|
||||
{
|
||||
struct transfer *t = (struct transfer *)userdata;
|
||||
static const char s_infotype[CURLINFO_END][3] = {
|
||||
"* ", "< ", "> ", "{ ", "} ", "{ ", "} " };
|
||||
|
||||
(void)handle;
|
||||
(void)curl;
|
||||
|
||||
switch(type) {
|
||||
case CURLINFO_TEXT:
|
||||
|
|
@ -198,7 +198,7 @@ static int mydebug(CURL *handle, curl_infotype type,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static size_t mywrite(char *ptr, size_t size, size_t nmemb, void *userdata)
|
||||
static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *userdata)
|
||||
{
|
||||
struct transfer *t = (struct transfer *)userdata;
|
||||
|
||||
|
|
@ -258,7 +258,7 @@ int main(void)
|
|||
curl_easy_setopt(t->curl, CURLOPT_DEBUGDATA, t);
|
||||
|
||||
/* Enable writing the body to a file */
|
||||
curl_easy_setopt(t->curl, CURLOPT_WRITEFUNCTION, mywrite);
|
||||
curl_easy_setopt(t->curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
curl_easy_setopt(t->curl, CURLOPT_WRITEDATA, t);
|
||||
|
||||
/* Enable immediate error on HTTP status codes >= 400 in most cases,
|
||||
|
|
|
|||
|
|
@ -43,8 +43,8 @@
|
|||
|
||||
int main(void)
|
||||
{
|
||||
CURL *handles[HANDLECOUNT];
|
||||
CURLM *multi_handle;
|
||||
CURL *curl[HANDLECOUNT];
|
||||
CURLM *multi;
|
||||
|
||||
int i;
|
||||
|
||||
|
|
@ -54,17 +54,17 @@ int main(void)
|
|||
|
||||
/* Allocate one curl handle per transfer */
|
||||
for(i = 0; i < HANDLECOUNT; i++)
|
||||
handles[i] = curl_easy_init();
|
||||
curl[i] = curl_easy_init();
|
||||
|
||||
/* set the options (I left out a few, you get the point anyway) */
|
||||
curl_easy_setopt(handles[HTTP_HANDLE], CURLOPT_URL, "https://example.com");
|
||||
curl_easy_setopt(curl[HTTP_HANDLE], CURLOPT_URL, "https://example.com");
|
||||
|
||||
curl_easy_setopt(handles[FTP_HANDLE], CURLOPT_URL, "ftp://example.com");
|
||||
curl_easy_setopt(handles[FTP_HANDLE], CURLOPT_UPLOAD, 1L);
|
||||
curl_easy_setopt(curl[FTP_HANDLE], CURLOPT_URL, "ftp://example.com");
|
||||
curl_easy_setopt(curl[FTP_HANDLE], CURLOPT_UPLOAD, 1L);
|
||||
|
||||
/* init a multi stack */
|
||||
multi_handle = curl_multi_init();
|
||||
if(multi_handle) {
|
||||
multi = curl_multi_init();
|
||||
if(multi) {
|
||||
|
||||
int still_running = 1; /* keep number of running handles */
|
||||
|
||||
|
|
@ -73,14 +73,14 @@ int main(void)
|
|||
|
||||
/* add the individual transfers */
|
||||
for(i = 0; i < HANDLECOUNT; i++)
|
||||
curl_multi_add_handle(multi_handle, handles[i]);
|
||||
curl_multi_add_handle(multi, curl[i]);
|
||||
|
||||
while(still_running) {
|
||||
CURLMcode mc = curl_multi_perform(multi_handle, &still_running);
|
||||
CURLMcode mc = curl_multi_perform(multi, &still_running);
|
||||
|
||||
if(still_running)
|
||||
/* wait for activity, timeout or "nothing" */
|
||||
mc = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
|
||||
mc = curl_multi_poll(multi, NULL, 0, 1000, NULL);
|
||||
|
||||
if(mc)
|
||||
break;
|
||||
|
|
@ -88,13 +88,13 @@ int main(void)
|
|||
|
||||
/* See how the transfers went */
|
||||
/* !checksrc! disable EQUALSNULL 1 */
|
||||
while((msg = curl_multi_info_read(multi_handle, &msgs_left)) != NULL) {
|
||||
while((msg = curl_multi_info_read(multi, &msgs_left)) != NULL) {
|
||||
if(msg->msg == CURLMSG_DONE) {
|
||||
int idx;
|
||||
|
||||
/* Find out which handle this message is about */
|
||||
for(idx = 0; idx < HANDLECOUNT; idx++) {
|
||||
int found = (msg->easy_handle == handles[idx]);
|
||||
int found = (msg->easy_handle == curl[idx]);
|
||||
if(found)
|
||||
break;
|
||||
}
|
||||
|
|
@ -112,14 +112,14 @@ int main(void)
|
|||
|
||||
/* remove the transfers */
|
||||
for(i = 0; i < HANDLECOUNT; i++)
|
||||
curl_multi_remove_handle(multi_handle, handles[i]);
|
||||
curl_multi_remove_handle(multi, curl[i]);
|
||||
|
||||
curl_multi_cleanup(multi_handle);
|
||||
curl_multi_cleanup(multi);
|
||||
}
|
||||
|
||||
/* Free the curl handles */
|
||||
for(i = 0; i < HANDLECOUNT; i++)
|
||||
curl_easy_cleanup(handles[i]);
|
||||
curl_easy_cleanup(curl[i]);
|
||||
|
||||
curl_global_cleanup();
|
||||
|
||||
|
|
|
|||
|
|
@ -83,14 +83,14 @@ static void dump(const char *text, FILE *stream, unsigned char *ptr,
|
|||
fflush(stream);
|
||||
}
|
||||
|
||||
static int my_trace(CURL *handle, curl_infotype type,
|
||||
static int my_trace(CURL *curl, curl_infotype type,
|
||||
unsigned char *data, size_t size,
|
||||
void *userp)
|
||||
{
|
||||
const char *text;
|
||||
|
||||
(void)userp;
|
||||
(void)handle;
|
||||
(void)curl;
|
||||
|
||||
switch(type) {
|
||||
case CURLINFO_TEXT:
|
||||
|
|
@ -121,48 +121,48 @@ static int my_trace(CURL *handle, curl_infotype type,
|
|||
*/
|
||||
int main(void)
|
||||
{
|
||||
CURL *http_handle;
|
||||
CURL *curl;
|
||||
|
||||
CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
|
||||
if(res)
|
||||
return (int)res;
|
||||
|
||||
http_handle = curl_easy_init();
|
||||
if(http_handle) {
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
|
||||
CURLM *multi_handle;
|
||||
CURLM *multi;
|
||||
|
||||
/* set the options (I left out a few, you get the point anyway) */
|
||||
curl_easy_setopt(http_handle, CURLOPT_URL, "https://www.example.com/");
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com/");
|
||||
|
||||
curl_easy_setopt(http_handle, CURLOPT_DEBUGFUNCTION, my_trace);
|
||||
curl_easy_setopt(http_handle, CURLOPT_VERBOSE, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace);
|
||||
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||
|
||||
/* init a multi stack */
|
||||
multi_handle = curl_multi_init();
|
||||
if(multi_handle) {
|
||||
multi = curl_multi_init();
|
||||
if(multi) {
|
||||
|
||||
int still_running = 0; /* keep number of running handles */
|
||||
|
||||
/* add the individual transfers */
|
||||
curl_multi_add_handle(multi_handle, http_handle);
|
||||
curl_multi_add_handle(multi, curl);
|
||||
|
||||
do {
|
||||
CURLMcode mc = curl_multi_perform(multi_handle, &still_running);
|
||||
CURLMcode mc = curl_multi_perform(multi, &still_running);
|
||||
|
||||
if(still_running)
|
||||
/* wait for activity, timeout or "nothing" */
|
||||
mc = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
|
||||
mc = curl_multi_poll(multi, NULL, 0, 1000, NULL);
|
||||
|
||||
if(mc)
|
||||
break;
|
||||
|
||||
} while(still_running);
|
||||
|
||||
curl_multi_cleanup(multi_handle);
|
||||
curl_multi_cleanup(multi);
|
||||
}
|
||||
|
||||
curl_easy_cleanup(http_handle);
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
|
||||
curl_global_cleanup();
|
||||
|
|
|
|||
|
|
@ -36,52 +36,51 @@
|
|||
*/
|
||||
int main(void)
|
||||
{
|
||||
CURL *http_handle;
|
||||
CURL *http_handle2;
|
||||
CURL *curl;
|
||||
CURL *curl2;
|
||||
|
||||
CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
|
||||
if(res)
|
||||
return (int)res;
|
||||
|
||||
http_handle = curl_easy_init();
|
||||
http_handle2 = curl_easy_init();
|
||||
curl = curl_easy_init();
|
||||
curl2 = curl_easy_init();
|
||||
|
||||
if(http_handle &&
|
||||
http_handle2) {
|
||||
if(curl && curl2) {
|
||||
|
||||
CURLM *multi_handle;
|
||||
CURLM *multi;
|
||||
|
||||
/* set options */
|
||||
curl_easy_setopt(http_handle, CURLOPT_URL, "https://www.example.com/");
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com/");
|
||||
|
||||
/* set options */
|
||||
curl_easy_setopt(http_handle2, CURLOPT_URL, "http://localhost/");
|
||||
curl_easy_setopt(curl2, CURLOPT_URL, "http://localhost/");
|
||||
|
||||
/* init a multi stack */
|
||||
multi_handle = curl_multi_init();
|
||||
if(multi_handle) {
|
||||
multi = curl_multi_init();
|
||||
if(multi) {
|
||||
|
||||
int still_running = 1; /* keep number of running handles */
|
||||
|
||||
/* add the individual transfers */
|
||||
curl_multi_add_handle(multi_handle, http_handle);
|
||||
curl_multi_add_handle(multi_handle, http_handle2);
|
||||
curl_multi_add_handle(multi, curl);
|
||||
curl_multi_add_handle(multi, curl2);
|
||||
|
||||
while(still_running) {
|
||||
CURLMsg *msg;
|
||||
int queued;
|
||||
|
||||
CURLMcode mc = curl_multi_perform(multi_handle, &still_running);
|
||||
CURLMcode mc = curl_multi_perform(multi, &still_running);
|
||||
|
||||
if(still_running)
|
||||
/* wait for activity, timeout or "nothing" */
|
||||
mc = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
|
||||
mc = curl_multi_poll(multi, NULL, 0, 1000, NULL);
|
||||
|
||||
if(mc)
|
||||
break;
|
||||
|
||||
do {
|
||||
msg = curl_multi_info_read(multi_handle, &queued);
|
||||
msg = curl_multi_info_read(multi, &queued);
|
||||
if(msg) {
|
||||
if(msg->msg == CURLMSG_DONE) {
|
||||
/* a transfer ended */
|
||||
|
|
@ -91,15 +90,15 @@ int main(void)
|
|||
} while(msg);
|
||||
}
|
||||
|
||||
curl_multi_remove_handle(multi_handle, http_handle);
|
||||
curl_multi_remove_handle(multi_handle, http_handle2);
|
||||
curl_multi_remove_handle(multi, curl);
|
||||
curl_multi_remove_handle(multi, curl2);
|
||||
|
||||
curl_multi_cleanup(multi_handle);
|
||||
curl_multi_cleanup(multi);
|
||||
}
|
||||
}
|
||||
|
||||
curl_easy_cleanup(http_handle);
|
||||
curl_easy_cleanup(http_handle2);
|
||||
curl_easy_cleanup(curl);
|
||||
curl_easy_cleanup(curl2);
|
||||
|
||||
curl_global_cleanup();
|
||||
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
#include <curl/curl.h>
|
||||
|
||||
static struct event_base *base;
|
||||
static CURLM *curl_handle;
|
||||
static CURLM *multi;
|
||||
static struct event *timeout;
|
||||
|
||||
struct curl_context {
|
||||
|
|
@ -67,7 +67,7 @@ static void add_download(const char *url, int num)
|
|||
{
|
||||
char filename[50];
|
||||
FILE *file;
|
||||
CURL *handle;
|
||||
CURL *curl;
|
||||
|
||||
snprintf(filename, sizeof(filename), "%d.download", num);
|
||||
|
||||
|
|
@ -77,11 +77,11 @@ static void add_download(const char *url, int num)
|
|||
return;
|
||||
}
|
||||
|
||||
handle = curl_easy_init();
|
||||
curl_easy_setopt(handle, CURLOPT_WRITEDATA, file);
|
||||
curl_easy_setopt(handle, CURLOPT_PRIVATE, file);
|
||||
curl_easy_setopt(handle, CURLOPT_URL, url);
|
||||
curl_multi_add_handle(curl_handle, handle);
|
||||
curl = curl_easy_init();
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, file);
|
||||
curl_easy_setopt(curl, CURLOPT_PRIVATE, file);
|
||||
curl_easy_setopt(curl, CURLOPT_URL, url);
|
||||
curl_multi_add_handle(multi, curl);
|
||||
fprintf(stderr, "Added download %s -> %s\n", url, filename);
|
||||
}
|
||||
|
||||
|
|
@ -90,10 +90,10 @@ static void check_multi_info(void)
|
|||
char *done_url;
|
||||
CURLMsg *message;
|
||||
int pending;
|
||||
CURL *easy_handle;
|
||||
CURL *curl;
|
||||
FILE *file;
|
||||
|
||||
while((message = curl_multi_info_read(curl_handle, &pending))) {
|
||||
while((message = curl_multi_info_read(multi, &pending))) {
|
||||
switch(message->msg) {
|
||||
case CURLMSG_DONE:
|
||||
/* Do not use message data after calling curl_multi_remove_handle() and
|
||||
|
|
@ -101,14 +101,14 @@ static void check_multi_info(void)
|
|||
"WARNING: The data the returned pointer points to does not survive
|
||||
calling curl_multi_cleanup, curl_multi_remove_handle or
|
||||
curl_easy_cleanup." */
|
||||
easy_handle = message->easy_handle;
|
||||
curl = message->easy_handle;
|
||||
|
||||
curl_easy_getinfo(easy_handle, CURLINFO_EFFECTIVE_URL, &done_url);
|
||||
curl_easy_getinfo(easy_handle, CURLINFO_PRIVATE, &file);
|
||||
curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &done_url);
|
||||
curl_easy_getinfo(curl, CURLINFO_PRIVATE, &file);
|
||||
printf("%s DONE\n", done_url);
|
||||
|
||||
curl_multi_remove_handle(curl_handle, easy_handle);
|
||||
curl_easy_cleanup(easy_handle);
|
||||
curl_multi_remove_handle(multi, curl);
|
||||
curl_easy_cleanup(curl);
|
||||
if(file) {
|
||||
fclose(file);
|
||||
}
|
||||
|
|
@ -136,7 +136,7 @@ static void curl_perform(int fd, short event, void *arg)
|
|||
|
||||
context = (struct curl_context *) arg;
|
||||
|
||||
curl_multi_socket_action(curl_handle, context->sockfd, flags,
|
||||
curl_multi_socket_action(multi, context->sockfd, flags,
|
||||
&running_handles);
|
||||
|
||||
check_multi_info();
|
||||
|
|
@ -148,7 +148,7 @@ static void on_timeout(evutil_socket_t fd, short events, void *arg)
|
|||
(void)fd;
|
||||
(void)events;
|
||||
(void)arg;
|
||||
curl_multi_socket_action(curl_handle, CURL_SOCKET_TIMEOUT, 0,
|
||||
curl_multi_socket_action(multi, CURL_SOCKET_TIMEOUT, 0,
|
||||
&running_handles);
|
||||
check_multi_info();
|
||||
}
|
||||
|
|
@ -172,13 +172,13 @@ static int start_timeout(CURLM *multi, long timeout_ms, void *userp)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int handle_socket(CURL *easy, curl_socket_t s, int action, void *userp,
|
||||
static int handle_socket(CURL *curl, curl_socket_t s, int action, void *userp,
|
||||
void *socketp)
|
||||
{
|
||||
struct curl_context *curl_context;
|
||||
int events = 0;
|
||||
|
||||
(void)easy;
|
||||
(void)curl;
|
||||
(void)userp;
|
||||
|
||||
switch(action) {
|
||||
|
|
@ -188,7 +188,7 @@ static int handle_socket(CURL *easy, curl_socket_t s, int action, void *userp,
|
|||
curl_context = socketp ?
|
||||
(struct curl_context *) socketp : create_curl_context(s);
|
||||
|
||||
curl_multi_assign(curl_handle, s, (void *) curl_context);
|
||||
curl_multi_assign(multi, s, (void *) curl_context);
|
||||
|
||||
if(action != CURL_POLL_IN)
|
||||
events |= EV_WRITE;
|
||||
|
|
@ -207,7 +207,7 @@ static int handle_socket(CURL *easy, curl_socket_t s, int action, void *userp,
|
|||
if(socketp) {
|
||||
event_del(((struct curl_context*) socketp)->event);
|
||||
destroy_curl_context((struct curl_context*) socketp);
|
||||
curl_multi_assign(curl_handle, s, NULL);
|
||||
curl_multi_assign(multi, s, NULL);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
|
@ -233,10 +233,10 @@ int main(int argc, char **argv)
|
|||
base = event_base_new();
|
||||
timeout = evtimer_new(base, on_timeout, NULL);
|
||||
|
||||
curl_handle = curl_multi_init();
|
||||
if(curl_handle) {
|
||||
curl_multi_setopt(curl_handle, CURLMOPT_SOCKETFUNCTION, handle_socket);
|
||||
curl_multi_setopt(curl_handle, CURLMOPT_TIMERFUNCTION, start_timeout);
|
||||
multi = curl_multi_init();
|
||||
if(multi) {
|
||||
curl_multi_setopt(multi, CURLMOPT_SOCKETFUNCTION, handle_socket);
|
||||
curl_multi_setopt(multi, CURLMOPT_TIMERFUNCTION, start_timeout);
|
||||
|
||||
while(argc-- > 1) {
|
||||
add_download(argv[argc], argc);
|
||||
|
|
@ -244,7 +244,7 @@ int main(int argc, char **argv)
|
|||
|
||||
event_base_dispatch(base);
|
||||
|
||||
curl_multi_cleanup(curl_handle);
|
||||
curl_multi_cleanup(multi);
|
||||
}
|
||||
event_free(timeout);
|
||||
event_base_free(base);
|
||||
|
|
|
|||
|
|
@ -79,10 +79,10 @@ int main(void)
|
|||
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
CURLM *multi_handle;
|
||||
CURLM *multi;
|
||||
|
||||
multi_handle = curl_multi_init();
|
||||
if(multi_handle) {
|
||||
multi = curl_multi_init();
|
||||
if(multi) {
|
||||
|
||||
int still_running = 0;
|
||||
|
||||
|
|
@ -96,21 +96,21 @@ int main(void)
|
|||
curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
|
||||
)
|
||||
|
||||
curl_multi_add_handle(multi_handle, curl);
|
||||
curl_multi_add_handle(multi, curl);
|
||||
|
||||
do {
|
||||
CURLMcode mc = curl_multi_perform(multi_handle, &still_running);
|
||||
CURLMcode mc = curl_multi_perform(multi, &still_running);
|
||||
|
||||
if(still_running)
|
||||
/* wait for activity, timeout or "nothing" */
|
||||
mc = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
|
||||
mc = curl_multi_poll(multi, NULL, 0, 1000, NULL);
|
||||
|
||||
if(mc)
|
||||
break;
|
||||
|
||||
} while(still_running);
|
||||
|
||||
curl_multi_cleanup(multi_handle);
|
||||
curl_multi_cleanup(multi);
|
||||
}
|
||||
|
||||
/* always cleanup */
|
||||
|
|
|
|||
|
|
@ -49,8 +49,8 @@
|
|||
|
||||
int main(void)
|
||||
{
|
||||
CURL *handles[HANDLECOUNT];
|
||||
CURLM *multi_handle;
|
||||
CURL *curl[HANDLECOUNT];
|
||||
CURLM *multi;
|
||||
|
||||
int i;
|
||||
|
||||
|
|
@ -60,17 +60,17 @@ int main(void)
|
|||
|
||||
/* Allocate one curl handle per transfer */
|
||||
for(i = 0; i < HANDLECOUNT; i++)
|
||||
handles[i] = curl_easy_init();
|
||||
curl[i] = curl_easy_init();
|
||||
|
||||
/* set the options (I left out a few, you get the point anyway) */
|
||||
curl_easy_setopt(handles[HTTP_HANDLE], CURLOPT_URL, "https://example.com");
|
||||
curl_easy_setopt(curl[HTTP_HANDLE], CURLOPT_URL, "https://example.com");
|
||||
|
||||
curl_easy_setopt(handles[FTP_HANDLE], CURLOPT_URL, "ftp://example.com");
|
||||
curl_easy_setopt(handles[FTP_HANDLE], CURLOPT_UPLOAD, 1L);
|
||||
curl_easy_setopt(curl[FTP_HANDLE], CURLOPT_URL, "ftp://example.com");
|
||||
curl_easy_setopt(curl[FTP_HANDLE], CURLOPT_UPLOAD, 1L);
|
||||
|
||||
/* init a multi stack */
|
||||
multi_handle = curl_multi_init();
|
||||
if(multi_handle) {
|
||||
multi = curl_multi_init();
|
||||
if(multi) {
|
||||
|
||||
int still_running = 0; /* keep number of running handles */
|
||||
|
||||
|
|
@ -79,10 +79,10 @@ int main(void)
|
|||
|
||||
/* add the individual transfers */
|
||||
for(i = 0; i < HANDLECOUNT; i++)
|
||||
curl_multi_add_handle(multi_handle, handles[i]);
|
||||
curl_multi_add_handle(multi, curl[i]);
|
||||
|
||||
/* we start some action by calling perform right away */
|
||||
curl_multi_perform(multi_handle, &still_running);
|
||||
curl_multi_perform(multi, &still_running);
|
||||
|
||||
while(still_running) {
|
||||
|
||||
|
|
@ -105,7 +105,7 @@ int main(void)
|
|||
timeout.tv_sec = 1;
|
||||
timeout.tv_usec = 0;
|
||||
|
||||
curl_multi_timeout(multi_handle, &curl_timeo);
|
||||
curl_multi_timeout(multi, &curl_timeo);
|
||||
if(curl_timeo >= 0) {
|
||||
#if defined(MSDOS) || defined(__AMIGA__)
|
||||
timeout.tv_sec = (time_t)(curl_timeo / 1000);
|
||||
|
|
@ -123,7 +123,7 @@ int main(void)
|
|||
}
|
||||
|
||||
/* get file descriptors from the transfers */
|
||||
mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
|
||||
mc = curl_multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd);
|
||||
|
||||
if(mc != CURLM_OK) {
|
||||
fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
|
||||
|
|
@ -159,20 +159,20 @@ int main(void)
|
|||
break;
|
||||
case 0: /* timeout */
|
||||
default: /* action */
|
||||
curl_multi_perform(multi_handle, &still_running);
|
||||
curl_multi_perform(multi, &still_running);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* See how the transfers went */
|
||||
/* !checksrc! disable EQUALSNULL 1 */
|
||||
while((msg = curl_multi_info_read(multi_handle, &msgs_left)) != NULL) {
|
||||
while((msg = curl_multi_info_read(multi, &msgs_left)) != NULL) {
|
||||
if(msg->msg == CURLMSG_DONE) {
|
||||
int idx;
|
||||
|
||||
/* Find out which handle this message is about */
|
||||
for(idx = 0; idx < HANDLECOUNT; idx++) {
|
||||
int found = (msg->easy_handle == handles[idx]);
|
||||
int found = (msg->easy_handle == curl[idx]);
|
||||
if(found)
|
||||
break;
|
||||
}
|
||||
|
|
@ -188,12 +188,12 @@ int main(void)
|
|||
}
|
||||
}
|
||||
|
||||
curl_multi_cleanup(multi_handle);
|
||||
curl_multi_cleanup(multi);
|
||||
}
|
||||
|
||||
/* Free the curl handles */
|
||||
for(i = 0; i < HANDLECOUNT; i++)
|
||||
curl_easy_cleanup(handles[i]);
|
||||
curl_easy_cleanup(curl[i]);
|
||||
|
||||
curl_global_cleanup();
|
||||
|
||||
|
|
|
|||
|
|
@ -46,10 +46,10 @@ int main(void)
|
|||
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
CURLM *multi_handle;
|
||||
CURLM *multi;
|
||||
|
||||
multi_handle = curl_multi_init();
|
||||
if(multi_handle) {
|
||||
multi = curl_multi_init();
|
||||
if(multi) {
|
||||
int still_running = 0;
|
||||
|
||||
/* Create the form */
|
||||
|
|
@ -82,20 +82,20 @@ int main(void)
|
|||
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
|
||||
curl_easy_setopt(curl, CURLOPT_MIMEPOST, form);
|
||||
|
||||
curl_multi_add_handle(multi_handle, curl);
|
||||
curl_multi_add_handle(multi, curl);
|
||||
|
||||
do {
|
||||
CURLMcode mc = curl_multi_perform(multi_handle, &still_running);
|
||||
CURLMcode mc = curl_multi_perform(multi, &still_running);
|
||||
|
||||
if(still_running)
|
||||
/* wait for activity, timeout or "nothing" */
|
||||
mc = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
|
||||
mc = curl_multi_poll(multi, NULL, 0, 1000, NULL);
|
||||
|
||||
if(mc)
|
||||
break;
|
||||
} while(still_running);
|
||||
|
||||
curl_multi_cleanup(multi_handle);
|
||||
curl_multi_cleanup(multi);
|
||||
}
|
||||
|
||||
/* always cleanup */
|
||||
|
|
|
|||
|
|
@ -37,34 +37,34 @@
|
|||
*/
|
||||
int main(void)
|
||||
{
|
||||
CURL *http_handle;
|
||||
CURL *curl;
|
||||
|
||||
CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
|
||||
if(res)
|
||||
return (int)res;
|
||||
|
||||
http_handle = curl_easy_init();
|
||||
if(http_handle) {
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
|
||||
CURLM *multi_handle;
|
||||
CURLM *multi;
|
||||
int still_running = 1; /* keep number of running handles */
|
||||
|
||||
/* set the options (I left out a few, you get the point anyway) */
|
||||
curl_easy_setopt(http_handle, CURLOPT_URL, "https://www.example.com/");
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com/");
|
||||
|
||||
/* init a multi stack */
|
||||
multi_handle = curl_multi_init();
|
||||
if(multi_handle) {
|
||||
multi = curl_multi_init();
|
||||
if(multi) {
|
||||
|
||||
/* add the individual transfers */
|
||||
curl_multi_add_handle(multi_handle, http_handle);
|
||||
curl_multi_add_handle(multi, curl);
|
||||
|
||||
do {
|
||||
CURLMcode mc = curl_multi_perform(multi_handle, &still_running);
|
||||
CURLMcode mc = curl_multi_perform(multi, &still_running);
|
||||
|
||||
if(!mc)
|
||||
/* wait for activity, timeout or "nothing" */
|
||||
mc = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
|
||||
mc = curl_multi_poll(multi, NULL, 0, 1000, NULL);
|
||||
|
||||
if(mc) {
|
||||
fprintf(stderr, "curl_multi_poll() failed, code %d.\n", (int)mc);
|
||||
|
|
@ -73,12 +73,12 @@ int main(void)
|
|||
|
||||
} while(still_running);
|
||||
|
||||
curl_multi_remove_handle(multi_handle, http_handle);
|
||||
curl_multi_remove_handle(multi, curl);
|
||||
|
||||
curl_multi_cleanup(multi_handle);
|
||||
curl_multi_cleanup(multi);
|
||||
}
|
||||
|
||||
curl_easy_cleanup(http_handle);
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
|
||||
curl_global_cleanup();
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ static void add_download(const char *url, int num, CURLM *multi)
|
|||
{
|
||||
char filename[50];
|
||||
FILE *file;
|
||||
CURL *handle;
|
||||
CURL *curl;
|
||||
|
||||
snprintf(filename, sizeof(filename), "%d.download", num);
|
||||
|
||||
|
|
@ -95,11 +95,11 @@ static void add_download(const char *url, int num, CURLM *multi)
|
|||
return;
|
||||
}
|
||||
|
||||
handle = curl_easy_init();
|
||||
curl_easy_setopt(handle, CURLOPT_WRITEDATA, file);
|
||||
curl_easy_setopt(handle, CURLOPT_PRIVATE, file);
|
||||
curl_easy_setopt(handle, CURLOPT_URL, url);
|
||||
curl_multi_add_handle(multi, handle);
|
||||
curl = curl_easy_init();
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, file);
|
||||
curl_easy_setopt(curl, CURLOPT_PRIVATE, file);
|
||||
curl_easy_setopt(curl, CURLOPT_URL, url);
|
||||
curl_multi_add_handle(multi, curl);
|
||||
fprintf(stderr, "Added download %s -> %s\n", url, filename);
|
||||
}
|
||||
|
||||
|
|
@ -108,7 +108,7 @@ static void check_multi_info(struct curl_context *context)
|
|||
char *done_url;
|
||||
CURLMsg *message;
|
||||
int pending;
|
||||
CURL *easy_handle;
|
||||
CURL *curl;
|
||||
FILE *file;
|
||||
|
||||
while((message = curl_multi_info_read(context->uv->multi, &pending))) {
|
||||
|
|
@ -119,14 +119,14 @@ static void check_multi_info(struct curl_context *context)
|
|||
"WARNING: The data the returned pointer points to does not survive
|
||||
calling curl_multi_cleanup, curl_multi_remove_handle or
|
||||
curl_easy_cleanup." */
|
||||
easy_handle = message->easy_handle;
|
||||
curl = message->easy_handle;
|
||||
|
||||
curl_easy_getinfo(easy_handle, CURLINFO_EFFECTIVE_URL, &done_url);
|
||||
curl_easy_getinfo(easy_handle, CURLINFO_PRIVATE, &file);
|
||||
curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &done_url);
|
||||
curl_easy_getinfo(curl, CURLINFO_PRIVATE, &file);
|
||||
printf("%s DONE\n", done_url);
|
||||
|
||||
curl_multi_remove_handle(context->uv->multi, easy_handle);
|
||||
curl_easy_cleanup(easy_handle);
|
||||
curl_multi_remove_handle(context->uv->multi, curl);
|
||||
curl_easy_cleanup(curl);
|
||||
if(file) {
|
||||
fclose(file);
|
||||
}
|
||||
|
|
@ -186,13 +186,13 @@ static int cb_timeout(CURLM *multi, long timeout_ms, void *userp)
|
|||
}
|
||||
|
||||
/* callback from libcurl to update socket activity to wait for */
|
||||
static int cb_socket(CURL *easy, curl_socket_t s, int action,
|
||||
static int cb_socket(CURL *curl, curl_socket_t s, int action,
|
||||
void *userp, void *socketp)
|
||||
{
|
||||
struct datauv *uv = (struct datauv *)userp;
|
||||
struct curl_context *curl_context;
|
||||
int events = 0;
|
||||
(void)easy;
|
||||
(void)curl;
|
||||
|
||||
switch(action) {
|
||||
case CURL_POLL_IN:
|
||||
|
|
|
|||
|
|
@ -47,10 +47,10 @@ int main(void)
|
|||
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
CURLM *mcurl;
|
||||
CURLM *multi;
|
||||
|
||||
mcurl = curl_multi_init();
|
||||
if(mcurl) {
|
||||
multi = curl_multi_init();
|
||||
if(multi) {
|
||||
int still_running = 1;
|
||||
|
||||
/* Set username and password */
|
||||
|
|
@ -61,14 +61,14 @@ int main(void)
|
|||
curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com/1");
|
||||
|
||||
/* Tell the multi stack about our easy handle */
|
||||
curl_multi_add_handle(mcurl, curl);
|
||||
curl_multi_add_handle(multi, curl);
|
||||
|
||||
do {
|
||||
CURLMcode mc = curl_multi_perform(mcurl, &still_running);
|
||||
CURLMcode mc = curl_multi_perform(multi, &still_running);
|
||||
|
||||
if(still_running)
|
||||
/* wait for activity, timeout or "nothing" */
|
||||
mc = curl_multi_poll(mcurl, NULL, 0, 1000, NULL);
|
||||
mc = curl_multi_poll(multi, NULL, 0, 1000, NULL);
|
||||
|
||||
if(mc)
|
||||
break;
|
||||
|
|
@ -76,8 +76,8 @@ int main(void)
|
|||
} while(still_running);
|
||||
|
||||
/* Always cleanup */
|
||||
curl_multi_remove_handle(mcurl, curl);
|
||||
curl_multi_cleanup(mcurl);
|
||||
curl_multi_remove_handle(multi, curl);
|
||||
curl_multi_cleanup(multi);
|
||||
}
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ struct WriteThis {
|
|||
size_t sizeleft;
|
||||
};
|
||||
|
||||
static size_t read_callback(char *dest, size_t size, size_t nmemb, void *userp)
|
||||
static size_t read_cb(char *dest, size_t size, size_t nmemb, void *userp)
|
||||
{
|
||||
struct WriteThis *wt = (struct WriteThis *)userp;
|
||||
size_t buffer_size = size*nmemb;
|
||||
|
|
@ -92,7 +92,7 @@ int main(void)
|
|||
curl_easy_setopt(curl, CURLOPT_POST, 1L);
|
||||
|
||||
/* we want to use our own read function */
|
||||
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
|
||||
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_cb);
|
||||
|
||||
/* pointer to pass to our read function */
|
||||
curl_easy_setopt(curl, CURLOPT_READDATA, &wt);
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ struct MemoryStruct {
|
|||
size_t size;
|
||||
};
|
||||
|
||||
static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb,
|
||||
static size_t write_cb(void *contents, size_t size, size_t nmemb,
|
||||
void *userp)
|
||||
{
|
||||
size_t realsize = size * nmemb;
|
||||
|
|
@ -75,7 +75,7 @@ int main(void)
|
|||
curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.org/");
|
||||
|
||||
/* send all data to this function */
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
|
||||
/* we pass our 'chunk' struct to the callback function */
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@
|
|||
|
||||
#include <curl/curl.h>
|
||||
|
||||
static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
{
|
||||
size_t written = fwrite(ptr, size, nmemb, (FILE *)stream);
|
||||
return written;
|
||||
|
|
@ -38,33 +38,33 @@ static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
|
|||
|
||||
int main(void)
|
||||
{
|
||||
CURL *curl_handle;
|
||||
CURL *curl;
|
||||
|
||||
CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
|
||||
if(res)
|
||||
return (int)res;
|
||||
|
||||
/* init the curl session */
|
||||
curl_handle = curl_easy_init();
|
||||
if(curl_handle) {
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
static const char *headerfilename = "head.out";
|
||||
FILE *headerfile;
|
||||
static const char *bodyfilename = "body.out";
|
||||
FILE *bodyfile;
|
||||
|
||||
/* set URL to get */
|
||||
curl_easy_setopt(curl_handle, CURLOPT_URL, "https://example.com");
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
|
||||
|
||||
/* no progress meter please */
|
||||
curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
|
||||
|
||||
/* send all data to this function */
|
||||
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
|
||||
/* open the header file */
|
||||
headerfile = fopen(headerfilename, "wb");
|
||||
if(!headerfile) {
|
||||
curl_easy_cleanup(curl_handle);
|
||||
curl_easy_cleanup(curl);
|
||||
curl_global_cleanup();
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -72,20 +72,20 @@ int main(void)
|
|||
/* open the body file */
|
||||
bodyfile = fopen(bodyfilename, "wb");
|
||||
if(!bodyfile) {
|
||||
curl_easy_cleanup(curl_handle);
|
||||
curl_easy_cleanup(curl);
|
||||
fclose(headerfile);
|
||||
curl_global_cleanup();
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* we want the headers be written to this file handle */
|
||||
curl_easy_setopt(curl_handle, CURLOPT_HEADERDATA, headerfile);
|
||||
curl_easy_setopt(curl, CURLOPT_HEADERDATA, headerfile);
|
||||
|
||||
/* we want the body be written to this file handle instead of stdout */
|
||||
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, bodyfile);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, bodyfile);
|
||||
|
||||
/* get it! */
|
||||
res = curl_easy_perform(curl_handle);
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
/* close the header file */
|
||||
fclose(headerfile);
|
||||
|
|
@ -94,7 +94,7 @@ int main(void)
|
|||
fclose(bodyfile);
|
||||
|
||||
/* cleanup curl stuff */
|
||||
curl_easy_cleanup(curl_handle);
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
|
||||
curl_global_cleanup();
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@
|
|||
|
||||
static CURL *curl;
|
||||
|
||||
static size_t wrfu(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
{
|
||||
const struct curl_tlssessioninfo *info;
|
||||
CURLcode res;
|
||||
|
|
@ -103,7 +103,7 @@ int main(void)
|
|||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com/");
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, wrfu);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
curl_easy_setopt(curl, CURLOPT_VERBOSE, 0L);
|
||||
|
||||
res = curl_easy_perform(curl);
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ struct FtpFile {
|
|||
FILE *stream;
|
||||
};
|
||||
|
||||
static size_t my_fwrite(void *buffer, size_t size, size_t nmemb,
|
||||
static size_t write_cb(void *buffer, size_t size, size_t nmemb,
|
||||
void *stream)
|
||||
{
|
||||
struct FtpFile *out = (struct FtpFile *)stream;
|
||||
|
|
@ -79,7 +79,7 @@ int main(void)
|
|||
curl_easy_setopt(curl, CURLOPT_URL,
|
||||
"sftp://user@server/home/user/file.txt");
|
||||
/* Define our callback to get called when there is data to be written */
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
/* Set a pointer to our struct to pass to the callback */
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile);
|
||||
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
#include <curl/curl.h>
|
||||
|
||||
/* read data to upload */
|
||||
static size_t readfunc(char *ptr, size_t size, size_t nmemb, void *stream)
|
||||
static size_t read_cb(char *ptr, size_t size, size_t nmemb, void *stream)
|
||||
{
|
||||
FILE *f = (FILE *)stream;
|
||||
size_t n;
|
||||
|
|
@ -50,36 +50,36 @@ static size_t readfunc(char *ptr, size_t size, size_t nmemb, void *stream)
|
|||
static curl_off_t sftpGetRemoteFileSize(const char *i_remoteFile)
|
||||
{
|
||||
curl_off_t remoteFileSizeByte = -1;
|
||||
CURL *curlHandlePtr = curl_easy_init();
|
||||
CURL *curl = curl_easy_init();
|
||||
|
||||
if(curlHandlePtr) {
|
||||
if(curl) {
|
||||
CURLcode result;
|
||||
|
||||
curl_easy_setopt(curlHandlePtr, CURLOPT_VERBOSE, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||
|
||||
curl_easy_setopt(curlHandlePtr, CURLOPT_URL, i_remoteFile);
|
||||
curl_easy_setopt(curlHandlePtr, CURLOPT_NOPROGRESS, 1L);
|
||||
curl_easy_setopt(curlHandlePtr, CURLOPT_NOBODY, 1L);
|
||||
curl_easy_setopt(curlHandlePtr, CURLOPT_HEADER, 1L);
|
||||
curl_easy_setopt(curlHandlePtr, CURLOPT_FILETIME, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_URL, i_remoteFile);
|
||||
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_NOBODY, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_HEADER, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_FILETIME, 1L);
|
||||
|
||||
result = curl_easy_perform(curlHandlePtr);
|
||||
result = curl_easy_perform(curl);
|
||||
if(CURLE_OK == result) {
|
||||
result = curl_easy_getinfo(curlHandlePtr,
|
||||
result = curl_easy_getinfo(curl,
|
||||
CURLINFO_CONTENT_LENGTH_DOWNLOAD_T,
|
||||
&remoteFileSizeByte);
|
||||
if(result)
|
||||
return -1;
|
||||
printf("filesize: %" CURL_FORMAT_CURL_OFF_T "\n", remoteFileSizeByte);
|
||||
}
|
||||
curl_easy_cleanup(curlHandlePtr);
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
|
||||
return remoteFileSizeByte;
|
||||
}
|
||||
|
||||
|
||||
static int sftpResumeUpload(CURL *curlhandle, const char *remotepath,
|
||||
static int sftpResumeUpload(CURL *curl, const char *remotepath,
|
||||
const char *localpath)
|
||||
{
|
||||
FILE *f = NULL;
|
||||
|
|
@ -99,18 +99,18 @@ static int sftpResumeUpload(CURL *curlhandle, const char *remotepath,
|
|||
return 0;
|
||||
}
|
||||
|
||||
curl_easy_setopt(curlhandle, CURLOPT_UPLOAD, 1L);
|
||||
curl_easy_setopt(curlhandle, CURLOPT_URL, remotepath);
|
||||
curl_easy_setopt(curlhandle, CURLOPT_READFUNCTION, readfunc);
|
||||
curl_easy_setopt(curlhandle, CURLOPT_READDATA, f);
|
||||
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_URL, remotepath);
|
||||
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_cb);
|
||||
curl_easy_setopt(curl, CURLOPT_READDATA, f);
|
||||
|
||||
#if defined(_WIN32) && !defined(UNDER_CE)
|
||||
_fseeki64(f, remoteFileSizeByte, SEEK_SET);
|
||||
#else
|
||||
fseek(f, (long)remoteFileSizeByte, SEEK_SET);
|
||||
#endif
|
||||
curl_easy_setopt(curlhandle, CURLOPT_APPEND, 1L);
|
||||
result = curl_easy_perform(curlhandle);
|
||||
curl_easy_setopt(curl, CURLOPT_APPEND, 1L);
|
||||
result = curl_easy_perform(curl);
|
||||
|
||||
fclose(f);
|
||||
|
||||
|
|
@ -124,22 +124,22 @@ static int sftpResumeUpload(CURL *curlhandle, const char *remotepath,
|
|||
|
||||
int main(void)
|
||||
{
|
||||
CURL *curlhandle = NULL;
|
||||
CURL *curl = NULL;
|
||||
|
||||
CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
|
||||
if(res)
|
||||
return (int)res;
|
||||
|
||||
curlhandle = curl_easy_init();
|
||||
if(curlhandle) {
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
const char *remote = "sftp://user:pass@example.com/path/filename";
|
||||
const char *filename = "filename";
|
||||
|
||||
if(!sftpResumeUpload(curlhandle, remote, filename)) {
|
||||
if(!sftpResumeUpload(curl, remote, filename)) {
|
||||
printf("resumed upload using curl %s failed\n", curl_version());
|
||||
}
|
||||
|
||||
curl_easy_cleanup(curlhandle);
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
curl_global_cleanup();
|
||||
|
||||
|
|
|
|||
|
|
@ -28,19 +28,19 @@
|
|||
#include <stdio.h>
|
||||
#include <curl/curl.h>
|
||||
|
||||
static void my_lock(CURL *handle, curl_lock_data data,
|
||||
static void my_lock(CURL *curl, curl_lock_data data,
|
||||
curl_lock_access laccess, void *useptr)
|
||||
{
|
||||
(void)handle;
|
||||
(void)curl;
|
||||
(void)data;
|
||||
(void)laccess;
|
||||
(void)useptr;
|
||||
fprintf(stderr, "-> Mutex lock\n");
|
||||
}
|
||||
|
||||
static void my_unlock(CURL *handle, curl_lock_data data, void *useptr)
|
||||
static void my_unlock(CURL *curl, curl_lock_data data, void *useptr)
|
||||
{
|
||||
(void)handle;
|
||||
(void)curl;
|
||||
(void)data;
|
||||
(void)useptr;
|
||||
fprintf(stderr, "<- Mutex unlock\n");
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ const char * const urls[]= {
|
|||
"90030"
|
||||
};
|
||||
|
||||
size_t write_file(void *ptr, size_t size, size_t nmemb, FILE *stream)
|
||||
size_t write_cb(void *ptr, size_t size, size_t nmemb, FILE *stream)
|
||||
{
|
||||
return fwrite(ptr, size, nmemb, stream);
|
||||
}
|
||||
|
|
@ -80,7 +80,7 @@ static void run_one(gchar *http, int j)
|
|||
|
||||
/* Write to the file */
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_file);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
(void)curl_easy_perform(curl);
|
||||
|
||||
fclose(outfile);
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ struct upload_status {
|
|||
size_t bytes_read;
|
||||
};
|
||||
|
||||
static size_t payload_source(char *ptr, size_t size, size_t nmemb, void *userp)
|
||||
static size_t read_cb(char *ptr, size_t size, size_t nmemb, void *userp)
|
||||
{
|
||||
struct upload_status *upload_ctx = (struct upload_status *)userp;
|
||||
const char *data;
|
||||
|
|
@ -133,7 +133,7 @@ int main(void)
|
|||
/* We are using a callback function to specify the payload (the headers and
|
||||
* body of the message). You could just use the CURLOPT_READDATA option to
|
||||
* specify a FILE pointer to read from. */
|
||||
curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source);
|
||||
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_cb);
|
||||
curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx);
|
||||
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
|
||||
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ struct upload_status {
|
|||
size_t bytes_read;
|
||||
};
|
||||
|
||||
static size_t payload_source(char *ptr, size_t size, size_t nmemb, void *userp)
|
||||
static size_t read_cb(char *ptr, size_t size, size_t nmemb, void *userp)
|
||||
{
|
||||
struct upload_status *upload_ctx = (struct upload_status *)userp;
|
||||
const char *data;
|
||||
|
|
@ -121,7 +121,7 @@ int main(void)
|
|||
/* We are using a callback function to specify the payload (the headers and
|
||||
* body of the message). You could just use the CURLOPT_READDATA option to
|
||||
* specify a FILE pointer to read from. */
|
||||
curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source);
|
||||
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_cb);
|
||||
curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx);
|
||||
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
|
||||
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ struct upload_status {
|
|||
size_t bytes_read;
|
||||
};
|
||||
|
||||
static size_t payload_source(char *ptr, size_t size, size_t nmemb, void *userp)
|
||||
static size_t read_cb(char *ptr, size_t size, size_t nmemb, void *userp)
|
||||
{
|
||||
struct upload_status *upload_ctx = (struct upload_status *)userp;
|
||||
const char *data;
|
||||
|
|
@ -89,10 +89,10 @@ int main(void)
|
|||
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
CURLM *mcurl;
|
||||
CURLM *multi;
|
||||
|
||||
mcurl = curl_multi_init();
|
||||
if(mcurl) {
|
||||
multi = curl_multi_init();
|
||||
if(multi) {
|
||||
int still_running = 1;
|
||||
struct curl_slist *recipients = NULL;
|
||||
struct upload_status upload_ctx = { 0 };
|
||||
|
|
@ -119,19 +119,19 @@ int main(void)
|
|||
/* We are using a callback function to specify the payload (the headers
|
||||
* and body of the message). You could just use the CURLOPT_READDATA
|
||||
* option to specify a FILE pointer to read from. */
|
||||
curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source);
|
||||
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_cb);
|
||||
curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx);
|
||||
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
|
||||
|
||||
/* Tell the multi stack about our easy handle */
|
||||
curl_multi_add_handle(mcurl, curl);
|
||||
curl_multi_add_handle(multi, curl);
|
||||
|
||||
do {
|
||||
CURLMcode mc = curl_multi_perform(mcurl, &still_running);
|
||||
CURLMcode mc = curl_multi_perform(multi, &still_running);
|
||||
|
||||
if(still_running)
|
||||
/* wait for activity, timeout or "nothing" */
|
||||
mc = curl_multi_poll(mcurl, NULL, 0, 1000, NULL);
|
||||
mc = curl_multi_poll(multi, NULL, 0, 1000, NULL);
|
||||
|
||||
if(mc)
|
||||
break;
|
||||
|
|
@ -142,8 +142,8 @@ int main(void)
|
|||
curl_slist_free_all(recipients);
|
||||
|
||||
/* Always cleanup */
|
||||
curl_multi_remove_handle(mcurl, curl);
|
||||
curl_multi_cleanup(mcurl);
|
||||
curl_multi_remove_handle(multi, curl);
|
||||
curl_multi_cleanup(multi);
|
||||
}
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ struct upload_status {
|
|||
size_t bytes_read;
|
||||
};
|
||||
|
||||
static size_t payload_source(char *ptr, size_t size, size_t nmemb, void *userp)
|
||||
static size_t read_cb(char *ptr, size_t size, size_t nmemb, void *userp)
|
||||
{
|
||||
struct upload_status *upload_ctx = (struct upload_status *)userp;
|
||||
const char *data;
|
||||
|
|
@ -143,7 +143,7 @@ int main(void)
|
|||
/* We are using a callback function to specify the payload (the headers and
|
||||
* body of the message). You could just use the CURLOPT_READDATA option to
|
||||
* specify a FILE pointer to read from. */
|
||||
curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source);
|
||||
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_cb);
|
||||
curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx);
|
||||
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
|
||||
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ struct upload_status {
|
|||
size_t bytes_read;
|
||||
};
|
||||
|
||||
static size_t payload_source(char *ptr, size_t size, size_t nmemb, void *userp)
|
||||
static size_t read_cb(char *ptr, size_t size, size_t nmemb, void *userp)
|
||||
{
|
||||
struct upload_status *upload_ctx = (struct upload_status *)userp;
|
||||
const char *data;
|
||||
|
|
@ -145,7 +145,7 @@ int main(void)
|
|||
/* We are using a callback function to specify the payload (the headers and
|
||||
* body of the message). You could just use the CURLOPT_READDATA option to
|
||||
* specify a FILE pointer to read from. */
|
||||
curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source);
|
||||
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_cb);
|
||||
curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx);
|
||||
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
|
||||
|
||||
|
|
|
|||
|
|
@ -117,7 +117,7 @@ static SYSTEMTIME LOCALTime;
|
|||
#define HTTP_COMMAND_HEAD 0
|
||||
#define HTTP_COMMAND_GET 1
|
||||
|
||||
static size_t SyncTime_CURL_WriteOutput(void *ptr, size_t size, size_t nmemb,
|
||||
static size_t write_cb(void *ptr, size_t size, size_t nmemb,
|
||||
void *stream)
|
||||
{
|
||||
fwrite(ptr, size, nmemb, stream);
|
||||
|
|
@ -187,7 +187,7 @@ static void SyncTime_CURL_Init(CURL *curl, const char *proxy_port,
|
|||
curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, proxy_user_password);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_USERAGENT, SYNCTIME_UA);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, SyncTime_CURL_WriteOutput);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, SyncTime_CURL_WriteHeader);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@
|
|||
|
||||
#include <curl/curl.h>
|
||||
|
||||
static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
{
|
||||
size_t written = fwrite(ptr, size, nmemb, (FILE *)stream);
|
||||
return written;
|
||||
|
|
@ -41,7 +41,7 @@ int main(int argc, char *argv[])
|
|||
static const char *pagefilename = "page.out";
|
||||
|
||||
CURLcode res;
|
||||
CURL *curl_handle;
|
||||
CURL *curl;
|
||||
|
||||
if(argc < 2) {
|
||||
printf("Usage: %s <URL>\n", argv[0]);
|
||||
|
|
@ -55,38 +55,38 @@ int main(int argc, char *argv[])
|
|||
}
|
||||
|
||||
/* init the curl session */
|
||||
curl_handle = curl_easy_init();
|
||||
if(curl_handle) {
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
FILE *pagefile;
|
||||
|
||||
/* set URL to get here */
|
||||
curl_easy_setopt(curl_handle, CURLOPT_URL, argv[1]);
|
||||
curl_easy_setopt(curl, CURLOPT_URL, argv[1]);
|
||||
|
||||
/* Switch on full protocol/debug output while testing */
|
||||
curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||
|
||||
/* disable progress meter, set to 0L to enable it */
|
||||
curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
|
||||
|
||||
/* send all data to this function */
|
||||
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
|
||||
/* open the file */
|
||||
pagefile = fopen(pagefilename, "wb");
|
||||
if(pagefile) {
|
||||
|
||||
/* write the page body to this file handle */
|
||||
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, pagefile);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, pagefile);
|
||||
|
||||
/* get it! */
|
||||
res = curl_easy_perform(curl_handle);
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
/* close the header file */
|
||||
fclose(pagefile);
|
||||
}
|
||||
|
||||
/* cleanup curl stuff */
|
||||
curl_easy_cleanup(curl_handle);
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
|
||||
curl_global_cleanup();
|
||||
|
|
|
|||
|
|
@ -156,34 +156,34 @@ static CURLcode sslctx_function(CURL *curl, void *sslctx, void *pointer)
|
|||
|
||||
int main(void)
|
||||
{
|
||||
CURL *ch;
|
||||
CURL *curl;
|
||||
|
||||
CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
|
||||
if(res)
|
||||
return (int)res;
|
||||
|
||||
ch = curl_easy_init();
|
||||
if(ch) {
|
||||
curl_easy_setopt(ch, CURLOPT_VERBOSE, 0L);
|
||||
curl_easy_setopt(ch, CURLOPT_HEADER, 0L);
|
||||
curl_easy_setopt(ch, CURLOPT_NOPROGRESS, 1L);
|
||||
curl_easy_setopt(ch, CURLOPT_NOSIGNAL, 1L);
|
||||
curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, writefunction);
|
||||
curl_easy_setopt(ch, CURLOPT_WRITEDATA, stdout);
|
||||
curl_easy_setopt(ch, CURLOPT_HEADERFUNCTION, writefunction);
|
||||
curl_easy_setopt(ch, CURLOPT_HEADERDATA, stderr);
|
||||
curl_easy_setopt(ch, CURLOPT_SSLCERTTYPE, "PEM");
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
curl_easy_setopt(curl, CURLOPT_VERBOSE, 0L);
|
||||
curl_easy_setopt(curl, CURLOPT_HEADER, 0L);
|
||||
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunction);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, stdout);
|
||||
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, writefunction);
|
||||
curl_easy_setopt(curl, CURLOPT_HEADERDATA, stderr);
|
||||
curl_easy_setopt(curl, CURLOPT_SSLCERTTYPE, "PEM");
|
||||
|
||||
/* both VERIFYPEER and VERIFYHOST are set to 0 in this case because there
|
||||
is no CA certificate */
|
||||
curl_easy_setopt(ch, CURLOPT_SSL_VERIFYPEER, 0L);
|
||||
curl_easy_setopt(ch, CURLOPT_SSL_VERIFYHOST, 0L);
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
|
||||
|
||||
curl_easy_setopt(ch, CURLOPT_URL, "https://www.example.com/");
|
||||
curl_easy_setopt(ch, CURLOPT_SSLKEYTYPE, "PEM");
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com/");
|
||||
curl_easy_setopt(curl, CURLOPT_SSLKEYTYPE, "PEM");
|
||||
|
||||
/* first try: retrieve page without user certificate and key -> fails */
|
||||
res = curl_easy_perform(ch);
|
||||
res = curl_easy_perform(curl);
|
||||
if(res == CURLE_OK)
|
||||
printf("*** transfer succeeded ***\n");
|
||||
else
|
||||
|
|
@ -193,14 +193,14 @@ int main(void)
|
|||
* load the certificate and key by installing a function doing
|
||||
* the necessary "modifications" to the SSL CONTEXT just before link init
|
||||
*/
|
||||
curl_easy_setopt(ch, CURLOPT_SSL_CTX_FUNCTION, sslctx_function);
|
||||
res = curl_easy_perform(ch);
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_CTX_FUNCTION, sslctx_function);
|
||||
res = curl_easy_perform(curl);
|
||||
if(res == CURLE_OK)
|
||||
printf("*** transfer succeeded ***\n");
|
||||
else
|
||||
printf("*** transfer failed ***\n");
|
||||
|
||||
curl_easy_cleanup(ch);
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
curl_global_cleanup();
|
||||
return (int)res;
|
||||
|
|
|
|||
|
|
@ -28,11 +28,11 @@
|
|||
#include <stdio.h>
|
||||
#include <curl/curl.h>
|
||||
|
||||
static size_t writecb(char *b, size_t size, size_t nitems, void *p)
|
||||
static size_t write_cb(char *b, size_t size, size_t nitems, void *p)
|
||||
{
|
||||
CURL *easy = p;
|
||||
CURL *curl = p;
|
||||
size_t i;
|
||||
const struct curl_ws_frame *frame = curl_ws_meta(easy);
|
||||
const struct curl_ws_frame *frame = curl_ws_meta(curl);
|
||||
fprintf(stderr, "Type: %s\n", frame->flags & CURLWS_BINARY ?
|
||||
"binary" : "text");
|
||||
fprintf(stderr, "Bytes: %u", (unsigned int)(nitems * size));
|
||||
|
|
@ -53,7 +53,7 @@ int main(void)
|
|||
if(curl) {
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "wss://example.com");
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writecb);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
/* pass the easy handle to the callback */
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, curl);
|
||||
|
||||
|
|
|
|||
|
|
@ -29,12 +29,12 @@
|
|||
#include <string.h>
|
||||
#include <curl/curl.h>
|
||||
|
||||
static size_t writecb(char *b, size_t size, size_t nitems, void *p)
|
||||
static size_t write_cb(char *b, size_t size, size_t nitems, void *p)
|
||||
{
|
||||
CURL *easy = p;
|
||||
CURL *curl = p;
|
||||
size_t i;
|
||||
unsigned int blen = (unsigned int)(nitems * size);
|
||||
const struct curl_ws_frame *frame = curl_ws_meta(easy);
|
||||
const struct curl_ws_frame *frame = curl_ws_meta(curl);
|
||||
fprintf(stderr, "Type: %s\n", frame->flags & CURLWS_BINARY ?
|
||||
"binary" : "text");
|
||||
if(frame->flags & CURLWS_BINARY) {
|
||||
|
|
@ -49,13 +49,13 @@ static size_t writecb(char *b, size_t size, size_t nitems, void *p)
|
|||
}
|
||||
|
||||
struct read_ctx {
|
||||
CURL *easy;
|
||||
CURL *curl;
|
||||
char buf[1024];
|
||||
size_t blen;
|
||||
size_t nsent;
|
||||
};
|
||||
|
||||
static size_t readcb(char *buf, size_t nitems, size_t buflen, void *p)
|
||||
static size_t read_cb(char *buf, size_t nitems, size_t buflen, void *p)
|
||||
{
|
||||
struct read_ctx *ctx = p;
|
||||
size_t len = nitems * buflen;
|
||||
|
|
@ -65,7 +65,7 @@ static size_t readcb(char *buf, size_t nitems, size_t buflen, void *p)
|
|||
if(!ctx->nsent) {
|
||||
/* On first call, set the FRAME information to be used (it defaults
|
||||
* to CURLWS_BINARY otherwise). */
|
||||
result = curl_ws_start_frame(ctx->easy, CURLWS_TEXT,
|
||||
result = curl_ws_start_frame(ctx->curl, CURLWS_TEXT,
|
||||
(curl_off_t)ctx->blen);
|
||||
if(result) {
|
||||
fprintf(stderr, "error starting frame: %d\n", result);
|
||||
|
|
@ -85,7 +85,7 @@ static size_t readcb(char *buf, size_t nitems, size_t buflen, void *p)
|
|||
|
||||
int main(int argc, const char *argv[])
|
||||
{
|
||||
CURL *easy;
|
||||
CURL *curl;
|
||||
struct read_ctx rctx;
|
||||
const char *payload = "Hello, friend!";
|
||||
|
||||
|
|
@ -95,33 +95,33 @@ int main(int argc, const char *argv[])
|
|||
|
||||
memset(&rctx, 0, sizeof(rctx));
|
||||
|
||||
easy = curl_easy_init();
|
||||
if(easy) {
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
if(argc == 2)
|
||||
curl_easy_setopt(easy, CURLOPT_URL, argv[1]);
|
||||
curl_easy_setopt(curl, CURLOPT_URL, argv[1]);
|
||||
else
|
||||
curl_easy_setopt(easy, CURLOPT_URL, "wss://example.com");
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "wss://example.com");
|
||||
|
||||
curl_easy_setopt(easy, CURLOPT_WRITEFUNCTION, writecb);
|
||||
curl_easy_setopt(easy, CURLOPT_WRITEDATA, easy);
|
||||
curl_easy_setopt(easy, CURLOPT_READFUNCTION, readcb);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, curl);
|
||||
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_cb);
|
||||
/* tell curl that we want to send the payload */
|
||||
rctx.easy = easy;
|
||||
rctx.curl = curl;
|
||||
rctx.blen = strlen(payload);
|
||||
memcpy(rctx.buf, payload, rctx.blen);
|
||||
curl_easy_setopt(easy, CURLOPT_READDATA, &rctx);
|
||||
curl_easy_setopt(easy, CURLOPT_UPLOAD, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_READDATA, &rctx);
|
||||
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
|
||||
|
||||
|
||||
/* Perform the request, res gets the return code */
|
||||
res = curl_easy_perform(easy);
|
||||
res = curl_easy_perform(curl);
|
||||
/* Check for errors */
|
||||
if(res != CURLE_OK)
|
||||
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(easy);
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
curl_global_cleanup();
|
||||
return (int)res;
|
||||
|
|
|
|||
|
|
@ -95,8 +95,8 @@ static void endElement(void *userData, const XML_Char *name)
|
|||
printf("%5lu %10lu %s\n", state->depth, state->characters.size, name);
|
||||
}
|
||||
|
||||
static size_t parseStreamCallback(void *contents, size_t length, size_t nmemb,
|
||||
void *userp)
|
||||
static size_t write_cb(void *contents, size_t length, size_t nmemb,
|
||||
void *userp)
|
||||
{
|
||||
XML_Parser parser = (XML_Parser) userp;
|
||||
size_t real_size = length * nmemb;
|
||||
|
|
@ -116,14 +116,14 @@ static size_t parseStreamCallback(void *contents, size_t length, size_t nmemb,
|
|||
|
||||
int main(void)
|
||||
{
|
||||
CURL *curl_handle;
|
||||
CURL *curl;
|
||||
|
||||
CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
|
||||
if(res)
|
||||
return (int)res;
|
||||
|
||||
/* Initialize a libcurl handle. */
|
||||
curl_handle = curl_easy_init();
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
XML_Parser parser;
|
||||
struct ParserStruct state;
|
||||
|
|
@ -138,15 +138,15 @@ int main(void)
|
|||
XML_SetElementHandler(parser, startElement, endElement);
|
||||
XML_SetCharacterDataHandler(parser, characterDataHandler);
|
||||
|
||||
curl_easy_setopt(curl_handle, CURLOPT_URL,
|
||||
curl_easy_setopt(curl, CURLOPT_URL,
|
||||
"https://www.w3schools.com/xml/simple.xml");
|
||||
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, parseStreamCallback);
|
||||
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)parser);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)parser);
|
||||
|
||||
printf("Depth Characters Closing Tag\n");
|
||||
|
||||
/* Perform the request and any follow-up parsing. */
|
||||
res = curl_easy_perform(curl_handle);
|
||||
res = curl_easy_perform(curl);
|
||||
if(res != CURLE_OK) {
|
||||
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
|
|
@ -168,7 +168,7 @@ int main(void)
|
|||
free(state.characters.memory);
|
||||
XML_ParserFree(parser);
|
||||
|
||||
curl_easy_cleanup(curl_handle);
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
|
||||
curl_global_cleanup();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue