2001-03-04 19:42:05 -05:00
|
|
|
/*-
|
|
|
|
* 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();
|
2001-09-08 11:47:34 +03:00
|
|
|
if ((ret == ENOENT || ret == EIO) && MoveFile(old, new) == TRUE)
|
2001-03-04 19:42:05 -05:00
|
|
|
ret = 0;
|
|
|
|
}
|
|
|
|
if (ret != 0)
|
|
|
|
__db_err(dbenv, "Rename %s %s: %s", old, new, strerror(ret));
|
|
|
|
|
|
|
|
return (ret);
|
|
|
|
}
|