* 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.
This commit is contained in:
Corinna Vinschen 2011-12-13 11:54:28 +00:00
parent 74365d9715
commit 3780d205cd
4 changed files with 56 additions and 40 deletions

View File

@ -1,3 +1,13 @@
2011-12-13 Corinna Vinschen <vinschen@redhat.com>
* 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.
2011-12-13 Dave Korn <dave.korn.cygwin@gmail.com> 2011-12-13 Dave Korn <dave.korn.cygwin@gmail.com>
* times.cc (hires_ns::resolution): Don't return less than 1. * times.cc (hires_ns::resolution): Don't return less than 1.

View File

@ -347,9 +347,7 @@ fhandler_base::fstat_by_handle (struct __stat64 *buf)
on the information stored in pc.fnoi. So we overwrite them here. */ on the information stored in pc.fnoi. So we overwrite them here. */
if (get_io_handle ()) if (get_io_handle ())
{ {
PFILE_NETWORK_OPEN_INFORMATION pfnoi = pc.fnoi (); status = file_get_fnoi (h, pc.fs_is_netapp (), pc.fnoi ());
status = NtQueryInformationFile (h, &io, pfnoi, sizeof *pfnoi,
FileNetworkOpenInformation);
if (!NT_SUCCESS (status)) if (!NT_SUCCESS (status))
{ {
debug_printf ("%p = NtQueryInformationFile(%S, " debug_printf ("%p = NtQueryInformationFile(%S, "

View File

@ -1180,6 +1180,48 @@ path_conv::is_binary ()
&& (bin == SCS_32BIT_BINARY || bin == SCS_64BIT_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. /* Normalize a Win32 path.
/'s are converted to \'s in the process. /'s are converted to \'s in the process.
All duplicate \'s, except for 2 leading \'s, are deleted. All duplicate \'s, except for 2 leading \'s, are deleted.
@ -2422,44 +2464,9 @@ restart:
} }
else else
{ {
PFILE_NETWORK_OPEN_INFORMATION pfnoi = conv_hdl.fnoi (); status = file_get_fnoi (h, fs.is_netapp (), 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;
}
}
if (NT_SUCCESS (status)) if (NT_SUCCESS (status))
fileattr = pfnoi->FileAttributes; fileattr = conv_hdl.fnoi ()->FileAttributes;
} }
} }
if (!NT_SUCCESS (status)) if (!NT_SUCCESS (status))

View File

@ -425,6 +425,7 @@ int path_prefix_p (const char *path1, const char *path2, int len1,
bool caseinsensitive) __attribute__ ((regparm (3))); bool caseinsensitive) __attribute__ ((regparm (3)));
bool is_floppy (const char *); bool is_floppy (const char *);
NTSTATUS file_get_fnoi (HANDLE, bool, struct _FILE_NETWORK_OPEN_INFORMATION *);
int normalize_win32_path (const char *, char *, char *&); int normalize_win32_path (const char *, char *, char *&);
int normalize_posix_path (const char *, char *, char *&); int normalize_posix_path (const char *, char *, char *&);
PUNICODE_STRING get_nt_native_path (const char *, UNICODE_STRING&, bool) __attribute__ ((regparm (3))); PUNICODE_STRING get_nt_native_path (const char *, UNICODE_STRING&, bool) __attribute__ ((regparm (3)));