diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2010-09-15 15:26:10 +0400 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2010-09-15 15:26:10 +0400 |
commit | 421ff3ff77d3f6fb07a849e11b7e0268172b6e17 (patch) | |
tree | 7a78585f9ca5187e1f2dfeace45d8cab74646ac2 /winsup/cygwin/fhandler_disk_file.cc | |
parent | f859880a5b4a090901fffd05a7b6fc55b6d3738f (diff) |
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Fetch number
of links and inode number only if path has good inodes.
(fhandler_base::fstat_by_name): Fetch inode number only if path has
good inodes.
Diffstat (limited to 'winsup/cygwin/fhandler_disk_file.cc')
-rw-r--r-- | winsup/cygwin/fhandler_disk_file.cc | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc index b9c62b27a..02376f6a5 100644 --- a/winsup/cygwin/fhandler_disk_file.cc +++ b/winsup/cygwin/fhandler_disk_file.cc @@ -356,25 +356,30 @@ fhandler_base::fstat_by_handle (struct __stat64 *buf) NTSTATUS status = 0; IO_STATUS_BLOCK io; - status = NtQueryInformationFile (h, &io, &fsi, sizeof fsi, - FileStandardInformation); - if (!NT_SUCCESS (status)) - { - debug_printf ("%p = NtQueryInformationFile(%S, FileStandardInformation)", - status, pc.get_nt_native_path ()); - return -1; - } - if (!ino && pc.hasgood_inode ()) + if (!pc.hasgood_inode ()) + fsi.NumberOfLinks = 1; + else { - status = NtQueryInformationFile (h, &io, &fii, sizeof fii, - FileInternalInformation); + status = NtQueryInformationFile (h, &io, &fsi, sizeof fsi, + FileStandardInformation); if (!NT_SUCCESS (status)) { - debug_printf ("%p = NtQueryInformationFile(%S, FileInternalInformation)", + debug_printf ("%p = NtQueryInformationFile(%S, FileStandardInformation)", status, pc.get_nt_native_path ()); return -1; } - ino = fii.FileId.QuadPart; + if (!ino) + { + status = NtQueryInformationFile (h, &io, &fii, sizeof fii, + FileInternalInformation); + if (!NT_SUCCESS (status)) + { + debug_printf ("%p = NtQueryInformationFile(%S, FileInternalInformation)", + status, pc.get_nt_native_path ()); + return -1; + } + ino = fii.FileId.QuadPart; + } } return fstat_helper (buf, fsi.NumberOfLinks); } @@ -393,7 +398,8 @@ fhandler_base::fstat_by_name (struct __stat64 *buf) WCHAR buf[NAME_MAX + 1]; } fdi_buf; - if (!ino && wincap.has_fileid_dirinfo () && !pc.has_buggy_fileid_dirinfo ()) + if (!ino && pc.hasgood_inode () + && wincap.has_fileid_dirinfo () && !pc.has_buggy_fileid_dirinfo ()) { RtlSplitUnicodePath (pc.get_nt_native_path (), &dirname, &basename); InitializeObjectAttributes (&attr, &dirname, pc.objcaseinsensitive (), |