1 /*****************************************************************************
3 * Project ___| | | | _ \| |
5 * | (__| |_| | _ <| |___
6 * \___|\___/|_| \_\_____|
8 * $Id: lib507.c,v 1.1.1.1 2008-09-23 16:32:06 hoffman Exp $
15 #define MAIN_LOOP_HANG_TIMEOUT 90 * 1000
16 #define MULTI_PERFORM_HANG_TIMEOUT 60 * 1000
26 struct timeval ml_start
;
27 struct timeval mp_start
;
28 char ml_timedout
= FALSE
;
29 char mp_timedout
= FALSE
;
31 if (curl_global_init(CURL_GLOBAL_ALL
) != CURLE_OK
) {
32 fprintf(stderr
, "curl_global_init() failed\n");
33 return TEST_ERR_MAJOR_BAD
;
36 if ((multi
= curl_multi_init()) == NULL
) {
37 fprintf(stderr
, "curl_multi_init() failed\n");
38 curl_global_cleanup();
39 return TEST_ERR_MAJOR_BAD
;
42 if ((curls
= curl_easy_init()) == NULL
) {
43 fprintf(stderr
, "curl_easy_init() failed\n");
44 curl_multi_cleanup(multi
);
45 curl_global_cleanup();
46 return TEST_ERR_MAJOR_BAD
;
49 curl_easy_setopt(curls
, CURLOPT_URL
, URL
);
51 if ((res
= curl_multi_add_handle(multi
, curls
)) != CURLM_OK
) {
52 fprintf(stderr
, "curl_multi_add_handle() failed, "
53 "with code %d\n", res
);
54 curl_easy_cleanup(curls
);
55 curl_multi_cleanup(multi
);
56 curl_global_cleanup();
57 return TEST_ERR_MAJOR_BAD
;
61 mp_start
= tutil_tvnow();
64 res
= curl_multi_perform(multi
, &still_running
);
65 if (tutil_tvdiff(tutil_tvnow(), mp_start
) >
66 MULTI_PERFORM_HANG_TIMEOUT
) {
70 } while (res
== CURLM_CALL_MULTI_PERFORM
);
73 ml_start
= tutil_tvnow();
75 while ((!ml_timedout
) && (!mp_timedout
) && (still_running
)) {
76 struct timeval timeout
;
89 if (tutil_tvdiff(tutil_tvnow(), ml_start
) >
90 MAIN_LOOP_HANG_TIMEOUT
) {
95 curl_multi_fdset(multi
, &fdread
, &fdwrite
, &fdexcep
, &maxfd
);
96 rc
= select_test(maxfd
+1, &fdread
, &fdwrite
, &fdexcep
, &timeout
);
103 mp_start
= tutil_tvnow();
105 res
= curl_multi_perform(multi
, &still_running
);
106 if (tutil_tvdiff(tutil_tvnow(), mp_start
) >
107 MULTI_PERFORM_HANG_TIMEOUT
) {
111 } while (res
== CURLM_CALL_MULTI_PERFORM
);
115 if (ml_timedout
|| mp_timedout
) {
116 if (ml_timedout
) fprintf(stderr
, "ml_timedout\n");
117 if (mp_timedout
) fprintf(stderr
, "mp_timedout\n");
118 fprintf(stderr
, "ABORTING TEST, since it seems "
119 "that it would have run forever.\n");
120 i
= TEST_ERR_RUNS_FOREVER
;
123 msg
= curl_multi_info_read(multi
, &still_running
);
125 /* this should now contain a result code from the easy handle,
127 i
= msg
->data
.result
;
130 curl_multi_cleanup(multi
);
131 curl_easy_cleanup(curls
);
132 curl_global_cleanup();
134 return i
; /* return the final return code */