Commit 71a1c8a6 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

vlc_dup: dup with close-on-exec

parent 7e45ab1b
......@@ -530,7 +530,7 @@ AC_CHECK_FUNCS(fdatasync,,
])
dnl Check for non-standard system calls
AC_CHECK_FUNCS([accept4 eventfd fstatfs vmsplice])
AC_CHECK_FUNCS([accept4 dup3 eventfd fstatfs vmsplice])
AH_BOTTOM([#include <vlc_fixups.h>])
......
......@@ -53,4 +53,6 @@ VLC_EXPORT( int, utf8_lstat, ( const char *filename, struct stat *buf ) );
VLC_EXPORT( int, vlc_mkstemp, ( char * ) );
VLC_EXPORT( int, vlc_dup, ( int ) );
#endif
......@@ -440,6 +440,7 @@ vlc_readdir
vlc_scandir
vlc_stat
vlc_unlink
vlc_dup
utf8_vfprintf
var_AddCallback
var_Change
......
......@@ -535,3 +535,32 @@ int vlc_mkstemp( char *template )
return -1;
}
/**
* Duplicates a file descriptor. The new file descriptor has the close-on-exec
* descriptor flag set.
* @return a new file descriptor or -1
*/
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))
{
if (likely(dup3 (oldfd, newfd, O_CLOEXEC) == newfd))
return newfd;
close (newfd);
}
#endif
newfd = dup (oldfd);
#ifdef HAVE_FCNTL
if (likely(newfd != -1))
fcntl (newfd, F_SETFD, FD_CLOEXEC);
#endif
return newfd;
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment