Commit 199d65d0 authored by Nick Mathewson's avatar Nick Mathewson 🦀
Browse files

r18927@catbus: nickm | 2008-03-18 11:11:49 -0400

 Combine common code in set_max_file_descriptors(): all that varies from platform to platform in the no-getrlimit() case is the connection limit and the platform name.


svn:r14101
parent fba25996
Loading
Loading
Loading
Loading
+20 −31
Original line number Diff line number Diff line
@@ -765,47 +765,36 @@ tor_socketpair(int family, int type, int protocol, int fd[2])
int
set_max_file_descriptors(rlim_t limit, int *max_out)
{
#define DEFAULT_MAX_CONNECTIONS 15000
#define CYGWIN_MAX_CONNECTIONS 3200
#define IPHONE_MAX_CONNECTIONS 9999
  /* Define some maximum connections values for systems where we cannot
   * automatically determine a limit. Re Cygwin, see
   * http://archives.seul.org/or/talk/Aug-2006/msg00210.html
   * For an iPhone, 9999 should work. For Windows and all other unknown
   * systems we use 15000 as the default. */
#ifndef HAVE_GETRLIMIT
#if defined(CYGWIN) || defined(__CYGWIN__)
  const char *platform = "Cygwin";
  const unsigned long MAX_CONNECTIONS = 3200;
#elif defined(IPHONE)
  const char *platform = "iPhone";
  const unsigned long MAX_CONNECTIONS = 9999;
#elif defined(MS_WINDOWS)
  const char *platform = "Windows";
  const unsigned long MAX_CONNECTIONS = 15000;
#else
  const char *platform = "unknown platforms with no getrlimit()";
  const unsigned long MAX_CONNECTIONS = 15000;
#endif
  log_fn(LOG_INFO, LD_NET,
         "This platform is missing getrlimit(). Proceeding.");
#ifdef MS_WINDOWS
  if (limit > DEFAULT_MAX_CONNECTIONS) {
  if (limit > MAX_CONNECTIONS) {
    log_warn(LD_CONFIG,
             "We do not support more than %lu file descriptors "
             "on Windows. Tried to raise to %lu.",
             (unsigned long)DEFAULT_MAX_CONNECTIONS, (unsigned long)limit);
    return -1;
  }
  limit = DEFAULT_MAX_CONNECTIONS;
#elif defined(CYGWIN) || defined(__CYGWIN__)
  if (limit > CYGWIN_MAX_CONNECTIONS) {
    log_warn(LD_CONFIG, "We do not support more than %lu file descriptors "
             "when using Cygwin. Tried to raise to %lu.",
             (unsigned long)CYGWIN_MAX_CONNECTIONS, (unsigned long)limit);
             "on %s. Tried to raise to %lu.",
             (unsigned long)MAX_CONNECTIONS, platform, (unsigned long)limit);
    return -1;
  }
  limit = CYGWIN_MAX_CONNECTIONS;
#elif defined(IPHONE)
  if (limit > IPHONE_MAX_CONNECTIONS) {
    log_warn(LD_CONFIG, "We do not support more than %lu file descriptors "
             "on iPhone. Tried to raise to %lu.",
             (unsigned long)IPHONE_MAX_CONNECTIONS, (unsigned long)limit);
    return -1;
  }
  limit = IPHONE_MAX_CONNECTIONS;
#else
  /* Unknown system without getrlimit support. Use the default value.*/
  limit = DEFAULT_MAX_CONNECTIONS;
#endif
#else
  limit = MAX_CONNECTIONS;
#else /* HAVE_GETRLIMIT */
  struct rlimit rlim;
  tor_assert(limit > 0);

@@ -848,7 +837,7 @@ set_max_file_descriptors(rlim_t limit, int *max_out)
        bad = 0;
      }
    }
#endif
#endif /* OPEN_MAX */
    if (bad) {
      log_warn(LD_CONFIG,"Couldn't set maximum number of file descriptors: %s",
               strerror(errno));
@@ -857,7 +846,7 @@ set_max_file_descriptors(rlim_t limit, int *max_out)
  }
  /* leave some overhead for logs, etc, */
  limit = rlim.rlim_cur;
#endif
#endif /* HAVE_GETRLIMIT */

  if (limit < ULIMIT_BUFFER) {
    log_warn(LD_CONFIG,