diff options
author | Guillem Jover <guillem@hadrons.org> | 2021-02-08 03:45:06 +0100 |
---|---|---|
committer | Guillem Jover <guillem@hadrons.org> | 2021-02-08 04:02:46 +0100 |
commit | e832b7687ed42ecf0daf7c5deefa86a1445d62fd (patch) | |
tree | 205060b0f7d6aa3e16f797b0e4c5944874af4c7f | |
parent | c4fca5bb4fcf8509cb93db6e20314f22994c093b (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.c | 21 |
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; |