X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=docs%2Fexamples%2Fmulti-uv.c;h=0c0f8a2b946c33cd34d24ad65f4219b78a61d664;hb=df4392d06fac8fead7a2cbde19684f54c580af68;hp=57d712fcfaac486ed18f59f5e792206ea8b05c9d;hpb=867eb33477c07331e7b58302119308d02a02ee01;p=platform%2Fupstream%2Fcurl.git diff --git a/docs/examples/multi-uv.c b/docs/examples/multi-uv.c index 57d712f..0c0f8a2 100644 --- a/docs/examples/multi-uv.c +++ b/docs/examples/multi-uv.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -64,13 +64,13 @@ curl_context_t* create_curl_context(curl_socket_t sockfd) void curl_close_cb(uv_handle_t *handle) { - curl_context_t* context = (curl_context_t*) handle->data; + curl_context_t *context = (curl_context_t *) handle->data; free(context); } void destroy_curl_context(curl_context_t *context) { - uv_close((uv_handle_t*) &context->poll_handle, curl_close_cb); + uv_close((uv_handle_t *) &context->poll_handle, curl_close_cb); } @@ -83,67 +83,84 @@ void add_download(const char *url, int num) sprintf(filename, "%d.download", num); file = fopen(filename, "w"); - if (file == NULL) { + if(!file) { fprintf(stderr, "Error opening %s\n", filename); 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); fprintf(stderr, "Added download %s -> %s\n", url, filename); } -void curl_perform(uv_poll_t *req, int status, int events) +static void check_multi_info(void) { int running_handles; - int flags = 0; - curl_context_t *context; char *done_url; CURLMsg *message; int pending; + FILE *file; - uv_timer_stop(&timeout); - - if (events & UV_READABLE) - flags |= CURL_CSELECT_IN; - if (events & UV_WRITABLE) - flags |= CURL_CSELECT_OUT; - - context = (curl_context_t*)req; - - curl_multi_socket_action(curl_handle, context->sockfd, flags, - &running_handles); - - while ((message = curl_multi_info_read(curl_handle, &pending))) { - switch (message->msg) { + while((message = curl_multi_info_read(curl_handle, &pending))) { + switch(message->msg) { case CURLMSG_DONE: curl_easy_getinfo(message->easy_handle, CURLINFO_EFFECTIVE_URL, &done_url); + curl_easy_getinfo(message->easy_handle, CURLINFO_PRIVATE, &file); printf("%s DONE\n", done_url); curl_multi_remove_handle(curl_handle, message->easy_handle); curl_easy_cleanup(message->easy_handle); - + if(file) { + fclose(file); + } break; + default: fprintf(stderr, "CURLMSG default\n"); - abort(); + break; } } } +void curl_perform(uv_poll_t *req, int status, int events) +{ + int running_handles; + int flags = 0; + curl_context_t *context; + char *done_url; + CURLMsg *message; + int pending; + + uv_timer_stop(&timeout); + + if(events & UV_READABLE) + flags |= CURL_CSELECT_IN; + if(events & UV_WRITABLE) + flags |= CURL_CSELECT_OUT; + + context = (curl_context_t *) req; + + curl_multi_socket_action(curl_handle, context->sockfd, flags, + &running_handles); + + check_multi_info(); +} + void on_timeout(uv_timer_t *req, int status) { int running_handles; curl_multi_socket_action(curl_handle, CURL_SOCKET_TIMEOUT, 0, &running_handles); + check_multi_info(); } void start_timeout(CURLM *multi, long timeout_ms, void *userp) { - if (timeout_ms <= 0) + if(timeout_ms <= 0) timeout_ms = 1; /* 0 means directly call socket_action, but we'll do it in a bit */ uv_timer_start(&timeout, on_timeout, timeout_ms, 0); @@ -153,9 +170,9 @@ int handle_socket(CURL *easy, curl_socket_t s, int action, void *userp, void *socketp) { curl_context_t *curl_context; - if (action == CURL_POLL_IN || action == CURL_POLL_OUT) { - if (socketp) { - curl_context = (curl_context_t*) socketp; + if(action == CURL_POLL_IN || action == CURL_POLL_OUT) { + if(socketp) { + curl_context = (curl_context_t *) socketp; } else { curl_context = create_curl_context(s); @@ -163,7 +180,7 @@ int handle_socket(CURL *easy, curl_socket_t s, int action, void *userp, curl_multi_assign(curl_handle, s, (void *) curl_context); } - switch (action) { + switch(action) { case CURL_POLL_IN: uv_poll_start(&curl_context->poll_handle, UV_READABLE, curl_perform); break; @@ -171,7 +188,7 @@ int handle_socket(CURL *easy, curl_socket_t s, int action, void *userp, uv_poll_start(&curl_context->poll_handle, UV_WRITABLE, curl_perform); break; case CURL_POLL_REMOVE: - if (socketp) { + if(socketp) { uv_poll_stop(&((curl_context_t*)socketp)->poll_handle); destroy_curl_context((curl_context_t*) socketp); curl_multi_assign(curl_handle, s, NULL); @@ -188,10 +205,10 @@ int main(int argc, char **argv) { loop = uv_default_loop(); - if (argc <= 1) + if(argc <= 1) return 0; - if (curl_global_init(CURL_GLOBAL_ALL)) { + if(curl_global_init(CURL_GLOBAL_ALL)) { fprintf(stderr, "Could not init cURL\n"); return 1; } @@ -202,11 +219,12 @@ int main(int argc, char **argv) curl_multi_setopt(curl_handle, CURLMOPT_SOCKETFUNCTION, handle_socket); curl_multi_setopt(curl_handle, CURLMOPT_TIMERFUNCTION, start_timeout); - while (argc-- > 1) { + while(argc-- > 1) { add_download(argv[argc], argc); } uv_run(loop, UV_RUN_DEFAULT); curl_multi_cleanup(curl_handle); + return 0; }