diff --git a/src/shared/rlimit-util.c b/src/shared/rlimit-util.c index c133f84b7e..74b3a023f1 100644 --- a/src/shared/rlimit-util.c +++ b/src/shared/rlimit-util.c @@ -389,3 +389,22 @@ int rlimit_nofile_bump(int limit) { return 0; } + +int rlimit_nofile_safe(void) { + struct rlimit rl; + + /* Resets RLIMIT_NOFILE's soft limit FD_SETSIZE (i.e. 1024), for compatibility with software still using + * select() */ + + if (getrlimit(RLIMIT_NOFILE, &rl) < 0) + return log_debug_errno(errno, "Failed to query RLIMIT_NOFILE: %m"); + + if (rl.rlim_cur <= FD_SETSIZE) + return 0; + + rl.rlim_cur = FD_SETSIZE; + if (setrlimit(RLIMIT_NOFILE, &rl) < 0) + return log_debug_errno(errno, "Failed to lower RLIMIT_NOFILE's soft limit to " RLIM_FMT ": %m", rl.rlim_cur); + + return 1; +} diff --git a/src/shared/rlimit-util.h b/src/shared/rlimit-util.h index 6139af3ff5..d4fca2b855 100644 --- a/src/shared/rlimit-util.h +++ b/src/shared/rlimit-util.h @@ -22,3 +22,4 @@ void rlimit_free_all(struct rlimit **rl); #define RLIMIT_MAKE_CONST(lim) ((struct rlimit) { lim, lim }) int rlimit_nofile_bump(int limit); +int rlimit_nofile_safe(void);