1 /*****************************************************************************
3 * Project ___| | | | _ \| |
5 * | (__| |_| | _ <| |___
6 * \___|\___/|_| \_\_____|
15 #define MAIN_LOOP_HANG_TIMEOUT 90 * 1000
16 #define MULTI_PERFORM_HANG_TIMEOUT 60 * 1000
27 struct timeval ml_start;
28 struct timeval mp_start;
29 char ml_timedout = FALSE;
30 char mp_timedout = FALSE;
32 if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
33 fprintf(stderr, "curl_global_init() failed\n");
34 return TEST_ERR_MAJOR_BAD;
37 if ((multi = curl_multi_init()) == NULL) {
38 fprintf(stderr, "curl_multi_init() failed\n");
39 curl_global_cleanup();
40 return TEST_ERR_MAJOR_BAD;
43 if ((curls = curl_easy_init()) == NULL) {
44 fprintf(stderr, "curl_easy_init() failed\n");
45 curl_multi_cleanup(multi);
46 curl_global_cleanup();
47 return TEST_ERR_MAJOR_BAD;
50 test_setopt(curls, CURLOPT_URL, URL);
52 if ((ret = curl_multi_add_handle(multi, curls)) != CURLM_OK) {
53 fprintf(stderr, "curl_multi_add_handle() failed, "
54 "with code %d\n", ret);
55 curl_easy_cleanup(curls);
56 curl_multi_cleanup(multi);
57 curl_global_cleanup();
58 return TEST_ERR_MAJOR_BAD;
62 mp_start = tutil_tvnow();
65 ret = curl_multi_perform(multi, &still_running);
66 if (tutil_tvdiff(tutil_tvnow(), mp_start) >
67 MULTI_PERFORM_HANG_TIMEOUT) {
71 } while (ret == CURLM_CALL_MULTI_PERFORM);
74 ml_start = tutil_tvnow();
76 while ((!ml_timedout) && (!mp_timedout) && (still_running)) {
77 struct timeval timeout;
90 if (tutil_tvdiff(tutil_tvnow(), ml_start) >
91 MAIN_LOOP_HANG_TIMEOUT) {
96 curl_multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd);
97 rc = select_test(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
104 mp_start = tutil_tvnow();
106 ret = curl_multi_perform(multi, &still_running);
107 if (tutil_tvdiff(tutil_tvnow(), mp_start) >
108 MULTI_PERFORM_HANG_TIMEOUT) {
112 } while (ret == CURLM_CALL_MULTI_PERFORM);
116 if (ml_timedout || mp_timedout) {
117 if (ml_timedout) fprintf(stderr, "ml_timedout\n");
118 if (mp_timedout) fprintf(stderr, "mp_timedout\n");
119 fprintf(stderr, "ABORTING TEST, since it seems "
120 "that it would have run forever.\n");
121 i = TEST_ERR_RUNS_FOREVER;
124 msg = curl_multi_info_read(multi, &still_running);
126 /* this should now contain a result code from the easy handle,
128 i = msg->data.result;
133 curl_multi_cleanup(multi);
134 curl_easy_cleanup(curls);
135 curl_global_cleanup();
140 return i; /* return the final return code */