|
@@ -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>
|
|
@@ -710,10 +713,34 @@ set_max_file_descriptors(unsigned long limit, unsigned long cap)
|
|
|
(unsigned long)rlim.rlim_cur, (unsigned long)most);
|
|
|
}
|
|
|
rlim.rlim_cur = most;
|
|
|
+
|
|
|
if (setrlimit(RLIMIT_NOFILE, &rlim) != 0) {
|
|
|
- log_warn(LD_CONFIG, "Could not set maximum number of file descriptors: %s",
|
|
|
- strerror(errno));
|
|
|
- return -1;
|
|
|
+ int bad = 1;
|
|
|
+#ifdef OPEN_MAX
|
|
|
+ if (errno == EINVAL && OPEN_MAX < rlim.rlim_cur) {
|
|
|
+
|
|
|
+ * 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;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
limit = most;
|