1 /*****************************************************************************
3 * Project ___| | | | _ \| |
5 * | (__| |_| | _ <| |___
6 * \___|\___/|_| \_\_____|
12 #include <sys/types.h>
17 #define MAIN_LOOP_HANG_TIMEOUT 90 * 1000
18 #define MULTI_PERFORM_HANG_TIMEOUT 60 * 1000
21 * Source code in here hugely as reported in bug report 651464 by
22 * Christopher R. Palmer.
24 * Use multi interface to get document over proxy with bad port number.
25 * This caused the interface to "hang" in libcurl 7.10.2.
38 struct timeval ml_start;
39 struct timeval mp_start;
40 char ml_timedout = FALSE;
41 char mp_timedout = FALSE;
43 if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
44 fprintf(stderr, "curl_global_init() failed\n");
45 return TEST_ERR_MAJOR_BAD;
48 if ((c = curl_easy_init()) == NULL) {
49 fprintf(stderr, "curl_easy_init() failed\n");
50 curl_global_cleanup();
51 return TEST_ERR_MAJOR_BAD;
54 /* The point here is that there must not be anything running on the given
57 test_setopt(c, CURLOPT_PROXY, libtest_arg2);
58 test_setopt(c, CURLOPT_URL, URL);
59 test_setopt(c, CURLOPT_VERBOSE, 1L);
61 if ((m = curl_multi_init()) == NULL) {
62 fprintf(stderr, "curl_multi_init() failed\n");
64 curl_global_cleanup();
65 return TEST_ERR_MAJOR_BAD;
68 if ((ret = curl_multi_add_handle(m, c)) != CURLM_OK) {
69 fprintf(stderr, "curl_multi_add_handle() failed, "
70 "with code %d\n", ret);
71 curl_multi_cleanup(m);
73 curl_global_cleanup();
74 return TEST_ERR_MAJOR_BAD;
78 ml_start = tutil_tvnow();
81 struct timeval interval;
86 if (tutil_tvdiff(tutil_tvnow(), ml_start) >
87 MAIN_LOOP_HANG_TIMEOUT) {
92 mp_start = tutil_tvnow();
94 fprintf(stderr, "curl_multi_perform()\n");
96 ret = CURLM_CALL_MULTI_PERFORM;
98 while (ret == CURLM_CALL_MULTI_PERFORM) {
99 ret = curl_multi_perform(m, &running);
100 if (tutil_tvdiff(tutil_tvnow(), mp_start) >
101 MULTI_PERFORM_HANG_TIMEOUT) {
110 /* This is where this code is expected to reach */
112 CURLMsg *msg = curl_multi_info_read(m, &numleft);
113 fprintf(stderr, "Expected: not running\n");
115 res = 100; /* this is where we should be */
117 res = 99; /* not correct */
120 fprintf(stderr, "running == %d, ret == %d\n", running, ret);
122 if (ret != CURLM_OK) {
132 fprintf(stderr, "curl_multi_fdset()\n");
133 if (curl_multi_fdset(m, &rd, &wr, &exc, &max_fd) != CURLM_OK) {
134 fprintf(stderr, "unexpected failured of fdset.\n");
138 rc = select_test(max_fd+1, &rd, &wr, &exc, &interval);
139 fprintf(stderr, "select returned %d\n", rc);
142 if (ml_timedout || mp_timedout) {
143 if (ml_timedout) fprintf(stderr, "ml_timedout\n");
144 if (mp_timedout) fprintf(stderr, "mp_timedout\n");
145 fprintf(stderr, "ABORTING TEST, since it seems "
146 "that it would have run forever.\n");
147 res = TEST_ERR_RUNS_FOREVER;
153 curl_multi_remove_handle(m, c);
154 curl_multi_cleanup(m);
156 curl_easy_cleanup(c);
157 curl_global_cleanup();