From 79fd186a5035cf16fc0ab288d8f59da8b1ba2c0e Mon Sep 17 00:00:00 2001 From: Martin Storsjö Date: Tue, 25 Nov 2014 11:08:59 +0200 Subject: lavf: Use MoveFileEx instead of rename/_wrename on windows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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ö --- libavformat/os_support.h | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) (limited to 'libavformat/os_support.h') diff --git a/libavformat/os_support.h b/libavformat/os_support.h index 4aa98bdc18..49490655a9 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) -- cgit v1.2.3