* 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:
parent
74365d9715
commit
3780d205cd
|
@ -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>
|
||||
|
||||
* times.cc (hires_ns::resolution): Don't return less than 1.
|
||||
|
|
|
@ -347,9 +347,7 @@ fhandler_base::fstat_by_handle (struct __stat64 *buf)
|
|||
on the information stored in pc.fnoi. So we overwrite them here. */
|
||||
if (get_io_handle ())
|
||||
{
|
||||
PFILE_NETWORK_OPEN_INFORMATION pfnoi = pc.fnoi ();
|
||||
status = NtQueryInformationFile (h, &io, pfnoi, sizeof *pfnoi,
|
||||
FileNetworkOpenInformation);
|
||||
status = file_get_fnoi (h, pc.fs_is_netapp (), pc.fnoi ());
|
||||
if (!NT_SUCCESS (status))
|
||||
{
|
||||
debug_printf ("%p = NtQueryInformationFile(%S, "
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -425,6 +425,7 @@ int path_prefix_p (const char *path1, const char *path2, int len1,
|
|||
bool caseinsensitive) __attribute__ ((regparm (3)));
|
||||
|
||||
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_posix_path (const char *, char *, char *&);
|
||||
PUNICODE_STRING get_nt_native_path (const char *, UNICODE_STRING&, bool) __attribute__ ((regparm (3)));
|
||||
|
|
Loading…
Reference in New Issue