diff options
| author | Daniel Stenberg <daniel@haxx.se> | 2004-11-22 22:26:46 +0000 | 
|---|---|---|
| committer | Daniel Stenberg <daniel@haxx.se> | 2004-11-22 22:26:46 +0000 | 
| commit | a4e1ac79527d8ac3552d96a00e5f2966123d0374 (patch) | |
| tree | 4bda84d4225040f278e7e59a182810dd1152b214 | |
| parent | f84d2b4d361412e3c0a49369ec0299c9e618d4ac (diff) | |
David Phillips fix for test 518 and my extension to make it not run on
systems that can't run it fine.
| -rw-r--r-- | CHANGES | 5 | ||||
| -rw-r--r-- | configure.ac | 5 | ||||
| -rw-r--r-- | tests/FILEFORMAT | 1 | ||||
| -rw-r--r-- | tests/data/test518 | 14 | ||||
| -rw-r--r-- | tests/libtest/lib518.c | 69 | ||||
| -rwxr-xr-x | tests/runtests.pl | 16 | 
6 files changed, 99 insertions, 11 deletions
@@ -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  </features>  <killserver> 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  <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> 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 <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 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(<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  | 
