diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2011-12-13 15:54:28 +0400 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2011-12-13 15:54:28 +0400 |
commit | 3780d205cd7db141fd97c625100dafe69cd66407 (patch) | |
tree | 4a938eab601a8b4b66a76ee2ad68aab701e5a1ff /winsup/cygwin/path.cc | |
parent | 74365d9715432f55a2395b443c0dc3fc37b84e33 (diff) |
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Call
file_get_fnoi instead of NtQueryInformationFile.
* path.cc (file_get_fnoi): New helper function to collect a
FILE_NETWORK_OPEN_INFORMATION block.
(symlink_info::check): Call file_get_fnoi rather than
NtQueryInformationFile to collect a FILE_NETWORK_OPEN_INFORMATION block.
* path.h (file_get_fnoi): Declare.
Diffstat (limited to 'winsup/cygwin/path.cc')
-rw-r--r-- | winsup/cygwin/path.cc | 81 |
1 files changed, 44 insertions, 37 deletions
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index 56b219485..09874327d 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -1180,6 +1180,48 @@ path_conv::is_binary () && (bin == SCS_32BIT_BINARY || bin == SCS_64BIT_BINARY); } +/* Helper function to fill the fnoi datastructure for a file. */ +NTSTATUS +file_get_fnoi (HANDLE h, bool skip_network_open_inf, + PFILE_NETWORK_OPEN_INFORMATION pfnoi) +{ + NTSTATUS status; + IO_STATUS_BLOCK io; + + /* Some FSes (Netapps) don't implement FileNetworkOpenInformation. */ + status = skip_network_open_inf ? STATUS_INVALID_PARAMETER + : NtQueryInformationFile (h, &io, pfnoi, sizeof *pfnoi, + FileNetworkOpenInformation); + if (status == STATUS_INVALID_PARAMETER || status == STATUS_NOT_IMPLEMENTED) + { + /* Apart from accessing Netapps, this also occurs when accessing SMB + share root dirs hosted on NT4 (STATUS_INVALID_PARAMETER), or when + accessing SMB share root dirs from NT4 (STATUS_NOT_IMPLEMENTED). */ + FILE_BASIC_INFORMATION fbi; + FILE_STANDARD_INFORMATION fsi; + + status = NtQueryInformationFile (h, &io, &fbi, sizeof fbi, + FileBasicInformation); + if (NT_SUCCESS (status)) + { + memcpy (pfnoi, &fbi, 4 * sizeof (LARGE_INTEGER)); + if (NT_SUCCESS (NtQueryInformationFile (h, &io, &fsi, + sizeof fsi, + FileStandardInformation))) + { + pfnoi->EndOfFile.QuadPart = fsi.EndOfFile.QuadPart; + pfnoi->AllocationSize.QuadPart + = fsi.AllocationSize.QuadPart; + } + else + pfnoi->EndOfFile.QuadPart + = pfnoi->AllocationSize.QuadPart = 0; + pfnoi->FileAttributes = fbi.FileAttributes; + } + } + return status; +} + /* Normalize a Win32 path. /'s are converted to \'s in the process. All duplicate \'s, except for 2 leading \'s, are deleted. @@ -2422,44 +2464,9 @@ restart: } else { - PFILE_NETWORK_OPEN_INFORMATION pfnoi = conv_hdl.fnoi (); - - /* Netapps don't implement FileNetworkOpenInformation. */ - status = fs.is_netapp () - ? STATUS_INVALID_PARAMETER - : NtQueryInformationFile (h, &io, pfnoi, sizeof *pfnoi, - FileNetworkOpenInformation); - if (status == STATUS_INVALID_PARAMETER - || status == STATUS_NOT_IMPLEMENTED) - { - /* Apart from accessing Netapps, this also occurs when - accessing SMB share root dirs hosted on NT4 - (STATUS_INVALID_PARAMETER), or when trying to access - SMB share root dirs from NT4 (STATUS_NOT_IMPLEMENTED). */ - FILE_BASIC_INFORMATION fbi; - FILE_STANDARD_INFORMATION fsi; - - status = NtQueryInformationFile (h, &io, &fbi, sizeof fbi, - FileBasicInformation); - if (NT_SUCCESS (status)) - { - memcpy (pfnoi, &fbi, 4 * sizeof (LARGE_INTEGER)); - if (NT_SUCCESS (NtQueryInformationFile (h, &io, &fsi, - sizeof fsi, - FileStandardInformation))) - { - pfnoi->EndOfFile.QuadPart = fsi.EndOfFile.QuadPart; - pfnoi->AllocationSize.QuadPart - = fsi.AllocationSize.QuadPart; - } - else - pfnoi->EndOfFile.QuadPart - = pfnoi->AllocationSize.QuadPart = 0; - pfnoi->FileAttributes = fbi.FileAttributes; - } - } + status = file_get_fnoi (h, fs.is_netapp (), conv_hdl.fnoi ()); if (NT_SUCCESS (status)) - fileattr = pfnoi->FileAttributes; + fileattr = conv_hdl.fnoi ()->FileAttributes; } } if (!NT_SUCCESS (status)) |