* fhandler_disk_file.cc (fhandler_disk_file::rewinddir): Accomodate

buggy RestartScan behaviour of Windows 2000.
	* wincap.h: Define has_buggy_restart_scan throughout.
	* wincap.cc: Ditto.
This commit is contained in:
Corinna Vinschen 2006-10-23 15:13:55 +00:00
parent fc545fe933
commit 7a229db654
4 changed files with 59 additions and 6 deletions

View File

@ -1,3 +1,10 @@
2006-10-23 Corinna Vinschen <corinna@vinschen.de>
* fhandler_disk_file.cc (fhandler_disk_file::rewinddir): Accomodate
buggy RestartScan behaviour of Windows 2000.
* wincap.h: Define has_buggy_restart_scan throughout.
* wincap.cc: Ditto.
2006-10-22 Corinna Vinschen <corinna@vinschen.de>
* fhandler_disk_file.cc (fhandler_disk_file::facl): Fix whitespace.

View File

@ -1975,7 +1975,38 @@ void
fhandler_disk_file::rewinddir (DIR *dir)
{
if (wincap.is_winnt ())
d_cachepos (dir) = 0;
{
d_cachepos (dir) = 0;
if (wincap.has_buggy_restart_scan () && isremote ())
{
/* This works around a W2K bug. The RestartScan parameter in calls
to NtQueryDiretoryFile on remote shares is ignored, thus resulting
in not being able to rewind on remote shares. By reopening the
directory, we get a fresh new directory pointers. w*/
UNICODE_STRING fname = {0, CYG_MAX_PATH * 2, (WCHAR *) L""};
OBJECT_ATTRIBUTES attr;
NTSTATUS status;
IO_STATUS_BLOCK io;
HANDLE new_dir;
InitializeObjectAttributes (&attr, &fname, OBJ_CASE_INSENSITIVE,
dir->__handle, NULL);
status = NtOpenFile (&new_dir, SYNCHRONIZE | FILE_LIST_DIRECTORY,
&attr, &io, wincap.shared (),
FILE_SYNCHRONOUS_IO_NONALERT
| FILE_OPEN_FOR_BACKUP_INTENT
| FILE_DIRECTORY_FILE);
if (!NT_SUCCESS (stat))
debug_printf ("Unable to reopen dir %s, NT error: 0x%08x, "
"win32: %lu", get_name (), status,
RtlNtStatusToDosError (status));
else
{
CloseHandle (dir->__handle);
dir->__handle = new_dir;
}
}
}
else if (dir->__handle != INVALID_HANDLE_VALUE)
{
if (dir->__handle)

View File

@ -66,6 +66,7 @@ static NO_COPY wincaps wincap_unknown = {
has_disabled_user_tos_setting:false,
has_fileid_dirinfo:false,
has_exclusiveaddruse:false,
has_buggy_restart_scan:false,
};
static NO_COPY wincaps wincap_95 = {
@ -123,6 +124,7 @@ static NO_COPY wincaps wincap_95 = {
has_disabled_user_tos_setting:false,
has_fileid_dirinfo:false,
has_exclusiveaddruse:false,
has_buggy_restart_scan:false,
};
static NO_COPY wincaps wincap_95osr2 = {
@ -180,6 +182,7 @@ static NO_COPY wincaps wincap_95osr2 = {
has_disabled_user_tos_setting:false,
has_fileid_dirinfo:false,
has_exclusiveaddruse:false,
has_buggy_restart_scan:false,
};
static NO_COPY wincaps wincap_98 = {
@ -237,6 +240,7 @@ static NO_COPY wincaps wincap_98 = {
has_disabled_user_tos_setting:false,
has_fileid_dirinfo:false,
has_exclusiveaddruse:false,
has_buggy_restart_scan:false,
};
static NO_COPY wincaps wincap_98se = {
@ -294,6 +298,7 @@ static NO_COPY wincaps wincap_98se = {
has_disabled_user_tos_setting:false,
has_fileid_dirinfo:false,
has_exclusiveaddruse:false,
has_buggy_restart_scan:false,
};
static NO_COPY wincaps wincap_me = {
@ -351,6 +356,7 @@ static NO_COPY wincaps wincap_me = {
has_disabled_user_tos_setting:false,
has_fileid_dirinfo:false,
has_exclusiveaddruse:false,
has_buggy_restart_scan:false,
};
static NO_COPY wincaps wincap_nt3 = {
@ -408,6 +414,7 @@ static NO_COPY wincaps wincap_nt3 = {
has_disabled_user_tos_setting:false,
has_fileid_dirinfo:false,
has_exclusiveaddruse:false,
has_buggy_restart_scan:false,
};
static NO_COPY wincaps wincap_nt4 = {
@ -465,6 +472,7 @@ static NO_COPY wincaps wincap_nt4 = {
has_disabled_user_tos_setting:false,
has_fileid_dirinfo:false,
has_exclusiveaddruse:false,
has_buggy_restart_scan:false,
};
static NO_COPY wincaps wincap_nt4sp4 = {
@ -521,7 +529,8 @@ static NO_COPY wincaps wincap_nt4sp4 = {
has_working_virtual_lock:true,
has_disabled_user_tos_setting:false,
has_fileid_dirinfo:false,
has_exclusiveaddruse:true
has_exclusiveaddruse:true,
has_buggy_restart_scan:false,
};
static NO_COPY wincaps wincap_2000 = {
@ -578,7 +587,8 @@ static NO_COPY wincaps wincap_2000 = {
has_working_virtual_lock:true,
has_disabled_user_tos_setting:true,
has_fileid_dirinfo:true,
has_exclusiveaddruse:true
has_exclusiveaddruse:true,
has_buggy_restart_scan:true,
};
static NO_COPY wincaps wincap_xp = {
@ -635,7 +645,8 @@ static NO_COPY wincaps wincap_xp = {
has_working_virtual_lock:true,
has_disabled_user_tos_setting:true,
has_fileid_dirinfo:true,
has_exclusiveaddruse:true
has_exclusiveaddruse:true,
has_buggy_restart_scan:false,
};
static NO_COPY wincaps wincap_2003 = {
@ -692,7 +703,8 @@ static NO_COPY wincaps wincap_2003 = {
has_working_virtual_lock:true,
has_disabled_user_tos_setting:true,
has_fileid_dirinfo:true,
has_exclusiveaddruse:true
has_exclusiveaddruse:true,
has_buggy_restart_scan:false,
};
static NO_COPY wincaps wincap_vista = {
@ -749,7 +761,8 @@ static NO_COPY wincaps wincap_vista = {
has_working_virtual_lock:true,
has_disabled_user_tos_setting:true,
has_fileid_dirinfo:true,
has_exclusiveaddruse:true
has_exclusiveaddruse:true,
has_buggy_restart_scan:false,
};
wincapc wincap __attribute__((section (".cygwin_dll_common"), shared));

View File

@ -67,6 +67,7 @@ struct wincaps
unsigned has_disabled_user_tos_setting : 1;
unsigned has_fileid_dirinfo : 1;
unsigned has_exclusiveaddruse : 1;
unsigned has_buggy_restart_scan : 1;
};
class wincapc
@ -140,6 +141,7 @@ public:
bool IMPLEMENT (has_disabled_user_tos_setting)
bool IMPLEMENT (has_fileid_dirinfo)
bool IMPLEMENT (has_exclusiveaddruse)
bool IMPLEMENT (has_buggy_restart_scan)
#undef IMPLEMENT
};