diff options
author | Jesse Morgan <jesse@jesterpm.net> | 2016-12-17 21:28:53 -0800 |
---|---|---|
committer | Jesse Morgan <jesse@jesterpm.net> | 2016-12-17 21:28:53 -0800 |
commit | 54df2afaa61c6a03cbb4a33c9b90fa572b6d07b8 (patch) | |
tree | 18147b92b969d25ffbe61935fb63035cac820dd0 /db-4.8.30/os_windows/os_rename.c |
Berkeley DB 4.8 with rust build script for linux.
Diffstat (limited to 'db-4.8.30/os_windows/os_rename.c')
-rw-r--r-- | db-4.8.30/os_windows/os_rename.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/db-4.8.30/os_windows/os_rename.c b/db-4.8.30/os_windows/os_rename.c new file mode 100644 index 0000000..9312d8a --- /dev/null +++ b/db-4.8.30/os_windows/os_rename.c @@ -0,0 +1,81 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 1997-2009 Oracle. All rights reserved. + * + * $Id$ + */ + +#include "db_config.h" + +#include "db_int.h" + +/* + * __os_rename -- + * Rename a file. + */ +int +__os_rename(env, oldname, newname, silent) + ENV *env; + const char *oldname, *newname; + u_int32_t silent; +{ + DB_ENV *dbenv; + _TCHAR *toldname, *tnewname; + int ret; + + dbenv = env == NULL ? NULL : env->dbenv; + + if (dbenv != NULL && + FLD_ISSET(dbenv->verbose, DB_VERB_FILEOPS | DB_VERB_FILEOPS_ALL)) + __db_msg(env, "fileops: rename %s to %s", oldname, newname); + + TO_TSTRING(env, oldname, toldname, ret); + if (ret != 0) + return (ret); + TO_TSTRING(env, newname, tnewname, ret); + if (ret != 0) { + FREE_STRING(env, toldname); + return (ret); + } + + LAST_PANIC_CHECK_BEFORE_IO(env); + + if (!MoveFile(toldname, tnewname)) + ret = __os_get_syserr(); + + if (__os_posix_err(ret) == EEXIST) { + ret = 0; +#ifndef DB_WINCE + if (__os_is_winnt()) { + if (!MoveFileEx( + toldname, tnewname, MOVEFILE_REPLACE_EXISTING)) + ret = __os_get_syserr(); + } else +#endif + { + /* + * There is no MoveFileEx for Win9x/Me/CE, so we have to + * do the best we can. Note that the MoveFile call + * above would have succeeded if oldname and newname + * refer to the same file, so we don't need to check + * that here. + */ + (void)DeleteFile(tnewname); + if (!MoveFile(toldname, tnewname)) + ret = __os_get_syserr(); + } + } + + FREE_STRING(env, tnewname); + FREE_STRING(env, toldname); + + if (ret != 0) { + if (silent == 0) + __db_syserr( + env, ret, "MoveFileEx %s %s", oldname, newname); + ret = __os_posix_err(ret); + } + + return (ret); +} |