[FFmpeg-cvslog] libavutil: add avpriv_open() to open files with close-on-exec flag

Rémi Denis-Courmont git at videolan.org
Thu Aug 8 11:15:41 CEST 2013


ffmpeg | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Tue Aug  6 21:19:24 2013 +0300| [869b04e89154cd92d2bcfdabcecbe3217864c099] | committer: Anton Khirnov

libavutil: add avpriv_open() to open files with close-on-exec flag

Signed-off-by: Anton Khirnov <anton at khirnov.net>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=869b04e89154cd92d2bcfdabcecbe3217864c099
---

 libavutil/file.c     |   25 ++++++++++++++++++++++++-
 libavutil/internal.h |    5 +++++
 2 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/libavutil/file.c b/libavutil/file.c
index ce02487..add049d 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 5a721f3..cb3a8f5 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 */



More information about the ffmpeg-cvslog mailing list