From a494b1e1085547c1f1fb9429081bc2666b21fdc1 Mon Sep 17 00:00:00 2001 From: Philip Hazel Date: Mon, 18 Oct 2004 09:26:02 +0000 Subject: [PATCH] If setrlimit() barfs at 1000 file descriptors, try for 256 to accommodate those old OS for which this is the upper limit. --- doc/doc-txt/ChangeLog | 9 +++++++-- src/src/exim.c | 15 ++++++++++++--- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog index c27cbbef5..2283f726f 100644 --- a/doc/doc-txt/ChangeLog +++ b/doc/doc-txt/ChangeLog @@ -1,4 +1,4 @@ -$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.7 2004/10/18 09:16:57 ph10 Exp $ +$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.8 2004/10/18 09:26:02 ph10 Exp $ Change log file for Exim from version 4.21 ------------------------------------------- @@ -25,7 +25,12 @@ Exim version 4.44 now done for all such subprocesses. The other cases are: ${run, transport filters, and the commands run by the lmtp and pipe transports. - 5. Added CONFIGURE_GROUP build-time option. + 6. Added CONFIGURE_GROUP build-time option. + + 7. Some older OS have a limit of 256 on the maximum number of file + descriptors. Exim was using setrlimit() to set 1000 as a large value + unlikely to be exceeded. Change 4.43/17 caused a lot of logging on these + systems. I've change it so that if it can't get 1000, it tries for 256. Exim version 4.43 diff --git a/src/src/exim.c b/src/src/exim.c index bfdcbc6e0..dcf261879 100644 --- a/src/src/exim.c +++ b/src/src/exim.c @@ -1,4 +1,4 @@ -/* $Cambridge: exim/src/src/exim.c,v 1.3 2004/10/18 09:16:57 ph10 Exp $ */ +/* $Cambridge: exim/src/src/exim.c,v 1.4 2004/10/18 09:26:02 ph10 Exp $ */ /************************************************* * Exim - an Internet mail transport agent * @@ -2837,12 +2837,21 @@ else strerror(errno)); rlp.rlim_cur = rlp.rlim_max = 0; } + + /* I originally chose 1000 as a nice big number that was unlikely to + be exceeded. It turns out that some older OS have a fixed upper limit of + 256. */ + if (rlp.rlim_cur < 1000) { rlp.rlim_cur = rlp.rlim_max = 1000; if (setrlimit(RLIMIT_NOFILE, &rlp) < 0) - log_write(0, LOG_MAIN|LOG_PANIC, "setrlimit(RLIMIT_NOFILE) failed: %s", - strerror(errno)); + { + rlp.rlim_cur = rlp.rlim_max = 256; + if (setrlimit(RLIMIT_NOFILE, &rlp) < 0) + log_write(0, LOG_MAIN|LOG_PANIC, "setrlimit(RLIMIT_NOFILE) failed: %s", + strerror(errno)); + } } #endif -- 2.30.2