Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2008-04-29 13:24:54 +0400
committerCorinna Vinschen <corinna@vinschen.de>2008-04-29 13:24:54 +0400
commit59c7f5bcdfee597e6e250edeccfb3a0786955f13 (patch)
tree4e9d1cbec1706b6375c72af72b968193f4d0f5f8 /winsup/cygwin/syscalls.cc
parentb1d07c81ca6a8f33ecf729a2fd257a1de24c5f10 (diff)
* 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.
Diffstat (limited to 'winsup/cygwin/syscalls.cc')
-rw-r--r--winsup/cygwin/syscalls.cc22
1 files changed, 7 insertions, 15 deletions
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc
index 7da929efa..b323da203 100644
--- a/winsup/cygwin/syscalls.cc
+++ b/winsup/cygwin/syscalls.cc
@@ -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);