mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-02-21 00:07:36 +08:00
* syscalls.cc (rename): Use volume serial numbers stored in path_conv
rather than fetching them here for the "same file" test. Change comment to reflect this.
This commit is contained in:
parent
b1d07c81ca
commit
59c7f5bcdf
@ -1,3 +1,9 @@
|
||||
2008-04-29 Corinna Vinschen <corinna@vinschen.de>
|
||||
|
||||
* syscalls.cc (rename): Use volume serial numbers stored in path_conv
|
||||
rather than fetching them here for the "same file" test. Change
|
||||
comment to reflect this.
|
||||
|
||||
2008-04-28 Corinna Vinschen <corinna@vinschen.de>
|
||||
|
||||
* path.cc (symlink_info::check): Avoid special handling for
|
||||
|
@ -1740,12 +1740,14 @@ rename (const char *oldpath, const char *newpath)
|
||||
/* SUSv3: If the old argument and the new argument resolve to the same
|
||||
existing file, rename() shall return successfully and perform no
|
||||
other action.
|
||||
The test tries to be as quick as possible. First it tests if oldpath
|
||||
has more than 1 hardlink, then it opens newpath and tests for identical
|
||||
file ids. If so, it tests for identical volume serial numbers, If so,
|
||||
oldpath and newpath refer to the same file. */
|
||||
The test tries to be as quick as possible. First it tests for identical
|
||||
volume serial numbers because that information is available anyway.
|
||||
Then it tests if oldpath has more than 1 hardlink, then it opens newpath
|
||||
and tests for identical file ids. If so, oldpath and newpath refer to
|
||||
the same file. */
|
||||
if ((removepc || dstpc->exists ())
|
||||
&& !oldpc.isdir ()
|
||||
&& dstpc->fs_serial_number () == oldpc.fs_serial_number ()
|
||||
&& NT_SUCCESS (NtQueryInformationFile (fh, &io, &ofsi, sizeof ofsi,
|
||||
FileStandardInformation))
|
||||
&& ofsi.NumberOfLinks > 1
|
||||
@ -1756,23 +1758,13 @@ rename (const char *oldpath, const char *newpath)
|
||||
| ((removepc ?: dstpc)->is_rep_symlink ()
|
||||
? FILE_OPEN_REPARSE_POINT : 0))))
|
||||
{
|
||||
static const size_t vsiz = sizeof (FILE_FS_VOLUME_INFORMATION)
|
||||
+ 32 * sizeof (WCHAR);
|
||||
FILE_INTERNAL_INFORMATION ofii, nfii;
|
||||
PFILE_FS_VOLUME_INFORMATION opffvi, npffvi;
|
||||
|
||||
if (NT_SUCCESS (NtQueryInformationFile (fh, &io, &ofii, sizeof ofii,
|
||||
FileInternalInformation))
|
||||
&& NT_SUCCESS (NtQueryInformationFile (nfh, &io, &nfii, sizeof nfii,
|
||||
FileInternalInformation))
|
||||
&& ofii.FileId.QuadPart == nfii.FileId.QuadPart
|
||||
&& (opffvi = (PFILE_FS_VOLUME_INFORMATION) alloca (vsiz))
|
||||
&& (npffvi = (PFILE_FS_VOLUME_INFORMATION) alloca (vsiz))
|
||||
&& NT_SUCCESS (NtQueryVolumeInformationFile (fh, &io, opffvi, vsiz,
|
||||
FileFsVolumeInformation))
|
||||
&& NT_SUCCESS (NtQueryVolumeInformationFile (nfh, &io, npffvi, vsiz,
|
||||
FileFsVolumeInformation))
|
||||
&& opffvi->VolumeSerialNumber == npffvi->VolumeSerialNumber)
|
||||
&& ofii.FileId.QuadPart == nfii.FileId.QuadPart)
|
||||
{
|
||||
debug_printf ("%s and %s are the same file", oldpath, newpath);
|
||||
NtClose (nfh);
|
||||
|
Loading…
x
Reference in New Issue
Block a user