David Phillips fix for test 518 and my extension to make it not run on
authorDaniel Stenberg <daniel@haxx.se>
Mon, 22 Nov 2004 22:26:46 +0000 (22:26 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 22 Nov 2004 22:26:46 +0000 (22:26 +0000)
systems that can't run it fine.

CHANGES
configure.ac
tests/FILEFORMAT
tests/data/test518
tests/libtest/lib518.c
tests/runtests.pl

diff --git a/CHANGES b/CHANGES
index 7569b25..f15dca1 100644 (file)
--- 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.
index 1021cee..019bce2 100644 (file)
@@ -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
index 3fd5fb8..2f9238a 100644 (file)
@@ -85,6 +85,7 @@ SSL
 netrc_debug
 large_file
 idn
+getrlimit
 </features>
 
 <killserver>
index 3c0c637..4576919 100644 (file)
@@ -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\r
+Host: 127.0.0.1:%HTTPPORT\r
+Pragma: no-cache\r
+Accept: */*\r
+\r
+</protocol>
 </verify>
index e981e00..86ee23a 100644 (file)
@@ -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"
 #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
index c6384cf..3b46d2a 100755 (executable)
@@ -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