vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Sun Nov 29 11:45:29 2020 +0200| [6788528b1331eb59328a4639ac2eac327f347b1b] | committer: Rémi Denis-Courmont
filesystem: add vlc_dup2() wrapper > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=6788528b1331eb59328a4639ac2eac327f347b1b --- include/vlc_fs.h | 17 +++++++++++++++++ src/libvlccore.sym | 1 + src/posix/filesystem.c | 12 ++++++++++++ src/win32/filesystem.c | 8 ++++++++ 4 files changed, 38 insertions(+) diff --git a/include/vlc_fs.h b/include/vlc_fs.h index 4a50288be0..9ad2028053 100644 --- a/include/vlc_fs.h +++ b/include/vlc_fs.h @@ -110,6 +110,23 @@ VLC_API int vlc_mkstemp( char * ); */ VLC_API int vlc_dup(int oldfd) VLC_USED; +/** + * Replaces a file descriptor. + * + * This function duplicates a file descriptor to a specified file descriptor. + * This is primarily used to atomically replace a described file. + * + * @param oldfd source file descriptor to copy + * @param newfd destination file descriptor to replace + * + * @note Contrary to standard dup2(), the new file descriptor has the + * close-on-exec descriptor flag preset. + * + * @retval newfd success + * @retval -1 failure (see @c errno) + */ +VLC_API int vlc_dup2(int oldfd, int newfd); + /** * Creates a pipe (see "man pipe" for further reference). The new file * descriptors have the close-on-exec flag preset. diff --git a/src/libvlccore.sym b/src/libvlccore.sym index e3a2de9f6d..2cfe0d376c 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -448,6 +448,7 @@ vlc_unlink vlc_rename vlc_getcwd vlc_dup +vlc_dup2 vlc_pipe vlc_write vlc_writev diff --git a/src/posix/filesystem.c b/src/posix/filesystem.c index 60a997d9e0..18105a643c 100644 --- a/src/posix/filesystem.c +++ b/src/posix/filesystem.c @@ -178,6 +178,18 @@ int vlc_dup (int oldfd) return fcntl (oldfd, F_DUPFD_CLOEXEC, 0); } +int vlc_dup2(int oldfd, int newfd) +{ +#ifdef HAVE_DUP3 + return dup3(oldfd, newfd, O_CLOEXEC); +#else + int ret = dup2(oldfd, newfd); + if (ret >= 0) + vlc_cloexec(newfd); + return ret; +#endif +} + int vlc_pipe (int fds[2]) { #ifdef HAVE_PIPE2 diff --git a/src/win32/filesystem.c b/src/win32/filesystem.c index d8e3cc1127..09b8ec70d3 100644 --- a/src/win32/filesystem.c +++ b/src/win32/filesystem.c @@ -304,6 +304,14 @@ int vlc_dup (int oldfd) return fd; } +int vlc_dup2(int oldfd, int newfd) +{ + int fd = dup2(oldfd, newfd); + if (fd != -1) + setmode(fd, O_BINARY); + return fd; +} + int vlc_pipe (int fds[2]) { #if VLC_WINSTORE_APP _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
