1 /*****************************************************************************
3 * Project ___| | | | _ \| |
5 * | (__| |_| | _ <| |___
6 * \___|\___/|_| \_\_____|
13 #include <sys/types.h>
20 #define MAIN_LOOP_HANG_TIMEOUT 90 * 1000
21 #define MULTI_PERFORM_HANG_TIMEOUT 60 * 1000
30 struct timeval ml_start;
31 struct timeval mp_start;
32 char ml_timedout = FALSE;
33 char mp_timedout = FALSE;
35 if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
36 fprintf(stderr, "curl_global_init() failed\n");
37 return TEST_ERR_MAJOR_BAD;
40 if ((curl = curl_easy_init()) == NULL) {
41 fprintf(stderr, "curl_easy_init() failed\n");
42 curl_global_cleanup();
43 return TEST_ERR_MAJOR_BAD;
46 test_setopt(curl, CURLOPT_URL, URL);
47 test_setopt(curl, CURLOPT_VERBOSE, 1);
48 test_setopt(curl, CURLOPT_PROXY, libtest_arg2);
49 test_setopt(curl, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4);
51 if ((m = curl_multi_init()) == NULL) {
52 fprintf(stderr, "curl_multi_init() failed\n");
53 curl_easy_cleanup(curl);
54 curl_global_cleanup();
55 return TEST_ERR_MAJOR_BAD;
58 if ((res = (int)curl_multi_add_handle(m, curl)) != CURLM_OK) {
59 fprintf(stderr, "curl_multi_add_handle() failed, "
60 "with code %d\n", res);
61 curl_multi_cleanup(m);
62 curl_easy_cleanup(curl);
63 curl_global_cleanup();
64 return TEST_ERR_MAJOR_BAD;
68 ml_start = tutil_tvnow();
70 fprintf(stderr, "Start at URL 0\n");
75 struct timeval interval;
80 if (tutil_tvdiff(tutil_tvnow(), ml_start) >
81 MAIN_LOOP_HANG_TIMEOUT) {
86 mp_start = tutil_tvnow();
88 while (res == CURLM_CALL_MULTI_PERFORM) {
89 res = (int)curl_multi_perform(m, &running);
90 if (tutil_tvdiff(tutil_tvnow(), mp_start) >
91 MULTI_PERFORM_HANG_TIMEOUT) {
96 done = TRUE; /* bail out */
100 if (mp_timedout || done)
103 if (res != CURLM_OK) {
104 fprintf(stderr, "not okay???\n");
113 if (curl_multi_fdset(m, &rd, &wr, &exc, &max_fd) != CURLM_OK) {
114 fprintf(stderr, "unexpected failured of fdset.\n");
119 if (select_test(max_fd+1, &rd, &wr, &exc, &interval) == -1) {
120 fprintf(stderr, "bad select??\n");
125 res = CURLM_CALL_MULTI_PERFORM;
128 if (ml_timedout || mp_timedout) {
129 if (ml_timedout) fprintf(stderr, "ml_timedout\n");
130 if (mp_timedout) fprintf(stderr, "mp_timedout\n");
131 fprintf(stderr, "ABORTING TEST, since it seems "
132 "that it would have run forever.\n");
133 res = TEST_ERR_RUNS_FOREVER;
138 curl_easy_cleanup(curl);
140 curl_multi_cleanup(m);
141 curl_global_cleanup();