Commit a0eb9022 authored by Nick Mathewson's avatar Nick Mathewson 🦀
Browse files

r17507@catbus: nickm | 2008-01-07 15:03:24 -0500

 Backport r12341: If setting our rlimit to rlim_max or cap fails, fall back to OPEN_FILES if defiled.  This makes Tor run on OSX 10.5, while allowing OSX to mend its ways in the future.


svn:r13060
parent 75299426
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -490,7 +490,7 @@ AC_CHECK_HEADERS(zlib.h, , AC_MSG_ERROR(Zlib header (zlib.h) not found. Tor requ

dnl These headers are not essential

AC_CHECK_HEADERS(stdint.h sys/types.h inttypes.h sys/param.h sys/wait.h limits.h sys/limits.h netinet/in.h arpa/inet.h machine/limits.h syslog.h sys/time.h sys/resource.h inttypes.h utime.h sys/utime.h sys/mman.h netintet/in.h netinet/in6.h)
AC_CHECK_HEADERS(stdint.h sys/types.h inttypes.h sys/param.h sys/wait.h limits.h sys/limits.h netinet/in.h arpa/inet.h machine/limits.h syslog.h sys/time.h sys/resource.h inttypes.h utime.h sys/utime.h sys/mman.h netintet/in.h netinet/in6.h sys/syslimits.h)

AC_CHECK_HEADERS(net/if.h, [net_if_found=1], [net_if_found=0],
[#ifdef HAVE_SYS_TYPES_H
+1 −1
Original line number Diff line number Diff line
@@ -10,7 +10,7 @@ Backport items for 0.1.2:
  X no need to backport the windows privoxy.config changes because they're
    not in SVN??
  o r12339: rlim_t may be wider than unsigned long.
  - r12341: Work if the real open-file limit is OPEN_FILES.
  o r12341: Work if the real open-file limit is OPEN_FILES.
  o r12459: Exit policies reject public IP address too

Backport for 0.1.2.x once better tested:
+30 −3
Original line number Diff line number Diff line
@@ -94,6 +94,9 @@ const char compat_c_id[] =
#ifdef HAVE_SYS_MMAN_H
#include <sys/mman.h>
#endif
#ifdef HAVE_SYS_SYSLIMITS_H
#include <sys/syslimits.h>
#endif

#ifdef USE_BSOCKETS
#include <bsocket.h>
@@ -653,10 +656,34 @@ set_max_file_descriptors(unsigned long limit, unsigned long cap)
  }
  rlim.rlim_cur = most;
  if (setrlimit(RLIMIT_NOFILE, &rlim) != 0) {
    log_warn(LD_CONFIG, "Could not set maximum number of file descriptors: %s",
    int bad = 1;
#ifdef OPEN_MAX
    if (errno == EINVAL && OPEN_MAX < rlim.rlim_cur) {
      /* On some platforms, OPEN_MAX is the real limit, and getrlimit() is
       * full of nasty lies.  I'm looking at you, OSX 10.5.... */
      rlim.rlim_cur = OPEN_MAX;
      if (setrlimit(RLIMIT_NOFILE, &rlim) == 0) {
        if (rlim.rlim_cur < limit) {
          log_warn(LD_CONFIG, "We are limited to %lu file descriptors by "
                 "OPEN_MAX, and ConnLimit is %lu.  Changing ConnLimit; sorry.",
                   (unsigned long)OPEN_MAX, limit);
        } else {
          log_info(LD_CONFIG, "Dropped connection limit to OPEN_MAX (%lu); "
                   "Apparently, %lu was too high and rlimit lied to us.",
                  (unsigned long)OPEN_MAX, (unsigned long)most);
        }
        most = rlim.rlim_cur;
        bad = 0;
      }
    }
#endif
    if (bad) {
      log_warn(LD_CONFIG,
               "Couldn't set maximum number of file descriptors: %s",
               strerror(errno));
      return -1;
    }
  }
  /* leave some overhead for logs, etc, */
  limit = most;
#endif