lib586.c
Go to the documentation of this file.
1 /***************************************************************************
2  * _ _ ____ _
3  * Project ___| | | | _ \| |
4  * / __| | | | |_) | |
5  * | (__| |_| | _ <| |___
6  * \___|\___/|_| \_\_____|
7  *
8  * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
9  *
10  * This software is licensed as described in the file COPYING, which
11  * you should have received as part of this distribution. The terms
12  * are also available at https://curl.haxx.se/docs/copyright.html.
13  *
14  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15  * copies of the Software, and permit persons to whom the Software is
16  * furnished to do so, under the terms of the COPYING file.
17  *
18  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19  * KIND, either express or implied.
20  *
21  ***************************************************************************/
22 #include "test.h"
23 #include "memdebug.h"
24 
25 #define THREADS 2
26 
27 /* struct containing data of a thread */
28 struct Tdata {
29  CURLSH *share;
30  char *url;
31 };
32 
33 struct userdata {
34  const char *text;
35  int counter;
36 };
37 
38 /* lock callback */
39 static void my_lock(CURL *handle, curl_lock_data data,
40  curl_lock_access laccess, void *useptr)
41 {
42  const char *what;
43  struct userdata *user = (struct userdata *)useptr;
44 
45  (void)handle;
46  (void)laccess;
47 
48  switch(data) {
50  what = "share";
51  break;
52  case CURL_LOCK_DATA_DNS:
53  what = "dns";
54  break;
56  what = "cookie";
57  break;
59  what = "ssl_session";
60  break;
61  default:
62  fprintf(stderr, "lock: no such data: %d\n", (int)data);
63  return;
64  }
65  printf("lock: %-6s [%s]: %d\n", what, user->text, user->counter);
66  user->counter++;
67 }
68 
69 /* unlock callback */
70 static void my_unlock(CURL *handle, curl_lock_data data, void *useptr)
71 {
72  const char *what;
73  struct userdata *user = (struct userdata *)useptr;
74  (void)handle;
75  switch(data) {
77  what = "share";
78  break;
79  case CURL_LOCK_DATA_DNS:
80  what = "dns";
81  break;
83  what = "cookie";
84  break;
86  what = "ssl_session";
87  break;
88  default:
89  fprintf(stderr, "unlock: no such data: %d\n", (int)data);
90  return;
91  }
92  printf("unlock: %-6s [%s]: %d\n", what, user->text, user->counter);
93  user->counter++;
94 }
95 
96 /* the dummy thread function */
97 static void *fire(void *ptr)
98 {
99  CURLcode code;
100  struct Tdata *tdata = (struct Tdata*)ptr;
101  CURL *curl;
102  int i = 0;
103 
104  curl = curl_easy_init();
105  if(!curl) {
106  fprintf(stderr, "curl_easy_init() failed\n");
107  return NULL;
108  }
109 
110  curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
111  curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
112  curl_easy_setopt(curl, CURLOPT_URL, tdata->url);
113  printf("CURLOPT_SHARE\n");
114  curl_easy_setopt(curl, CURLOPT_SHARE, tdata->share);
115 
116  printf("PERFORM\n");
117  code = curl_easy_perform(curl);
118  if(code != CURLE_OK) {
119  fprintf(stderr, "perform url '%s' repeat %d failed, curlcode %d\n",
120  tdata->url, i, (int)code);
121  }
122 
123  printf("CLEANUP\n");
124  curl_easy_cleanup(curl);
125 
126  return NULL;
127 }
128 
129 /* test function */
130 int test(char *URL)
131 {
132  int res;
133  CURLSHcode scode = CURLSHE_OK;
134  char *url;
135  struct Tdata tdata;
136  CURL *curl;
137  CURLSH *share;
138  int i;
139  struct userdata user;
140 
141  user.text = "Pigs in space";
142  user.counter = 0;
143 
144  printf("GLOBAL_INIT\n");
146  fprintf(stderr, "curl_global_init() failed\n");
147  return TEST_ERR_MAJOR_BAD;
148  }
149 
150  /* prepare share */
151  printf("SHARE_INIT\n");
152  share = curl_share_init();
153  if(!share) {
154  fprintf(stderr, "curl_share_init() failed\n");
156  return TEST_ERR_MAJOR_BAD;
157  }
158 
159  if(CURLSHE_OK == scode) {
160  printf("CURLSHOPT_LOCKFUNC\n");
162  }
163  if(CURLSHE_OK == scode) {
164  printf("CURLSHOPT_UNLOCKFUNC\n");
166  }
167  if(CURLSHE_OK == scode) {
168  printf("CURLSHOPT_USERDATA\n");
169  scode = curl_share_setopt(share, CURLSHOPT_USERDATA, &user);
170  }
171  if(CURLSHE_OK == scode) {
172  printf("CURL_LOCK_DATA_SSL_SESSION\n");
173  scode = curl_share_setopt(share, CURLSHOPT_SHARE,
175  }
176 
177  if(CURLSHE_OK != scode) {
178  fprintf(stderr, "curl_share_setopt() failed\n");
179  curl_share_cleanup(share);
181  return TEST_ERR_MAJOR_BAD;
182  }
183 
184 
185  res = 0;
186 
187  /* start treads */
188  for(i = 1; i <= THREADS; i++) {
189 
190  /* set thread data */
191  tdata.url = URL;
192  tdata.share = share;
193 
194  /* simulate thread, direct call of "thread" function */
195  printf("*** run %d\n",i);
196  fire(&tdata);
197  }
198 
199 
200  /* fetch a another one */
201  printf("*** run %d\n", i);
202  curl = curl_easy_init();
203  if(!curl) {
204  fprintf(stderr, "curl_easy_init() failed\n");
205  curl_share_cleanup(share);
207  return TEST_ERR_MAJOR_BAD;
208  }
209 
210  url = URL;
211  test_setopt(curl, CURLOPT_URL, url);
212  printf("CURLOPT_SHARE\n");
213  test_setopt(curl, CURLOPT_SHARE, share);
214 
215  printf("PERFORM\n");
216  curl_easy_perform(curl);
217 
218  /* try to free share, expect to fail because share is in use*/
219  printf("try SHARE_CLEANUP...\n");
220  scode = curl_share_cleanup(share);
221  if(scode == CURLSHE_OK) {
222  fprintf(stderr, "curl_share_cleanup succeed but error expected\n");
223  share = NULL;
224  }
225  else {
226  printf("SHARE_CLEANUP failed, correct\n");
227  }
228 
229 test_cleanup:
230 
231  /* clean up last handle */
232  printf("CLEANUP\n");
233  curl_easy_cleanup(curl);
234 
235  /* free share */
236  printf("SHARE_CLEANUP\n");
237  scode = curl_share_cleanup(share);
238  if(scode != CURLSHE_OK)
239  fprintf(stderr, "curl_share_cleanup failed, code errno %d\n",
240  (int)scode);
241 
242  printf("GLOBAL_CLEANUP\n");
244 
245  return res;
246 }
247 
#define test_setopt(A, B, C)
Definition: test.h:47
UNITTEST_START char * ptr
Definition: unit1330.c:38
CURLcode
Definition: curl.h:454
CURL_EXTERN CURLSH * curl_share_init(void)
Definition: share.c:35
Definition: lib506.c:30
static int res
const char * text
Definition: lib506.c:36
CURL_EXTERN CURLSHcode curl_share_cleanup(CURLSH *)
#define curl_easy_setopt(handle, option, value)
Definition: typecheck-gcc.h:41
unsigned int i
Definition: unit1303.c:79
#define THREADS
Definition: lib586.c:25
#define TEST_ERR_MAJOR_BAD
Definition: test.h:85
static int counter[MAX_EASY_HANDLES]
static void my_lock(CURL *handle, curl_lock_data data, curl_lock_access laccess, void *useptr)
Definition: lib586.c:39
static void * fire(void *ptr)
Definition: lib586.c:97
CURLSHcode
Definition: curl.h:2561
#define printf
Definition: curl_printf.h:40
CURL_EXTERN CURL * curl_easy_init(void)
Definition: easy.c:343
CURL_EXTERN void curl_easy_cleanup(CURL *curl)
void CURLSH
Definition: curl.h:103
CURLSH * share
Definition: lib506.c:31
curl_lock_access
Definition: curl.h:2545
Definition: curl.h:455
int test(char *URL)
Definition: lib586.c:130
CURL_EXTERN CURLcode curl_global_init(long flags)
curl_global_init() globally initializes curl given a bitwise set of the different features of what to...
Definition: easy.c:271
void CURL
Definition: curl.h:102
int counter
Definition: lib506.c:37
curl_lock_data
Definition: curl.h:2530
#define fprintf
Definition: curl_printf.h:41
CURL_EXTERN void curl_global_cleanup(void)
curl_global_cleanup() globally cleanups curl, uses the value of "init_flags" to determine what needs ...
Definition: easy.c:312
#define CURL_GLOBAL_ALL
Definition: curl.h:2519
#define curl_share_setopt(share, opt, param)
static CURL * curl
Definition: sessioninfo.c:35
char * url
Definition: lib506.c:32
Definition: debug.c:29
CURL_EXTERN CURLcode curl_easy_perform(CURL *curl)
static void my_unlock(CURL *handle, curl_lock_data data, void *useptr)
Definition: lib586.c:70


rc_tagdetect_client
Author(s): Monika Florek-Jasinska , Raphael Schaller
autogenerated on Sat Feb 13 2021 03:42:15