From b4f59beeb4c2171879d0d7607a4a7d6165f07791 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Wed, 9 Mar 2016 14:33:25 +0100 Subject: avutil/file: Move av_tempfile() to avutil/file_open ff_tempfile() document the issue with av_tempfile() Tested-by: Hendrik Leppkes Signed-off-by: Michael Niedermayer --- libavutil/file_open.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) (limited to 'libavutil/file_open.c') 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; -- cgit v1.1