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
22 static CURLMcode perform(CURLM * multi)
26 fd_set fdread, fdwrite, fdexcep;
27 struct timeval mp_start;
28 char mp_timedout = FALSE;
31 mp_start = tutil_tvnow();
34 static struct timeval timeout = /* 100 ms */ { 0, 100000L };
37 code = curl_multi_perform(multi, &handles);
38 if (tutil_tvdiff(tutil_tvnow(), mp_start) >
39 MULTI_PERFORM_HANG_TIMEOUT) {
49 case CURLM_CALL_MULTI_PERFORM:
58 curl_multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd);
60 /* In a real-world program you OF COURSE check the return code of the
61 function calls. On success, the value of maxfd is guaranteed to be
62 greater or equal than -1. We call select(maxfd + 1, ...), specially in
63 case of (maxfd == -1), we call select(0, ...), which is basically equal
66 if (select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout) == -1)
67 return (CURLMcode) ~CURLM_OK;
70 /* We only reach this point if (mp_timedout) */
71 if (mp_timedout) fprintf(stderr, "mp_timedout\n");
72 fprintf(stderr, "ABORTING TEST, since it seems "
73 "that it would have run forever.\n");
74 return (CURLMcode) ~CURLM_OK;
83 if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
84 fprintf(stderr, "curl_global_init() failed\n");
85 return TEST_ERR_MAJOR_BAD;
88 if ((multi = curl_multi_init()) == NULL) {
89 fprintf(stderr, "curl_multi_init() failed\n");
90 curl_global_cleanup();
91 return TEST_ERR_MAJOR_BAD;
94 if ((easy = curl_easy_init()) == NULL) {
95 fprintf(stderr, "curl_easy_init() failed\n");
96 curl_multi_cleanup(multi);
97 curl_global_cleanup();
98 return TEST_ERR_MAJOR_BAD;
101 curl_multi_setopt(multi, CURLMOPT_PIPELINING, 1L);
103 test_setopt(easy, CURLOPT_WRITEFUNCTION, fwrite);
104 test_setopt(easy, CURLOPT_FAILONERROR, 1L);
105 test_setopt(easy, CURLOPT_URL, URL);
107 if (curl_multi_add_handle(multi, easy) != CURLM_OK) {
108 printf("curl_multi_add_handle() failed\n");
109 res = TEST_ERR_MAJOR_BAD;
111 if (perform(multi) != CURLM_OK)
112 printf("retrieve 1 failed\n");
114 curl_multi_remove_handle(multi, easy);
116 curl_easy_reset(easy);
118 test_setopt(easy, CURLOPT_FAILONERROR, 1L);
119 test_setopt(easy, CURLOPT_URL, libtest_arg2);
121 if (curl_multi_add_handle(multi, easy) != CURLM_OK) {
122 printf("curl_multi_add_handle() 2 failed\n");
123 res = TEST_ERR_MAJOR_BAD;
125 if (perform(multi) != CURLM_OK)
126 printf("retrieve 2 failed\n");
128 curl_multi_remove_handle(multi, easy);
133 curl_easy_cleanup(easy);
134 curl_multi_cleanup(multi);
135 curl_global_cleanup();
137 printf("Finished!\n");