1 /*****************************************************************************
3 * Project ___| | | | _ \| |
5 * | (__| |_| | _ <| |___
6 * \___|\___/|_| \_\_____|
16 #define MAIN_LOOP_HANG_TIMEOUT 90 * 1000
17 #define MULTI_PERFORM_HANG_TIMEOUT 60 * 1000
28 struct timeval ml_start;
29 struct timeval mp_start;
30 char ml_timedout = FALSE;
31 char mp_timedout = FALSE;
33 if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
34 fprintf(stderr, "curl_global_init() failed\n");
35 return TEST_ERR_MAJOR_BAD;
38 if ((multi = curl_multi_init()) == NULL) {
39 fprintf(stderr, "curl_multi_init() failed\n");
40 curl_global_cleanup();
41 return TEST_ERR_MAJOR_BAD;
44 if ((curls = curl_easy_init()) == NULL) {
45 fprintf(stderr, "curl_easy_init() failed\n");
46 curl_multi_cleanup(multi);
47 curl_global_cleanup();
48 return TEST_ERR_MAJOR_BAD;
51 test_setopt(curls, CURLOPT_URL, URL);
53 if ((ret = curl_multi_add_handle(multi, curls)) != CURLM_OK) {
54 fprintf(stderr, "curl_multi_add_handle() failed, "
55 "with code %d\n", ret);
56 curl_easy_cleanup(curls);
57 curl_multi_cleanup(multi);
58 curl_global_cleanup();
59 return TEST_ERR_MAJOR_BAD;
63 mp_start = tutil_tvnow();
66 ret = curl_multi_perform(multi, &still_running);
67 if (tutil_tvdiff(tutil_tvnow(), mp_start) >
68 MULTI_PERFORM_HANG_TIMEOUT) {
72 } while (ret == CURLM_CALL_MULTI_PERFORM);
75 ml_start = tutil_tvnow();
77 while ((!ml_timedout) && (!mp_timedout) && (still_running)) {
78 struct timeval timeout;
91 if (tutil_tvdiff(tutil_tvnow(), ml_start) >
92 MAIN_LOOP_HANG_TIMEOUT) {
97 curl_multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd);
98 rc = select_test(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
105 mp_start = tutil_tvnow();
107 ret = curl_multi_perform(multi, &still_running);
108 if (tutil_tvdiff(tutil_tvnow(), mp_start) >
109 MULTI_PERFORM_HANG_TIMEOUT) {
113 } while (ret == CURLM_CALL_MULTI_PERFORM);
117 if (ml_timedout || mp_timedout) {
118 if (ml_timedout) fprintf(stderr, "ml_timedout\n");
119 if (mp_timedout) fprintf(stderr, "mp_timedout\n");
120 fprintf(stderr, "ABORTING TEST, since it seems "
121 "that it would have run forever.\n");
122 i = TEST_ERR_RUNS_FOREVER;
125 msg = curl_multi_info_read(multi, &still_running);
127 /* this should now contain a result code from the easy handle,
129 i = msg->data.result;
134 curl_multi_cleanup(multi);
135 curl_easy_cleanup(curls);
136 curl_global_cleanup();
141 return i; /* return the final return code */