aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2013-08-08 11:07:46 +0200
committerMichael Niedermayer <michaelni@gmx.at>2013-08-08 11:07:51 +0200
commit5f38317e59bdea80e2bb66389b250b985344ebdc (patch)
treefa1065c9b81036254c7248a61371eaa777553c96
parent1b2a5817fcd6bef184d6a32ddb62a9df1dd4fd0e (diff)
parent869b04e89154cd92d2bcfdabcecbe3217864c099 (diff)
downloadffmpeg-5f38317e59bdea80e2bb66389b250b985344ebdc.tar.gz
Merge commit '869b04e89154cd92d2bcfdabcecbe3217864c099'
* commit '869b04e89154cd92d2bcfdabcecbe3217864c099': libavutil: add avpriv_open() to open files with close-on-exec flag Merged-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--libavutil/file.c25
-rw-r--r--libavutil/internal.h5
2 files changed, 29 insertions, 1 deletions
diff --git a/libavutil/file.c b/libavutil/file.c
index 41850f835b..33dcb7864f 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 4b85efd867..680d600451 100644
--- a/libavutil/internal.h
+++ b/libavutil/internal.h
@@ -198,4 +198,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 */