diff options
author | RĂ©mi Denis-Courmont <remi@remlab.net> | 2013-08-06 21:19:24 +0300 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2013-08-07 21:12:20 +0200 |
commit | 869b04e89154cd92d2bcfdabcecbe3217864c099 (patch) | |
tree | 39518f092340f1ac4bc62f5816ffd5ba5e6ce8cd /libavutil | |
parent | 22c879057ead189c0f59241cb9eeb926381e3299 (diff) | |
download | ffmpeg-869b04e89154cd92d2bcfdabcecbe3217864c099.tar.gz |
libavutil: add avpriv_open() to open files with close-on-exec flag
Signed-off-by: Anton Khirnov <anton@khirnov.net>
Diffstat (limited to 'libavutil')
-rw-r--r-- | libavutil/file.c | 25 | ||||
-rw-r--r-- | libavutil/internal.h | 5 |
2 files changed, 29 insertions, 1 deletions
diff --git a/libavutil/file.c b/libavutil/file.c index ce02487f35..add049d24b 100644 --- a/libavutil/file.c +++ b/libavutil/file.c @@ -18,8 +18,10 @@ #include "config.h" #include "file.h" +#include "internal.h" #include "log.h" #include "mem.h" +#include <stdarg.h> #include <fcntl.h> #include <sys/stat.h> #if HAVE_UNISTD_H @@ -34,6 +36,27 @@ #include <windows.h> #endif +int avpriv_open(const char *filename, int flags, ...) +{ + int fd; + unsigned int mode = 0; + va_list ap; + + va_start(ap, flags); + if (flags & O_CREAT) + mode = va_arg(ap, unsigned int); + va_end(ap); + +#ifdef O_CLOEXEC + flags |= O_CLOEXEC; +#endif + + fd = open(filename, flags, mode); + if (fd != -1) + fcntl(fd, F_SETFD, FD_CLOEXEC); + return fd; +} + typedef struct { const AVClass *class; int log_offset; @@ -49,7 +72,7 @@ int av_file_map(const char *filename, uint8_t **bufptr, size_t *size, int log_offset, void *log_ctx) { FileLogContext file_log_ctx = { &file_log_ctx_class, log_offset, log_ctx }; - int err, fd = open(filename, O_RDONLY); + int err, fd = avpriv_open(filename, O_RDONLY); struct stat st; av_unused void *ptr; off_t off_size; diff --git a/libavutil/internal.h b/libavutil/internal.h index 5a721f3a71..cb3a8f5f12 100644 --- a/libavutil/internal.h +++ b/libavutil/internal.h @@ -196,4 +196,9 @@ void avpriv_report_missing_feature(void *avc, void avpriv_request_sample(void *avc, const char *msg, ...) av_printf_format(2, 3); +/** + * A wrapper for open() setting O_CLOEXEC. + */ +int avpriv_open(const char *filename, int flags, ...); + #endif /* AVUTIL_INTERNAL_H */ |