David Phillips fix for test 518 and my extension to make it not run on
systems that can't run it fine.
This commit is contained in:
parent
f84d2b4d36
commit
a4e1ac7952
5
CHANGES
5
CHANGES
@ -6,6 +6,11 @@
|
||||
|
||||
Changelog
|
||||
|
||||
Daniel (22 November 2004)
|
||||
- David Phillips enhanced test 518. I made it depend on a "feature" so that
|
||||
systems without getrlimit() won't attempt to test 518. configure now checks
|
||||
for getrlimit() and setrlimit() for this test case.
|
||||
|
||||
Daniel (18 November 2004)
|
||||
- David Phillips fixed libcurl to not crash anymore when more than FD_SETSIZE
|
||||
file descriptors are in use. Test case 518 added to verify.
|
||||
|
@ -1138,6 +1138,7 @@ AC_CHECK_HEADERS(
|
||||
utime.h \
|
||||
sys/utime.h \
|
||||
sys/poll.h \
|
||||
sys/resource.h \
|
||||
libgen.h \
|
||||
locale.h \
|
||||
setjmp.h,
|
||||
@ -1240,7 +1241,9 @@ AC_CHECK_FUNCS( strtoll \
|
||||
setlocale \
|
||||
ftruncate \
|
||||
pipe \
|
||||
poll,
|
||||
poll \
|
||||
getrlimit \
|
||||
setrlimit,
|
||||
dnl if found
|
||||
[],
|
||||
dnl if not found, $ac_func is the name we check for
|
||||
|
@ -85,6 +85,7 @@ SSL
|
||||
netrc_debug
|
||||
large_file
|
||||
idn
|
||||
getrlimit
|
||||
</features>
|
||||
|
||||
<killserver>
|
||||
|
@ -22,6 +22,9 @@ Funny-head: yesyes
|
||||
<server>
|
||||
http
|
||||
</server>
|
||||
<features>
|
||||
getrlimit
|
||||
</features>
|
||||
# tool is what to use instead of 'curl'
|
||||
<tool>
|
||||
lib518
|
||||
@ -38,8 +41,11 @@ http://%HOSTIP:%HTTPPORT/518
|
||||
#
|
||||
# Verify data after the test has been "shot"
|
||||
<verify>
|
||||
# CURLE_FAILED_INIT (2)
|
||||
<errorcode>
|
||||
2
|
||||
</errorcode>
|
||||
<protocol>
|
||||
GET /518 HTTP/1.1
|
||||
Host: 127.0.0.1:%HTTPPORT
|
||||
Pragma: no-cache
|
||||
Accept: */*
|
||||
|
||||
</protocol>
|
||||
</verify>
|
||||
|
@ -1,8 +1,23 @@
|
||||
#include "test.h"
|
||||
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_STAT_H
|
||||
#include <sys/stat.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_RESOURCE_H
|
||||
#include <sys/resource.h>
|
||||
#endif
|
||||
#ifdef HAVE_FCNTL_H
|
||||
#include <fcntl.h>
|
||||
#endif
|
||||
#ifdef UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include <mprintf.h>
|
||||
|
||||
@ -15,6 +30,7 @@
|
||||
#endif
|
||||
|
||||
#define NUM_OPEN (FD_SETSIZE + 10)
|
||||
#define NUM_NEEDED (NUM_OPEN + 16)
|
||||
|
||||
#if defined(WIN32) || defined(_WIN32) || defined(MSDOS)
|
||||
#define DEV_NULL "NUL"
|
||||
@ -22,24 +38,56 @@
|
||||
#define DEV_NULL "/dev/null"
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_GETRLIMIT) && defined(HAVE_SETRLIMIT)
|
||||
int test(char *URL)
|
||||
{
|
||||
CURLcode res;
|
||||
CURL *curl;
|
||||
struct rlimit rl;
|
||||
int fd[NUM_OPEN];
|
||||
int i;
|
||||
CURLcode res;
|
||||
CURL *curl;
|
||||
|
||||
/* open a lot of file descriptors */
|
||||
for (i = 0; i < NUM_OPEN; i++) {
|
||||
fd[i] = open(DEV_NULL, O_RDONLY);
|
||||
/* get open file limits */
|
||||
if (getrlimit(RLIMIT_NOFILE, &rl) == -1) {
|
||||
fprintf(stderr, "warning: getrlimit: failed to get RLIMIT_NOFILE\n");
|
||||
goto skip_open;
|
||||
}
|
||||
|
||||
/* check that hard limit is high enough */
|
||||
if (rl.rlim_max < NUM_NEEDED) {
|
||||
fprintf(stderr, "warning: RLIMIT_NOFILE hard limit is too low\n");
|
||||
goto skip_open;
|
||||
}
|
||||
|
||||
/* increase soft limit if needed */
|
||||
if (rl.rlim_cur < NUM_NEEDED) {
|
||||
rl.rlim_cur = NUM_NEEDED;
|
||||
if (setrlimit(RLIMIT_NOFILE, &rl) == -1) {
|
||||
fprintf(stderr, "warning: setrlimit: failed to set RLIMIT_NOFILE\n");
|
||||
goto skip_open;
|
||||
}
|
||||
}
|
||||
|
||||
/* open a dummy descriptor */
|
||||
fd[0] = open(DEV_NULL, O_RDONLY);
|
||||
if (fd[0] == -1) {
|
||||
fprintf(stderr, "open: failed to open %s\n", DEV_NULL);
|
||||
return CURLE_FAILED_INIT;
|
||||
}
|
||||
|
||||
/* create a bunch of file descriptors */
|
||||
for (i = 1; i < NUM_OPEN; i++) {
|
||||
fd[i] = dup(fd[0]);
|
||||
if (fd[i] == -1) {
|
||||
fprintf(stderr, "open: attempt #%i: failed to open %s\n", i, DEV_NULL);
|
||||
fprintf(stderr, "dup: attempt #%i failed\n", i);
|
||||
for (i--; i >= 0; i--)
|
||||
close(fd[i]);
|
||||
return CURLE_FAILED_INIT;
|
||||
}
|
||||
}
|
||||
|
||||
skip_open:
|
||||
|
||||
curl = curl_easy_init();
|
||||
curl_easy_setopt(curl, CURLOPT_URL, URL);
|
||||
curl_easy_setopt(curl, CURLOPT_HEADER, TRUE);
|
||||
@ -51,3 +99,12 @@ int test(char *URL)
|
||||
|
||||
return (int)res;
|
||||
}
|
||||
#else
|
||||
/* system lacks getrlimit() and/or setrlimit() */
|
||||
int test(char *URL)
|
||||
{
|
||||
(void)URL;
|
||||
fprintf(stderr, "system lacks necessary system function(s)");
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
@ -95,6 +95,7 @@ my $gdb = checkcmd("gdb");
|
||||
my $ssl_version; # set if libcurl is built with SSL support
|
||||
my $large_file; # set if libcurl is built with large file support
|
||||
my $has_idn; # set if libcurl is built with IDN support
|
||||
my $has_getrlimit; # set if system has getrlimit()
|
||||
|
||||
my $skipped=0; # number of tests skipped; reported in main loop
|
||||
my %skipped; # skipped{reason}=counter, reasons for skip
|
||||
@ -763,6 +764,16 @@ sub checkcurl {
|
||||
die "couldn't run '$CURL'"
|
||||
}
|
||||
|
||||
if(-r "../lib/config.h") {
|
||||
open(CONF, "<../lib/config.h");
|
||||
while(<CONF>) {
|
||||
if($_ =~ /^\#define HAVE_GETRLIMIT/) {
|
||||
$has_getrlimit = 1;
|
||||
}
|
||||
}
|
||||
close(CONF);
|
||||
}
|
||||
|
||||
if(!$curl_debug && $torture) {
|
||||
die "can't run torture tests since curl was not build with debug";
|
||||
}
|
||||
@ -862,6 +873,11 @@ sub singletest {
|
||||
next;
|
||||
}
|
||||
}
|
||||
elsif($f eq "getrlimit") {
|
||||
if($has_getrlimit) {
|
||||
next;
|
||||
}
|
||||
}
|
||||
|
||||
$why = "curl lacks $f support";
|
||||
$serverproblem = 15; # set it here
|
||||
|
Loading…
Reference in New Issue
Block a user