]> git.ipfire.org Git - thirdparty/libbsd.git/commitdiff
closefrom: Use close_range() on Linux when available
authorGuillem Jover <guillem@hadrons.org>
Mon, 8 Feb 2021 02:45:06 +0000 (03:45 +0100)
committerGuillem Jover <guillem@hadrons.org>
Mon, 8 Feb 2021 03:02:46 +0000 (04:02 +0100)
Closes: !11
Based-on-patch-by: cptpcrd <cptpcrd.git@gmail.com>
Signed-off-by: Guillem Jover <guillem@hadrons.org>
src/closefrom.c

index e2e10a888765847f812c6ecd06ef7e40367906c9..087ccad87db47f57fa0c8d34f84dab4d59d659ba 100644 (file)
 
 #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;