libuv/docs/code/uvwget/main.c
Go to the documentation of this file.
1 #include <assert.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <uv.h>
5 #include <curl/curl.h>
6 
8 CURLM *curl_handle;
10 
11 typedef struct curl_context_s {
13  curl_socket_t sockfd;
15 
16 curl_context_t *create_curl_context(curl_socket_t sockfd) {
18 
19  context = (curl_context_t*) malloc(sizeof *context);
20 
21  context->sockfd = sockfd;
22 
23  int r = uv_poll_init_socket(loop, &context->poll_handle, sockfd);
24  assert(r == 0);
25  context->poll_handle.data = context;
26 
27  return context;
28 }
29 
32  free(context);
33 }
34 
36  uv_close((uv_handle_t*) &context->poll_handle, curl_close_cb);
37 }
38 
39 
40 void add_download(const char *url, int num) {
41  char filename[50];
42  sprintf(filename, "%d.download", num);
43  FILE *file;
44 
45  file = fopen(filename, "w");
46  if (file == NULL) {
47  fprintf(stderr, "Error opening %s\n", filename);
48  return;
49  }
50 
51  CURL *handle = curl_easy_init();
52  curl_easy_setopt(handle, CURLOPT_WRITEDATA, file);
53  curl_easy_setopt(handle, CURLOPT_URL, url);
54  curl_multi_add_handle(curl_handle, handle);
55  fprintf(stderr, "Added download %s -> %s\n", url, filename);
56 }
57 
58 void check_multi_info(void) {
59  char *done_url;
60  CURLMsg *message;
61  int pending;
62 
63  while ((message = curl_multi_info_read(curl_handle, &pending))) {
64  switch (message->msg) {
65  case CURLMSG_DONE:
66  curl_easy_getinfo(message->easy_handle, CURLINFO_EFFECTIVE_URL,
67  &done_url);
68  printf("%s DONE\n", done_url);
69 
70  curl_multi_remove_handle(curl_handle, message->easy_handle);
71  curl_easy_cleanup(message->easy_handle);
72  break;
73 
74  default:
75  fprintf(stderr, "CURLMSG default\n");
76  abort();
77  }
78  }
79 }
80 
81 void curl_perform(uv_poll_t *req, int status, int events) {
83  int running_handles;
84  int flags = 0;
85  if (status < 0) flags = CURL_CSELECT_ERR;
86  if (!status && events & UV_READABLE) flags |= CURL_CSELECT_IN;
87  if (!status && events & UV_WRITABLE) flags |= CURL_CSELECT_OUT;
88 
90 
92 
93  curl_multi_socket_action(curl_handle, context->sockfd, flags, &running_handles);
95 }
96 
98  int running_handles;
99  curl_multi_socket_action(curl_handle, CURL_SOCKET_TIMEOUT, 0, &running_handles);
101 }
102 
103 void start_timeout(CURLM *multi, long timeout_ms, void *userp) {
104  if (timeout_ms <= 0)
105  timeout_ms = 1; /* 0 means directly call socket_action, but we'll do it in a bit */
107 }
108 
109 int handle_socket(CURL *easy, curl_socket_t s, int action, void *userp, void *socketp) {
110  curl_context_t *curl_context;
111  if (action == CURL_POLL_IN || action == CURL_POLL_OUT) {
112  if (socketp) {
113  curl_context = (curl_context_t*) socketp;
114  }
115  else {
116  curl_context = create_curl_context(s);
117  curl_multi_assign(curl_handle, s, (void *) curl_context);
118  }
119  }
120 
121  switch (action) {
122  case CURL_POLL_IN:
124  break;
125  case CURL_POLL_OUT:
127  break;
128  case CURL_POLL_REMOVE:
129  if (socketp) {
130  uv_poll_stop(&((curl_context_t*)socketp)->poll_handle);
132  curl_multi_assign(curl_handle, s, NULL);
133  }
134  break;
135  default:
136  abort();
137  }
138 
139  return 0;
140 }
141 
142 int main(int argc, char **argv) {
143  loop = uv_default_loop();
144 
145  if (argc <= 1)
146  return 0;
147 
148  if (curl_global_init(CURL_GLOBAL_ALL)) {
149  fprintf(stderr, "Could not init cURL\n");
150  return 1;
151  }
152 
154 
155  curl_handle = curl_multi_init();
156  curl_multi_setopt(curl_handle, CURLMOPT_SOCKETFUNCTION, handle_socket);
157  curl_multi_setopt(curl_handle, CURLMOPT_TIMERFUNCTION, start_timeout);
158 
159  while (argc-- > 1) {
160  add_download(argv[argc], argc);
161  }
162 
164  curl_multi_cleanup(curl_handle);
165  return 0;
166 }
filename
const char * filename
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:135
add_download
void add_download(const char *url, int num)
Definition: libuv/docs/code/uvwget/main.c:40
file
const grpc_generator::File * file
Definition: python_private_generator.h:38
UV_WRITABLE
@ UV_WRITABLE
Definition: uv.h:791
uv_poll_init_socket
UV_EXTERN int uv_poll_init_socket(uv_loop_t *loop, uv_poll_t *handle, uv_os_sock_t socket)
Definition: unix/poll.c:96
start_timeout
void start_timeout(CURLM *multi, long timeout_ms, void *userp)
Definition: libuv/docs/code/uvwget/main.c:103
printf
_Use_decl_annotations_ int __cdecl printf(const char *_Format,...)
Definition: cs_driver.c:91
handle_socket
int handle_socket(CURL *easy, curl_socket_t s, int action, void *userp, void *socketp)
Definition: libuv/docs/code/uvwget/main.c:109
curl_close_cb
void curl_close_cb(uv_handle_t *handle)
Definition: libuv/docs/code/uvwget/main.c:30
on_timeout
void on_timeout(uv_timer_t *req)
Definition: libuv/docs/code/uvwget/main.c:97
file
Definition: bloaty/third_party/zlib/examples/gzappend.c:170
status
absl::Status status
Definition: rls.cc:251
curl_handle
CURLM * curl_handle
Definition: libuv/docs/code/uvwget/main.c:8
check_multi_info
void check_multi_info(void)
Definition: libuv/docs/code/uvwget/main.c:58
curl_context_s::poll_handle
uv_poll_t poll_handle
Definition: libuv/docs/code/uvwget/main.c:12
curl_perform
void curl_perform(uv_poll_t *req, int status, int events)
Definition: libuv/docs/code/uvwget/main.c:81
uv_run
UV_EXTERN int uv_run(uv_loop_t *, uv_run_mode mode)
Definition: unix/core.c:361
uv_timer_stop
UV_EXTERN int uv_timer_stop(uv_timer_t *handle)
Definition: timer.c:97
grpc_core::pending
P< T > pending()
Definition: try_join_test.cc:50
message
char * message
Definition: libuv/docs/code/tty-gravity/main.c:12
curl_context_t
struct curl_context_s curl_context_t
uv_poll_start
UV_EXTERN int uv_poll_start(uv_poll_t *handle, int events, uv_poll_cb cb)
Definition: unix/poll.c:118
python_utils.port_server.stderr
stderr
Definition: port_server.py:51
uv_close
UV_EXTERN void uv_close(uv_handle_t *handle, uv_close_cb close_cb)
Definition: unix/core.c:112
destroy_curl_context
void destroy_curl_context(curl_context_t *context)
Definition: libuv/docs/code/uvwget/main.c:35
setup.url
url
Definition: setup.py:547
uv_default_loop
UV_EXTERN uv_loop_t * uv_default_loop(void)
Definition: uv-common.c:733
req
static uv_connect_t req
Definition: test-connection-fail.c:30
UV_RUN_DEFAULT
@ UV_RUN_DEFAULT
Definition: uv.h:254
curl_context_s::sockfd
curl_socket_t sockfd
Definition: libuv/docs/code/uvwget/main.c:13
UV_READABLE
@ UV_READABLE
Definition: uv.h:790
uv_timer_s
Definition: uv.h:850
loop
uv_loop_t * loop
Definition: libuv/docs/code/uvwget/main.c:7
uv.h
curl_context_s
Definition: libuv/docs/code/uvwget/main.c:11
uv_poll_s
Definition: uv.h:783
benchmark.FILE
FILE
Definition: benchmark.py:21
client.action
action
Definition: examples/python/xds/client.py:49
absl::flags_internal
Definition: abseil-cpp/absl/flags/commandlineflag.h:40
fix_build_deps.r
r
Definition: fix_build_deps.py:491
uv_poll_stop
UV_EXTERN int uv_poll_stop(uv_poll_t *handle)
Definition: unix/poll.c:111
timeout_ms
int timeout_ms
Definition: rls_end2end_test.cc:239
xds_manager.num
num
Definition: xds_manager.py:56
handle
static csh handle
Definition: test_arm_regression.c:16
context
grpc::ClientContext context
Definition: istio_echo_server_lib.cc:61
uv_handle_s
Definition: uv.h:441
uv_timer_start
UV_EXTERN int uv_timer_start(uv_timer_t *handle, uv_timer_cb cb, uint64_t timeout, uint64_t repeat)
Definition: timer.c:66
uv_loop_s
Definition: uv.h:1767
uv_timer_init
UV_EXTERN int uv_timer_init(uv_loop_t *, uv_timer_t *handle)
Definition: timer.c:58
poll_handle
static uv_fs_poll_t poll_handle
Definition: test-fs-poll.c:45
create_curl_context
curl_context_t * create_curl_context(curl_socket_t sockfd)
Definition: libuv/docs/code/uvwget/main.c:16
main
int main(int argc, char **argv)
Definition: libuv/docs/code/uvwget/main.c:142
timeout
uv_timer_t timeout
Definition: libuv/docs/code/uvwget/main.c:9


grpc
Author(s):
autogenerated on Fri May 16 2025 02:59:17