Call curl_global_cleanup() in all code paths before exiting test
[platform/upstream/curl.git] / tests / libtest / lib530.c
1 /*****************************************************************************
2  *                                  _   _ ____  _
3  *  Project                     ___| | | |  _ \| |
4  *                             / __| | | | |_) | |
5  *                            | (__| |_| |  _ <| |___
6  *                             \___|\___/|_| \_\_____|
7  *
8  * $Id$
9  */
10
11 #include "test.h"
12
13 #include <sys/types.h>
14 #include <sys/stat.h>
15
16 #define NUM_HANDLES 4
17
18 int test(char *URL)
19 {
20   int res = 0;
21   CURL *curl[NUM_HANDLES];
22   int running;
23   char done=FALSE;
24   CURLM *m;
25   int i;
26
27   /* In windows, this will init the winsock stuff */
28   curl_global_init(CURL_GLOBAL_ALL);
29
30   m = curl_multi_init();
31
32   /* get NUM_HANDLES easy handles */
33   for(i=0; i < NUM_HANDLES; i++) {
34     curl[i] = curl_easy_init();
35     if(!curl[i]) {
36       curl_global_cleanup();
37       return 100 + i; /* major bad */
38     }
39     curl_easy_setopt(curl[i], CURLOPT_URL, URL);
40
41     /* go verbose */
42     curl_easy_setopt(curl[i], CURLOPT_VERBOSE, 1);
43
44     /* include headers */
45     curl_easy_setopt(curl[i], CURLOPT_HEADER, 1);
46
47     res = (int)curl_multi_add_handle(m, curl[i]);
48   }
49
50   curl_multi_setopt(m, CURLMOPT_PIPELINING, 1);
51
52   fprintf(stderr, "Start at URL 0\n");
53
54   while(!done) {
55     fd_set rd, wr, exc;
56     int max_fd;
57     struct timeval interval;
58
59     interval.tv_sec = 1;
60     interval.tv_usec = 0;
61
62     while (res == CURLM_CALL_MULTI_PERFORM) {
63       res = (int)curl_multi_perform(m, &running);
64       if (running <= 0) {
65         done = TRUE; /* bail out */
66         break;
67       }
68     }
69     if(done)
70       break;
71
72     if (res != CURLM_OK) {
73       fprintf(stderr, "not okay???\n");
74       break;
75     }
76
77     FD_ZERO(&rd);
78     FD_ZERO(&wr);
79     FD_ZERO(&exc);
80     max_fd = 0;
81
82     if (curl_multi_fdset(m, &rd, &wr, &exc, &max_fd) != CURLM_OK) {
83       fprintf(stderr, "unexpected failured of fdset.\n");
84       res = 189;
85       break;
86     }
87
88     if (select_test(max_fd+1, &rd, &wr, &exc, &interval) == -1) {
89       fprintf(stderr, "bad select??\n");
90       res = 195;
91       break;
92     }
93
94     res = CURLM_CALL_MULTI_PERFORM;
95   }
96
97   /* get NUM_HANDLES easy handles */
98   for(i=0; i < NUM_HANDLES; i++) {
99     curl_multi_remove_handle(m, curl[i]);
100     curl_easy_cleanup(curl[i]);
101   }
102
103   curl_multi_cleanup(m);
104
105   curl_global_cleanup();
106   return res;
107 }