os_rename.c 1.5 KB
Newer Older
unknown's avatar
unknown committed
1 2 3
/*-
 * See the file LICENSE for redistribution information.
 *
unknown's avatar
unknown committed
4
 * Copyright (c) 1997-2002
unknown's avatar
unknown committed
5 6 7 8 9 10
 *	Sleepycat Software.  All rights reserved.
 */

#include "db_config.h"

#ifndef lint
unknown's avatar
unknown committed
11
static const char revid[] = "$Id: os_rename.c,v 1.12 2002/07/12 18:56:55 bostic Exp $";
unknown's avatar
unknown committed
12 13 14 15 16 17 18 19 20
#endif /* not lint */

#include "db_int.h"

/*
 * __os_rename --
 *	Rename a file.
 */
int
unknown's avatar
unknown committed
21
__os_rename(dbenv, oldname, newname, flags)
unknown's avatar
unknown committed
22
	DB_ENV *dbenv;
unknown's avatar
unknown committed
23 24
	const char *oldname, *newname;
	u_int32_t flags;
unknown's avatar
unknown committed
25 26
{
	int ret;
unknown's avatar
unknown committed
27
	char oldbuf[MAX_PATH], newbuf[MAX_PATH];
unknown's avatar
unknown committed
28 29

	ret = 0;
unknown's avatar
unknown committed
30 31
	if (DB_GLOBAL(j_rename) != NULL) {
		if (DB_GLOBAL(j_rename)(oldname, newname) == -1)
unknown's avatar
unknown committed
32
			ret = __os_get_errno();
unknown's avatar
unknown committed
33
		goto done;
unknown's avatar
unknown committed
34
	}
unknown's avatar
unknown committed
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66

	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.
			 */
			if (!GetLongPathName(oldname, oldbuf, sizeof oldbuf) ||
			    !GetLongPathName(newname, newbuf, sizeof newbuf)) {
				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();
		}
unknown's avatar
unknown committed
67
	}
unknown's avatar
unknown committed
68 69 70 71

done:	if (ret != 0 && flags == 0)
		__db_err(dbenv,
		    "Rename %s %s: %s", oldname, newname, strerror(ret));
unknown's avatar
unknown committed
72 73 74

	return (ret);
}