summaryrefslogtreecommitdiffstats
path: root/libavutil/file_open.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michael@niedermayer.cc>2016-03-09 14:33:25 +0100
committerMichael Niedermayer <michael@niedermayer.cc>2016-03-12 02:08:34 +0100
commitb4f59beeb4c2171879d0d7607a4a7d6165f07791 (patch)
treec0e7423f6ce12ff9773d1a999fd7feabd462e43b /libavutil/file_open.c
parent5d64ba9d18294a305f4f46c9a64e592dc5d34aa9 (diff)
downloadffmpeg-streaming-b4f59beeb4c2171879d0d7607a4a7d6165f07791.zip
ffmpeg-streaming-b4f59beeb4c2171879d0d7607a4a7d6165f07791.tar.gz
avutil/file: Move av_tempfile() to avutil/file_open ff_tempfile()
document the issue with av_tempfile() Tested-by: Hendrik Leppkes <h.leppkes@gmail.com> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavutil/file_open.c')
-rw-r--r--libavutil/file_open.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/libavutil/file_open.c b/libavutil/file_open.c
index 9e76127..6e58cc1 100644
--- a/libavutil/file_open.c
+++ b/libavutil/file_open.c
@@ -92,6 +92,65 @@ int avpriv_open(const char *filename, int flags, ...)
return fd;
}
+typedef struct FileLogContext {
+ const AVClass *class;
+ int log_offset;
+ void *log_ctx;
+} FileLogContext;
+
+static const AVClass file_log_ctx_class = {
+ "TEMPFILE", av_default_item_name, NULL, LIBAVUTIL_VERSION_INT,
+ offsetof(FileLogContext, log_offset), offsetof(FileLogContext, log_ctx)
+};
+
+int avpriv_tempfile(const char *prefix, char **filename, int log_offset, void *log_ctx)
+{
+ FileLogContext file_log_ctx = { &file_log_ctx_class, log_offset, log_ctx };
+ int fd = -1;
+#if !HAVE_MKSTEMP
+ void *ptr= tempnam(NULL, prefix);
+ if(!ptr)
+ ptr= tempnam(".", prefix);
+ *filename = av_strdup(ptr);
+#undef free
+ free(ptr);
+#else
+ size_t len = strlen(prefix) + 12; /* room for "/tmp/" and "XXXXXX\0" */
+ *filename = av_malloc(len);
+#endif
+ /* -----common section-----*/
+ if (!*filename) {
+ av_log(&file_log_ctx, AV_LOG_ERROR, "ff_tempfile: Cannot allocate file name\n");
+ return AVERROR(ENOMEM);
+ }
+#if !HAVE_MKSTEMP
+# ifndef O_BINARY
+# define O_BINARY 0
+# endif
+# ifndef O_EXCL
+# define O_EXCL 0
+# endif
+ fd = open(*filename, O_RDWR | O_BINARY | O_CREAT | O_EXCL, 0600);
+#else
+ snprintf(*filename, len, "/tmp/%sXXXXXX", prefix);
+ fd = mkstemp(*filename);
+#ifdef _WIN32
+ if (fd < 0) {
+ snprintf(*filename, len, "./%sXXXXXX", prefix);
+ fd = mkstemp(*filename);
+ }
+#endif
+#endif
+ /* -----common section-----*/
+ if (fd < 0) {
+ int err = AVERROR(errno);
+ av_log(&file_log_ctx, AV_LOG_ERROR, "ff_tempfile: Cannot open temporary file %s\n", *filename);
+ av_freep(filename);
+ return err;
+ }
+ return fd; /* success */
+}
+
FILE *av_fopen_utf8(const char *path, const char *mode)
{
int fd;
OpenPOWER on IntegriCloud