summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2014-11-25 11:08:59 +0200
committerMartin Storsjö <martin@martin.st>2014-11-27 09:29:29 +0200
commit79fd186a5035cf16fc0ab288d8f59da8b1ba2c0e (patch)
treebf977606b5f88e370e5937a14674760e2e1f7439
parent9326d64ed1baadd7af60df6bbcc59cf1fefede48 (diff)
downloadffmpeg-streaming-79fd186a5035cf16fc0ab288d8f59da8b1ba2c0e.zip
ffmpeg-streaming-79fd186a5035cf16fc0ab288d8f59da8b1ba2c0e.tar.gz
lavf: Use MoveFileEx instead of rename/_wrename on windows
This allows getting the normal unix semantics, where a rename allows replacing an existing file. Based on a suggestion by Reimar Döffinger. Signed-off-by: Martin Storsjö <martin@martin.st>
-rwxr-xr-xconfigure2
-rw-r--r--libavformat/os_support.h21
2 files changed, 21 insertions, 2 deletions
diff --git a/configure b/configure
index 7b3faae..355a95b 100755
--- a/configure
+++ b/configure
@@ -1466,6 +1466,7 @@ SYSTEM_FUNCS="
localtime_r
mach_absolute_time
MapViewOfFile
+ MoveFileExA
memalign
mkstemp
mmap
@@ -4096,6 +4097,7 @@ check_func_headers windows.h GetProcessAffinityMask
check_func_headers windows.h GetProcessTimes
check_func_headers windows.h GetSystemTimeAsFileTime
check_func_headers windows.h MapViewOfFile
+check_func_headers windows.h MoveFileExA
check_func_headers windows.h SetConsoleTextAttribute
check_func_headers windows.h Sleep
check_func_headers windows.h VirtualAlloc
diff --git a/libavformat/os_support.h b/libavformat/os_support.h
index 4aa98bd..4949065 100644
--- a/libavformat/os_support.h
+++ b/libavformat/os_support.h
@@ -170,14 +170,31 @@ static inline int win32_rename(const char *src_utf8, const char *dest_utf8)
goto fallback;
}
- ret = _wrename(src_w, dest_w);
+ ret = MoveFileExW(src_w, dest_w, MOVEFILE_REPLACE_EXISTING);
av_free(src_w);
av_free(dest_w);
+ // Lacking proper mapping from GetLastError() error codes to errno codes
+ if (ret)
+ errno = EPERM;
return ret;
fallback:
/* filename may be be in CP_ACP */
- return rename(src_utf8, dest_utf8);
+#if HAVE_MOVEFILEEXA
+ ret = MoveFileExA(src_utf8, dest_utf8, MOVEFILE_REPLACE_EXISTING);
+ if (ret)
+ errno = EPERM;
+#else
+ /* Windows Phone doesn't have MoveFileExA. However, it's unlikely
+ * that anybody would input filenames in CP_ACP there, so this
+ * fallback is kept mostly for completeness. Alternatively we could
+ * do MultiByteToWideChar(CP_ACP) and use MoveFileExW, but doing
+ * explicit conversions with CP_ACP is allegedly forbidden in windows
+ * store apps (or windows phone), and the notion of a native code page
+ * doesn't make much sense there. */
+ ret = rename(src_utf8, dest_utf8);
+#endif
+ return ret;
}
#define mkdir(a, b) win32_mkdir(a)
OpenPOWER on IntegriCloud