24 #ifdef HAVE_SYS_RESOURCE_H 25 #include <sys/resource.h> 38 #error "this test requires FD_SETSIZE" 41 #define SAFETY_MARGIN (16) 42 #define NUM_OPEN (FD_SETSIZE + 10) 43 #define NUM_NEEDED (NUM_OPEN + SAFETY_MARGIN) 45 #if defined(WIN32) || defined(_WIN32) || defined(MSDOS) 46 #define DEV_NULL "NUL" 48 #define DEV_NULL "/dev/null" 51 #if defined(HAVE_GETRLIMIT) && defined(HAVE_SETRLIMIT) 53 static int *fd = NULL;
54 static struct rlimit num_open;
55 static char msgbuff[256];
57 static void store_errmsg(
const char *msg,
int err)
60 snprintf(msgbuff,
sizeof(msgbuff),
"%s", msg);
62 snprintf(msgbuff,
sizeof(msgbuff),
"%s, errno %d, %s", msg,
66 static void close_file_descriptors(
void)
68 for(num_open.rlim_cur = 0;
69 num_open.rlim_cur < num_open.rlim_max;
71 if(fd[num_open.rlim_cur] > 0)
72 close(fd[num_open.rlim_cur]);
77 static int fopen_works(
void)
83 for(i = 0; i < 3; i++) {
86 for(i = 0; i < 3; i++) {
89 store_errmsg(
"fopen failed", errno);
90 fprintf(stderr,
"%s\n", msgbuff);
95 for(i = 0; i < 3; i++) {
102 static int rlimit(
int keep_open)
105 int *memchunk = NULL;
112 char fmt_lu[] =
"%lu";
114 char fmt_llu[] =
"%llu";
116 if(
sizeof(rl.rlim_max) >
sizeof(
long))
120 fmt = (
sizeof(rl.rlim_max) <
sizeof(
long))?fmt_u:fmt_lu;
124 if(getrlimit(RLIMIT_NOFILE, &rl) != 0) {
125 store_errmsg(
"getrlimit() failed", errno);
126 fprintf(stderr,
"%s\n", msgbuff);
133 if(rl.rlim_cur == RLIM_INFINITY)
134 strcpy(strbuff,
"INFINITY");
137 snprintf(strbuff,
sizeof(strbuff), fmt, rl.rlim_cur);
138 fprintf(stderr,
"initial soft limit: %s\n", strbuff);
141 if(rl.rlim_max == RLIM_INFINITY)
142 strcpy(strbuff,
"INFINITY");
145 snprintf(strbuff,
sizeof(strbuff), fmt, rl.rlim_max);
146 fprintf(stderr,
"initial hard limit: %s\n", strbuff);
150 fprintf(stderr,
"test518 FD_SETSIZE: %d\n", FD_SETSIZE);
163 if(rl.rlim_cur != rl.rlim_max) {
166 if((rl.rlim_cur > 0) &&
167 (rl.rlim_cur < OPEN_MAX)) {
168 fprintf(stderr,
"raising soft limit up to OPEN_MAX\n");
169 rl.rlim_cur = OPEN_MAX;
170 if(setrlimit(RLIMIT_NOFILE, &rl) != 0) {
172 store_errmsg(
"setrlimit() failed", errno);
173 fprintf(stderr,
"%s\n", msgbuff);
179 fprintf(stderr,
"raising soft limit up to hard limit\n");
180 rl.rlim_cur = rl.rlim_max;
181 if(setrlimit(RLIMIT_NOFILE, &rl) != 0) {
183 store_errmsg(
"setrlimit() failed", errno);
184 fprintf(stderr,
"%s\n", msgbuff);
190 if(getrlimit(RLIMIT_NOFILE, &rl) != 0) {
191 store_errmsg(
"getrlimit() failed", errno);
192 fprintf(stderr,
"%s\n", msgbuff);
199 if(rl.rlim_cur == RLIM_INFINITY)
200 strcpy(strbuff,
"INFINITY");
203 snprintf(strbuff,
sizeof(strbuff), fmt, rl.rlim_cur);
204 fprintf(stderr,
"current soft limit: %s\n", strbuff);
207 if(rl.rlim_max == RLIM_INFINITY)
208 strcpy(strbuff,
"INFINITY");
211 snprintf(strbuff,
sizeof(strbuff), fmt, rl.rlim_max);
212 fprintf(stderr,
"current hard limit: %s\n", strbuff);
233 if((rl.rlim_cur > 0) &&
235 (rl.rlim_cur != RLIM_INFINITY) &&
237 (rl.rlim_cur <= num_open.rlim_cur)) {
238 snprintf(strbuff2,
sizeof(strbuff2), fmt, rl.rlim_cur);
239 snprintf(strbuff1,
sizeof(strbuff1), fmt, num_open.rlim_cur);
240 snprintf(strbuff,
sizeof(strbuff),
"fds needed %s > system limit %s",
242 store_errmsg(strbuff, 0);
243 fprintf(stderr,
"%s\n", msgbuff);
256 for(nitems = i = 1; nitems <=
i; i *= 2)
261 num_open.rlim_max =
sizeof(*memchunk) * (
size_t)nitems;
262 snprintf(strbuff,
sizeof(strbuff), fmt, num_open.rlim_max);
263 fprintf(stderr,
"allocating memchunk %s byte array\n", strbuff);
264 memchunk =
malloc(
sizeof(*memchunk) * (
size_t)nitems);
266 fprintf(stderr,
"memchunk, malloc() failed\n");
269 }
while(nitems && !memchunk);
271 store_errmsg(
"memchunk, malloc() failed", errno);
272 fprintf(stderr,
"%s\n", msgbuff);
278 fprintf(stderr,
"initializing memchunk array\n");
280 for(i = 0; i < nitems; i++)
289 if((
size_t)(num_open.rlim_max) > ((
size_t)-1) /
sizeof(*fd)) {
290 snprintf(strbuff1,
sizeof(strbuff1), fmt, num_open.rlim_max);
291 snprintf(strbuff,
sizeof(strbuff),
"unable to allocate an array for %s " 292 "file descriptors, would overflow size_t", strbuff1);
293 store_errmsg(strbuff, 0);
294 fprintf(stderr,
"%s\n", msgbuff);
301 snprintf(strbuff,
sizeof(strbuff), fmt, num_open.rlim_max);
302 fprintf(stderr,
"allocating array for %s file descriptors\n", strbuff);
304 fd =
malloc(
sizeof(*fd) * (
size_t)(num_open.rlim_max));
306 store_errmsg(
"fd, malloc() failed", errno);
307 fprintf(stderr,
"%s\n", msgbuff);
314 fprintf(stderr,
"initializing fd array\n");
316 for(num_open.rlim_cur = 0;
317 num_open.rlim_cur < num_open.rlim_max;
319 fd[num_open.rlim_cur] = -1;
321 snprintf(strbuff,
sizeof(strbuff), fmt, num_open.rlim_max);
322 fprintf(stderr,
"trying to open %s file descriptors\n", strbuff);
329 store_errmsg(strbuff, errno);
330 fprintf(stderr,
"%s\n", msgbuff);
339 for(num_open.rlim_cur = 1;
340 num_open.rlim_cur < num_open.rlim_max;
341 num_open.rlim_cur++) {
343 fd[num_open.rlim_cur] = dup(fd[0]);
345 if(fd[num_open.rlim_cur] < 0) {
347 fd[num_open.rlim_cur] = -1;
349 snprintf(strbuff1,
sizeof(strbuff1), fmt, num_open.rlim_cur);
350 snprintf(strbuff,
sizeof(strbuff),
"dup() attempt %s failed", strbuff1);
351 fprintf(stderr,
"%s\n", strbuff);
353 snprintf(strbuff1,
sizeof(strbuff), fmt, num_open.rlim_cur);
354 snprintf(strbuff,
sizeof(strbuff),
"fds system limit seems close to %s",
356 fprintf(stderr,
"%s\n", strbuff);
360 snprintf(strbuff2,
sizeof(strbuff2), fmt, num_open.rlim_max);
361 snprintf(strbuff1,
sizeof(strbuff1), fmt, num_open.rlim_cur);
362 snprintf(strbuff,
sizeof(strbuff),
"fds needed %s > system limit %s",
364 store_errmsg(strbuff, 0);
365 fprintf(stderr,
"%s\n", msgbuff);
367 for(num_open.rlim_cur = 0;
368 fd[num_open.rlim_cur] >= 0;
370 close(fd[num_open.rlim_cur]);
380 snprintf(strbuff,
sizeof(strbuff), fmt, num_open.rlim_max);
381 fprintf(stderr,
"%s file descriptors open\n", strbuff);
383 #if !defined(HAVE_POLL_FINE) && \ 384 !defined(USE_WINSOCK) && \ 399 if(num_open.rlim_max > num_open.rlim_cur) {
400 snprintf(strbuff,
sizeof(strbuff),
"select limit is FD_SETSIZE %d",
402 store_errmsg(strbuff, 0);
403 fprintf(stderr,
"%s\n", msgbuff);
404 close_file_descriptors();
411 rl.rlim_cur < num_open.rlim_max;
413 if((fd[rl.rlim_cur] > 0) &&
414 ((
unsigned int)fd[rl.rlim_cur] > num_open.rlim_cur)) {
415 snprintf(strbuff,
sizeof(strbuff),
"select limit is FD_SETSIZE %d",
417 store_errmsg(strbuff, 0);
418 fprintf(stderr,
"%s\n", msgbuff);
419 close_file_descriptors();
437 snprintf(strbuff1,
sizeof(strbuff1), fmt, num_open.rlim_max);
439 "fopen fails with %s fds open()",
441 fprintf(stderr,
"%s\n", msgbuff);
443 "fopen fails with lots of fds open()");
444 store_errmsg(strbuff, 0);
445 close_file_descriptors();
458 close_file_descriptors();
469 if(!strcmp(URL,
"check")) {
472 fprintf(stdout,
"rlimit problem: %s\n", msgbuff);
487 fprintf(stderr,
"curl_global_init() failed\n");
488 close_file_descriptors();
494 fprintf(stderr,
"curl_easy_init() failed\n");
495 close_file_descriptors();
507 close_file_descriptors();
519 printf(
"system lacks necessary system function(s)");
#define test_setopt(A, B, C)
#define TEST_ERR_MAJOR_BAD
curl_easy_setopt expects a curl_off_t argument for this option curl_easy_setopt expects a curl_write_callback argument for this option curl_easy_setopt expects a curl_ioctl_callback argument for this option curl_easy_setopt expects a curl_opensocket_callback argument for this option curl_easy_setopt expects a curl_debug_callback argument for this option curl_easy_setopt expects a curl_conv_callback argument for this option curl_easy_setopt expects a private data pointer as argument for this option curl_easy_setopt expects a FILE *argument for this option curl_easy_setopt expects a struct curl_httppost *argument for this option curl_easy_setopt expects a struct curl_slist *argument for this option curl_easy_getinfo expects a pointer to char *for this info curl_easy_getinfo expects a pointer to double for this info curl_easy_getinfo expects a pointer to struct curl_tlssessioninfo *for this info curl_easy_getinfo expects a pointer to curl_socket_t for this info size_t
CURL_EXTERN CURL * curl_easy_init(void)
CURL_EXTERN void curl_easy_cleanup(CURL *curl)
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...
CURL_EXTERN void curl_global_cleanup(void)
curl_global_cleanup() globally cleanups curl, uses the value of "init_flags" to determine what needs ...
CURL_EXTERN CURLcode curl_easy_perform(CURL *curl)