summaryrefslogtreecommitdiff
path: root/bdb/os_win32/os_rename.c
diff options
context:
space:
mode:
Diffstat (limited to 'bdb/os_win32/os_rename.c')
-rw-r--r--bdb/os_win32/os_rename.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/bdb/os_win32/os_rename.c b/bdb/os_win32/os_rename.c
new file mode 100644
index 00000000000..c824820462c
--- /dev/null
+++ b/bdb/os_win32/os_rename.c
@@ -0,0 +1,57 @@
+/*-
+ * See the file LICENSE for redistribution information.
+ *
+ * Copyright (c) 1997, 1998, 1999, 2000
+ * Sleepycat Software. All rights reserved.
+ */
+
+#include "db_config.h"
+
+#ifndef lint
+static const char revid[] = "$Id: os_rename.c,v 1.2 2000/06/13 19:52:19 dda Exp $";
+#endif /* not lint */
+
+#include "db_int.h"
+#include "os_jump.h"
+
+/*
+ * __os_rename --
+ * Rename a file.
+ */
+int
+__os_rename(dbenv, old, new)
+ DB_ENV *dbenv;
+ const char *old, *new;
+{
+ int ret;
+
+ ret = 0;
+ if (__db_jump.j_rename != NULL) {
+ if (__db_jump.j_rename(old, new) == -1)
+ ret = __os_get_errno();
+ }
+ else {
+ /* Normally we would use a single MoveFileEx call with
+ * MOVEFILE_REPLACE_EXISTING flag to simulate Unix rename().
+ * But if the target file exists, and the two files' 8.3
+ * names are identical, a Windows bug causes the target file
+ * to be deleted, but the original file will not be renamed,
+ * and an ENOENT error will be returned. (See MSDN for a
+ * description of the bug).
+ *
+ * After the failed call, a MoveFile seems to perform
+ * the rename correctly (even another call to MoveFileEx
+ * does not)! The expense of this extra call only occurs
+ * on systems with the bug: Windows/98, for one, but
+ * apparently not Windows/NT and Windows/2000.
+ */
+ if (MoveFileEx(old, new, MOVEFILE_REPLACE_EXISTING) != TRUE)
+ ret = __os_win32_errno();
+ if (ret == ENOENT && MoveFile(old, new) == TRUE)
+ ret = 0;
+ }
+ if (ret != 0)
+ __db_err(dbenv, "Rename %s %s: %s", old, new, strerror(ret));
+
+ return (ret);
+}