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,, ...@@ -530,7 +530,7 @@ AC_CHECK_FUNCS(fdatasync,,
]) ])
dnl Check for non-standard system calls 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>]) AH_BOTTOM([#include <vlc_fixups.h>])
......
...@@ -53,4 +53,6 @@ VLC_EXPORT( int, utf8_lstat, ( const char *filename, struct stat *buf ) ); ...@@ -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_mkstemp, ( char * ) );
VLC_EXPORT( int, vlc_dup, ( int ) );
#endif #endif
...@@ -440,6 +440,7 @@ vlc_readdir ...@@ -440,6 +440,7 @@ vlc_readdir
vlc_scandir vlc_scandir
vlc_stat vlc_stat
vlc_unlink vlc_unlink
vlc_dup
utf8_vfprintf utf8_vfprintf
var_AddCallback var_AddCallback
var_Change var_Change
......
...@@ -535,3 +535,32 @@ int vlc_mkstemp( char *template ) ...@@ -535,3 +535,32 @@ int vlc_mkstemp( char *template )
return -1; 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