1/*- 2 * See the file LICENSE for redistribution information. 3 * 4 * Copyright (c) 1997,2008 Oracle. All rights reserved. 5 * 6 * $Id: os_rename.c,v 12.14 2008/02/18 19:34:22 bostic Exp $ 7 */ 8 9#include "db_config.h" 10 11#include "db_int.h" 12 13/* 14 * __os_rename -- 15 * Rename a file. 16 */ 17int 18__os_rename(env, oldname, newname, silent) 19 ENV *env; 20 const char *oldname, *newname; 21 u_int32_t silent; 22{ 23 DB_ENV *dbenv; 24 _TCHAR *toldname, *tnewname; 25 int ret; 26 27 dbenv = env == NULL ? NULL : env->dbenv; 28 29 if (dbenv != NULL && 30 FLD_ISSET(dbenv->verbose, DB_VERB_FILEOPS | DB_VERB_FILEOPS_ALL)) 31 __db_msg(env, "fileops: rename %s to %s", oldname, newname); 32 33 TO_TSTRING(env, oldname, toldname, ret); 34 if (ret != 0) 35 return (ret); 36 TO_TSTRING(env, newname, tnewname, ret); 37 if (ret != 0) { 38 FREE_STRING(env, toldname); 39 return (ret); 40 } 41 42 LAST_PANIC_CHECK_BEFORE_IO(env); 43 44 if (!MoveFile(toldname, tnewname)) 45 ret = __os_get_syserr(); 46 47 if (__os_posix_err(ret) == EEXIST) { 48 ret = 0; 49#ifndef DB_WINCE 50 if (__os_is_winnt()) { 51 if (!MoveFileEx( 52 toldname, tnewname, MOVEFILE_REPLACE_EXISTING)) 53 ret = __os_get_syserr(); 54 } else 55#endif 56 { 57 /* 58 * There is no MoveFileEx for Win9x/Me/CE, so we have to 59 * do the best we can. Note that the MoveFile call 60 * above would have succeeded if oldname and newname 61 * refer to the same file, so we don't need to check 62 * that here. 63 */ 64 (void)DeleteFile(tnewname); 65 if (!MoveFile(toldname, tnewname)) 66 ret = __os_get_syserr(); 67 } 68 } 69 70 FREE_STRING(env, tnewname); 71 FREE_STRING(env, toldname); 72 73 if (ret != 0) { 74 if (silent == 0) 75 __db_syserr( 76 env, ret, "MoveFileEx %s %s", oldname, newname); 77 ret = __os_posix_err(ret); 78 } 79 80 return (ret); 81} 82