From a4e1ac79527d8ac3552d96a00e5f2966123d0374 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Mon, 22 Nov 2004 22:26:46 +0000 Subject: David Phillips fix for test 518 and my extension to make it not run on systems that can't run it fine. --- CHANGES | 5 ++++ configure.ac | 5 +++- tests/FILEFORMAT | 1 + tests/data/test518 | 14 +++++++--- tests/libtest/lib518.c | 69 +++++++++++++++++++++++++++++++++++++++++++++----- tests/runtests.pl | 16 ++++++++++++ 6 files changed, 99 insertions(+), 11 deletions(-) diff --git a/CHANGES b/CHANGES index 7569b25dc..f15dca136 100644 --- a/CHANGES +++ b/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. diff --git a/configure.ac b/configure.ac index 1021ceeff..019bce231 100644 --- a/configure.ac +++ b/configure.ac @@ -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 diff --git a/tests/FILEFORMAT b/tests/FILEFORMAT index 3fd5fb82e..2f9238ad5 100644 --- a/tests/FILEFORMAT +++ b/tests/FILEFORMAT @@ -85,6 +85,7 @@ SSL netrc_debug large_file idn +getrlimit diff --git a/tests/data/test518 b/tests/data/test518 index 3c0c63777..457691938 100644 --- a/tests/data/test518 +++ b/tests/data/test518 @@ -22,6 +22,9 @@ Funny-head: yesyes http + +getrlimit + # tool is what to use instead of 'curl' lib518 @@ -38,8 +41,11 @@ http://%HOSTIP:%HTTPPORT/518 # # Verify data after the test has been "shot" -# CURLE_FAILED_INIT (2) - -2 - + +GET /518 HTTP/1.1 +Host: 127.0.0.1:%HTTPPORT +Pragma: no-cache +Accept: */* + + diff --git a/tests/libtest/lib518.c b/tests/libtest/lib518.c index e981e0080..86ee23ad7 100644 --- a/tests/libtest/lib518.c +++ b/tests/libtest/lib518.c @@ -1,8 +1,23 @@ #include "test.h" +#ifdef HAVE_SYS_TYPES_H #include +#endif +#ifdef HAVE_SYS_STAT_H #include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_SYS_RESOURCE_H +#include +#endif +#ifdef HAVE_FCNTL_H #include +#endif +#ifdef UNISTD_H +#include +#endif #include @@ -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 diff --git a/tests/runtests.pl b/tests/runtests.pl index c6384cf32..3b46d2a26 100755 --- a/tests/runtests.pl +++ b/tests/runtests.pl @@ -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() { + 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 -- cgit v1.2.3