summaryrefslogtreecommitdiffstats
path: root/otherlibs/win32unix/rename.c
diff options
context:
space:
mode:
Diffstat (limited to 'otherlibs/win32unix/rename.c')
-rw-r--r--otherlibs/win32unix/rename.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/otherlibs/win32unix/rename.c b/otherlibs/win32unix/rename.c
index d84bcd66a..3bfdf4770 100644
--- a/otherlibs/win32unix/rename.c
+++ b/otherlibs/win32unix/rename.c
@@ -19,9 +19,23 @@
CAMLprim value unix_rename(value path1, value path2)
{
- if (MoveFileEx(String_val(path1), String_val(path2),
- MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH |
- MOVEFILE_COPY_ALLOWED) == 0) {
+ static int supports_MoveFileEx = -1; /* don't know yet */
+ BOOL ok;
+
+ if (supports_MoveFileEx < 0) {
+ OSVERSIONINFO VersionInfo;
+ VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ supports_MoveFileEx =
+ (GetVersionEx(&VersionInfo) != 0)
+ && (VersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT);
+ }
+ if (supports_MoveFileEx > 0)
+ ok = MoveFileEx(String_val(path1), String_val(path2),
+ MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH |
+ MOVEFILE_COPY_ALLOWED);
+ else
+ ok = MoveFile(String_val(path1), String_val(path2));
+ if (! ok) {
win32_maperr(GetLastError());
uerror("rename", path1);
}