1 /*****************************************************************************
3 * Project ___| | | | _ \| |
5 * | (__| |_| | _ <| |___
6 * \___|\___/|_| \_\_____|
12 #include <sys/types.h>
19 #define MAIN_LOOP_HANG_TIMEOUT 90 * 1000
20 #define MULTI_PERFORM_HANG_TIMEOUT 60 * 1000
29 struct timeval ml_start;
30 struct timeval mp_start;
31 char ml_timedout = FALSE;
32 char mp_timedout = FALSE;
34 if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
35 fprintf(stderr, "curl_global_init() failed\n");
36 return TEST_ERR_MAJOR_BAD;
39 if ((curl = curl_easy_init()) == NULL) {
40 fprintf(stderr, "curl_easy_init() failed\n");
41 curl_global_cleanup();
42 return TEST_ERR_MAJOR_BAD;
45 test_setopt(curl, CURLOPT_URL, URL);
46 test_setopt(curl, CURLOPT_VERBOSE, 1);
47 test_setopt(curl, CURLOPT_PROXY, libtest_arg2);
48 test_setopt(curl, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4);
50 if ((m = curl_multi_init()) == NULL) {
51 fprintf(stderr, "curl_multi_init() failed\n");
52 curl_easy_cleanup(curl);
53 curl_global_cleanup();
54 return TEST_ERR_MAJOR_BAD;
57 if ((res = (int)curl_multi_add_handle(m, curl)) != CURLM_OK) {
58 fprintf(stderr, "curl_multi_add_handle() failed, "
59 "with code %d\n", res);
60 curl_multi_cleanup(m);
61 curl_easy_cleanup(curl);
62 curl_global_cleanup();
63 return TEST_ERR_MAJOR_BAD;
67 ml_start = tutil_tvnow();
69 fprintf(stderr, "Start at URL 0\n");
74 struct timeval interval;
79 if (tutil_tvdiff(tutil_tvnow(), ml_start) >
80 MAIN_LOOP_HANG_TIMEOUT) {
85 mp_start = tutil_tvnow();
87 while (res == CURLM_CALL_MULTI_PERFORM) {
88 res = (int)curl_multi_perform(m, &running);
89 if (tutil_tvdiff(tutil_tvnow(), mp_start) >
90 MULTI_PERFORM_HANG_TIMEOUT) {
95 done = TRUE; /* bail out */
99 if (mp_timedout || done)
102 if (res != CURLM_OK) {
103 fprintf(stderr, "not okay???\n");
112 if (curl_multi_fdset(m, &rd, &wr, &exc, &max_fd) != CURLM_OK) {
113 fprintf(stderr, "unexpected failured of fdset.\n");
118 if (select_test(max_fd+1, &rd, &wr, &exc, &interval) == -1) {
119 fprintf(stderr, "bad select??\n");
124 res = CURLM_CALL_MULTI_PERFORM;
127 if (ml_timedout || mp_timedout) {
128 if (ml_timedout) fprintf(stderr, "ml_timedout\n");
129 if (mp_timedout) fprintf(stderr, "mp_timedout\n");
130 fprintf(stderr, "ABORTING TEST, since it seems "
131 "that it would have run forever.\n");
132 res = TEST_ERR_RUNS_FOREVER;
137 curl_easy_cleanup(curl);
139 curl_multi_cleanup(m);
140 curl_global_cleanup();