summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuillem Jover <guillem@hadrons.org>2021-02-08 03:45:06 +0100
committerGuillem Jover <guillem@hadrons.org>2021-02-08 04:02:46 +0100
commite832b7687ed42ecf0daf7c5deefa86a1445d62fd (patch)
tree205060b0f7d6aa3e16f797b0e4c5944874af4c7f
parentc4fca5bb4fcf8509cb93db6e20314f22994c093b (diff)
closefrom: Use close_range() on Linux when available
Closes: !11 Based-on-patch-by: cptpcrd <cptpcrd.git@gmail.com> Signed-off-by: Guillem Jover <guillem@hadrons.org>
-rw-r--r--src/closefrom.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/closefrom.c b/src/closefrom.c
index e2e10a8..087ccad 100644
--- a/src/closefrom.c
+++ b/src/closefrom.c
@@ -19,6 +19,12 @@
#include <config.h>
+#ifdef __linux__
+# include <sys/syscall.h>
+# if defined(__NR_close_range) && !defined(SYS_close_range)
+# define SYS_close_range __NR_close_range
+# endif
+#endif
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
@@ -61,6 +67,14 @@ closefrom_close(int fd)
#endif
}
+#if defined(__linux__) && defined(SYS_close_range)
+static inline int
+sys_close_range(unsigned int fd, unsigned int max_fd, unsigned int flags)
+{
+ return syscall(SYS_close_range, fd, max_fd, flags);
+}
+#endif
+
/*
* Close all file descriptors greater than or equal to lowfd.
* This is the expensive (fallback) method.
@@ -182,11 +196,16 @@ closefrom(int lowfd)
if (lowfd < 0)
lowfd = 0;
- /* Try the fast method first, if possible. */
+ /* Try the fast methods first, if possible. */
#if defined(HAVE_FCNTL_CLOSEM)
if (fcntl(lowfd, F_CLOSEM, 0) != -1)
return;
#endif /* HAVE_FCNTL_CLOSEM */
+#if defined(__linux__) && defined(SYS_close_range)
+ if (sys_close_range(lowfd, UINT_MAX, 0) == 0)
+ return;
+#endif
+
#if defined(HAVE_PSTAT_GETPROC)
if (closefrom_pstat(lowfd) != -1)
return;