* 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:
		| @@ -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. | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
| @@ -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)); | ||||
|   | ||||
| @@ -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 | ||||
| }; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user