summaryrefslogtreecommitdiffstats
path: root/src/responder/common
diff options
context:
space:
mode:
authorStephen Gallagher <sgallagh@redhat.com>2012-02-17 11:50:27 -0500
committerStephen Gallagher <sgallagh@redhat.com>2012-02-17 14:27:32 -0500
commit1a63155b0797c2b1963424e5c0f5d3a62f8cc7cc (patch)
tree3e2293986461fd191b07b8e2892ed45914d554de /src/responder/common
parent3ae9dd80a23168a0451f0d090bd74eaf01fdd951 (diff)
downloadsssd-1a63155b0797c2b1963424e5c0f5d3a62f8cc7cc.tar.gz
sssd-1a63155b0797c2b1963424e5c0f5d3a62f8cc7cc.tar.xz
sssd-1a63155b0797c2b1963424e5c0f5d3a62f8cc7cc.zip
RESPONDERS: Allow increasing the file-descriptor limit
This patch will increase the file descriptor limit to 8k or the limits.conf maximum, whichever is lesser. https://fedorahosted.org/sssd/ticket/1197
Diffstat (limited to 'src/responder/common')
-rw-r--r--src/responder/common/responder.h3
-rw-r--r--src/responder/common/responder_common.c36
2 files changed, 39 insertions, 0 deletions
diff --git a/src/responder/common/responder.h b/src/responder/common/responder.h
index 48678ff92..619ae46ef 100644
--- a/src/responder/common/responder.h
+++ b/src/responder/common/responder.h
@@ -25,6 +25,7 @@
#include <stdint.h>
#include <sys/un.h>
#include <pcre.h>
+#include <sys/resource.h>
#include "config.h"
#include "talloc.h"
#include "tevent.h"
@@ -266,4 +267,6 @@ sss_dp_get_account_recv(TALLOC_CTX *mem_ctx,
bool sss_utf8_check(const uint8_t *s, size_t n);
+void responder_set_fd_limit(rlim_t fd_limit);
+
#endif /* __SSS_RESPONDER_H__ */
diff --git a/src/responder/common/responder_common.c b/src/responder/common/responder_common.c
index a48ac556a..94a9fdb63 100644
--- a/src/responder/common/responder_common.c
+++ b/src/responder/common/responder_common.c
@@ -648,3 +648,39 @@ int responder_logrotate(DBusMessage *message,
return monitor_common_pong(message, conn);
}
+
+void responder_set_fd_limit(rlim_t fd_limit)
+{
+ struct rlimit current_limit, new_limit;
+ int limret;
+
+ /* First determine the maximum hard limit */
+ limret = getrlimit(RLIMIT_NOFILE, &current_limit);
+ if (limret == 0) {
+ DEBUG(SSSDBG_TRACE_INTERNAL,
+ ("Current fd limit: [%d]\n",
+ current_limit.rlim_cur));
+ /* Choose the lesser of the requested and the hard limit */
+ if (current_limit.rlim_max < fd_limit) {
+ new_limit.rlim_cur = current_limit.rlim_max;
+ } else {
+ new_limit.rlim_cur = fd_limit;
+ }
+ new_limit.rlim_max = current_limit.rlim_max;
+
+ limret = setrlimit(RLIMIT_NOFILE, &new_limit);
+ if (limret == 0) {
+ DEBUG(SSSDBG_CONF_SETTINGS,
+ ("Maximum file descriptors set to [%d]\n",
+ new_limit.rlim_cur));
+ } else {
+ DEBUG(SSSDBG_CRIT_FAILURE,
+ ("Could not set new fd limits. Proceeding with [%d]\n",
+ current_limit.rlim_cur));
+ }
+ } else {
+ DEBUG(SSSDBG_CRIT_FAILURE,
+ ("Could not determine fd limits. "
+ "Proceeding with system values\n"));
+ }
+}