summaryrefslogtreecommitdiff
path: root/storage/bdb/os_win32/os_rename.c
diff options
context:
space:
mode:
Diffstat (limited to 'storage/bdb/os_win32/os_rename.c')
-rw-r--r--storage/bdb/os_win32/os_rename.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/storage/bdb/os_win32/os_rename.c b/storage/bdb/os_win32/os_rename.c
new file mode 100644
index 00000000000..67c3846649b
--- /dev/null
+++ b/storage/bdb/os_win32/os_rename.c
@@ -0,0 +1,77 @@
+/*-
+ * See the file LICENSE for redistribution information.
+ *
+ * Copyright (c) 1997-2002
+ * Sleepycat Software. All rights reserved.
+ */
+
+#include "db_config.h"
+
+#ifndef lint
+static const char revid[] = "$Id: os_rename.c,v 1.12 2002/07/12 18:56:55 bostic Exp $";
+#endif /* not lint */
+
+#include "db_int.h"
+
+/*
+ * __os_rename --
+ * Rename a file.
+ */
+int
+__os_rename(dbenv, oldname, newname, flags)
+ DB_ENV *dbenv;
+ const char *oldname, *newname;
+ u_int32_t flags;
+{
+ int ret;
+ char oldbuf[MAX_PATH], newbuf[MAX_PATH];
+
+ ret = 0;
+ if (DB_GLOBAL(j_rename) != NULL) {
+ if (DB_GLOBAL(j_rename)(oldname, newname) == -1)
+ ret = __os_get_errno();
+ goto done;
+ }
+
+ if (!MoveFile(oldname, newname))
+ ret = __os_win32_errno();
+
+ if (ret == EEXIST) {
+ ret = 0;
+ if (__os_is_winnt()) {
+ if (!MoveFileEx(
+ oldname, newname, MOVEFILE_REPLACE_EXISTING))
+ ret = __os_win32_errno();
+ } else {
+ /*
+ * There is no MoveFileEx for Win9x/Me, so we have to
+ * do the best we can.
+ */
+ LPTSTR FilePath;
+ if (!GetFullPathName(oldname, sizeof(oldbuf), oldbuf,
+ &FilePath) ||
+ !GetFullPathName(newname, sizeof(newbuf), newbuf,
+ &FilePath)) {
+ ret = __os_win32_errno();
+ goto done;
+ }
+
+ /*
+ * If the old and new names differ only in case, we're
+ * done.
+ */
+ if (strcasecmp(oldbuf, newbuf) == 0)
+ goto done;
+
+ (void)DeleteFile(newname);
+ if (!MoveFile(oldname, newname))
+ ret = __os_win32_errno();
+ }
+ }
+
+done: if (ret != 0 && flags == 0)
+ __db_err(dbenv,
+ "Rename %s %s: %s", oldname, newname, strerror(ret));
+
+ return (ret);
+}