Commit a4e1ac79 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

David Phillips fix for test 518 and my extension to make it not run on

systems that can't run it fine.
parent f84d2b4d
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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.
+4 −1
Original line number Diff line number Diff line
@@ -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
+1 −0
Original line number Diff line number Diff line
@@ -85,6 +85,7 @@ SSL
netrc_debug
large_file
idn
getrlimit
</features>

<killserver>
+10 −4
Original line number Diff line number Diff line
@@ -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>
+63 −6
Original line number Diff line number Diff line
#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;

  /* 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;
  }

  /* open a lot of file descriptors */
  for (i = 0; i < NUM_OPEN; i++) {
    fd[i] = open(DEV_NULL, O_RDONLY);
  /* 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
Loading