[vlc-commits] Use POSIX fcntl(F_DUPFD_CLOEXEC) instead of Linux dup3()

Rémi Denis-Courmont git at videolan.org
Fri Mar 18 23:12:01 CET 2011


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Mar 19 00:11:01 2011 +0200| [90ac674cb1d24f64cc8b38d5ea21be4dfeffb24a] | committer: Rémi Denis-Courmont

Use POSIX fcntl(F_DUPFD_CLOEXEC) instead of Linux dup3()

As an added bonus, we don't need to open /dev/null for nothing.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=90ac674cb1d24f64cc8b38d5ea21be4dfeffb24a
---

 configure.ac           |    2 +-
 src/posix/filesystem.c |   21 +++++++--------------
 2 files changed, 8 insertions(+), 15 deletions(-)

diff --git a/configure.ac b/configure.ac
index 7de376d..07f859d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -557,7 +557,7 @@ AC_CHECK_FUNCS(fdatasync,,
 AC_FUNC_STRCOLL
 
 dnl Check for non-standard system calls
-AC_CHECK_FUNCS([accept4 dup3 pipe2 eventfd vmsplice sched_getaffinity])
+AC_CHECK_FUNCS([accept4 pipe2 eventfd vmsplice sched_getaffinity])
 
 AH_BOTTOM([#include <vlc_fixups.h>])
 
diff --git a/src/posix/filesystem.c b/src/posix/filesystem.c
index 80576e1..9affc67 100644
--- a/src/posix/filesystem.c
+++ b/src/posix/filesystem.c
@@ -315,22 +315,15 @@ int vlc_dup (int oldfd)
 {
     int newfd;
 
-#ifdef HAVE_DUP3
-    /* Unfortunately, dup3() works like dup2(), not like plain dup(). So we
-     * need such contortion to find the new file descriptor while preserving
-     * thread safety of the file descriptor table. */
-    newfd = vlc_open ("/dev/null", O_RDONLY);
-    if (likely(newfd != -1))
+#ifdef F_DUPFD_CLOEXEC
+    newfd = fcntl (oldfd, F_DUPFD_CLOEXEC);
+    if (unlikely(newfd == -1 || errno == EINVAL))
+#endif
     {
-        if (likely(dup3 (oldfd, newfd, O_CLOEXEC) == newfd))
-            return newfd;
-        close (newfd);
+        newfd = dup (oldfd);
+        if (likely(newfd != -1))
+            fcntl (newfd, F_SETFD, FD_CLOEXEC);
     }
-#endif
-
-    newfd = dup (oldfd);
-    if (likely(newfd != -1))
-        fcntl (newfd, F_SETFD, FD_CLOEXEC);
     return newfd;
 }
 



More information about the vlc-commits mailing list