1 /*****************************************************************************
3 * Project ___| | | | _ \| |
5 * | (__| |_| | _ <| |___
6 * \___|\___/|_| \_\_____|
13 #ifdef HAVE_SYS_TYPES_H
14 #include <sys/types.h>
16 #ifdef HAVE_SYS_STAT_H
26 #define MAIN_LOOP_HANG_TIMEOUT 90 * 1000
27 #define MULTI_PERFORM_HANG_TIMEOUT 60 * 1000
34 CURL *curl[NUM_HANDLES];
39 struct timeval ml_start;
40 struct timeval mp_start;
41 char ml_timedout = FALSE;
42 char mp_timedout = FALSE;
45 if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
46 fprintf(stderr, "curl_global_init() failed\n");
47 return TEST_ERR_MAJOR_BAD;
50 if ((m = curl_multi_init()) == NULL) {
51 fprintf(stderr, "curl_multi_init() failed\n");
52 curl_global_cleanup();
53 return TEST_ERR_MAJOR_BAD;
56 /* get NUM_HANDLES easy handles */
57 for(i=0; i < NUM_HANDLES; i++) {
58 curl[i] = curl_easy_init();
60 fprintf(stderr, "curl_easy_init() failed "
61 "on handle #%d\n", i);
62 for (j=i-1; j >= 0; j--) {
63 curl_multi_remove_handle(m, curl[j]);
64 curl_easy_cleanup(curl[j]);
66 curl_multi_cleanup(m);
67 curl_global_cleanup();
68 return TEST_ERR_MAJOR_BAD + i;
70 sprintf(target_url, "%s%04i", URL, i + 1);
71 target_url[sizeof(target_url) - 1] = '\0';
72 curl_easy_setopt(curl[i], CURLOPT_URL, target_url);
75 curl_easy_setopt(curl[i], CURLOPT_VERBOSE, 1L);
78 curl_easy_setopt(curl[i], CURLOPT_HEADER, 1L);
80 /* add handle to multi */
81 if ((res = (int)curl_multi_add_handle(m, curl[i])) != CURLM_OK) {
82 fprintf(stderr, "curl_multi_add_handle() failed, "
83 "on handle #%d with code %d\n", i, res);
84 curl_easy_cleanup(curl[i]);
85 for (j=i-1; j >= 0; j--) {
86 curl_multi_remove_handle(m, curl[j]);
87 curl_easy_cleanup(curl[j]);
89 curl_multi_cleanup(m);
90 curl_global_cleanup();
91 return TEST_ERR_MAJOR_BAD + i;
95 curl_multi_setopt(m, CURLMOPT_PIPELINING, 1L);
98 ml_start = tutil_tvnow();
100 fprintf(stderr, "Start at URL 0\n");
105 struct timeval interval;
108 interval.tv_usec = 0;
110 if (tutil_tvdiff(tutil_tvnow(), ml_start) >
111 MAIN_LOOP_HANG_TIMEOUT) {
116 mp_start = tutil_tvnow();
118 while (res == CURLM_CALL_MULTI_PERFORM) {
119 res = (int)curl_multi_perform(m, &running);
120 if (tutil_tvdiff(tutil_tvnow(), mp_start) >
121 MULTI_PERFORM_HANG_TIMEOUT) {
126 done = TRUE; /* bail out */
130 if (mp_timedout || done)
133 if (res != CURLM_OK) {
134 fprintf(stderr, "not okay???\n");
143 if (curl_multi_fdset(m, &rd, &wr, &exc, &max_fd) != CURLM_OK) {
144 fprintf(stderr, "unexpected failured of fdset.\n");
149 if (select_test(max_fd+1, &rd, &wr, &exc, &interval) == -1) {
150 fprintf(stderr, "bad select??\n");
155 res = CURLM_CALL_MULTI_PERFORM;
158 if (ml_timedout || mp_timedout) {
159 if (ml_timedout) fprintf(stderr, "ml_timedout\n");
160 if (mp_timedout) fprintf(stderr, "mp_timedout\n");
161 fprintf(stderr, "ABORTING TEST, since it seems "
162 "that it would have run forever.\n");
163 res = TEST_ERR_RUNS_FOREVER;
166 /* cleanup NUM_HANDLES easy handles */
167 for(i=0; i < NUM_HANDLES; i++) {
168 curl_multi_remove_handle(m, curl[i]);
169 curl_easy_cleanup(curl[i]);
172 curl_multi_cleanup(m);
173 curl_global_cleanup();