* syscalls.cc (unlink_nt): Don't move files to recycle bin which are
not in use.
This commit is contained in:
		| @@ -1,3 +1,8 @@ | |||||||
|  | 2007-01-12  Corinna Vinschen  <corinna@vinschen.de> | ||||||
|  |  | ||||||
|  | 	* syscalls.cc (unlink_nt): Don't move files to recycle bin which are | ||||||
|  | 	not in use. | ||||||
|  |  | ||||||
| 2007-01-13  Christopher Faylor  <me@cgf.cx> | 2007-01-13  Christopher Faylor  <me@cgf.cx> | ||||||
|  |  | ||||||
| 	* glob.cc: Update copyright notice with latest from FreeBSD. | 	* glob.cc: Update copyright notice with latest from FreeBSD. | ||||||
|   | |||||||
| @@ -253,8 +253,9 @@ unlink_nt (path_conv &win32_name, bool setattrs) | |||||||
|      though the other process still has an open handle.  This other process |      though the other process still has an open handle.  This other process | ||||||
|      than gets Win32 error 59, ERROR_UNEXP_NET_ERR when trying to access the |      than gets Win32 error 59, ERROR_UNEXP_NET_ERR when trying to access the | ||||||
|      file. |      file. | ||||||
|      That does not happen when using DeleteFile, which nicely succeeds but |      That does not happen when using DeleteFile (NtSetInformationFile, class | ||||||
|      still, the file is available for the other process. |      FileDispositionInformation), which nicely succeeds but still, the file | ||||||
|  |      is available for the other process. | ||||||
|      Microsoft KB 837665 describes this problem as a bug in 2K3, but I have |      Microsoft KB 837665 describes this problem as a bug in 2K3, but I have | ||||||
|      reproduced it on shares on Samba 2.2.8, Samba 3.0.2, NT4SP6, XP64SP1 and |      reproduced it on shares on Samba 2.2.8, Samba 3.0.2, NT4SP6, XP64SP1 and | ||||||
|      2K3 and in all cases, DeleteFile works, "delete on close" does not. */ |      2K3 and in all cases, DeleteFile works, "delete on close" does not. */ | ||||||
| @@ -268,7 +269,19 @@ unlink_nt (path_conv &win32_name, bool setattrs) | |||||||
|   win32_name.get_nt_native_path (upath); |   win32_name.get_nt_native_path (upath); | ||||||
|   InitializeObjectAttributes (&attr, &upath, OBJ_CASE_INSENSITIVE | OBJ_INHERIT, |   InitializeObjectAttributes (&attr, &upath, OBJ_CASE_INSENSITIVE | OBJ_INHERIT, | ||||||
| 			      NULL, sec_none_nih.lpSecurityDescriptor); | 			      NULL, sec_none_nih.lpSecurityDescriptor); | ||||||
|   status = NtOpenFile (&h, DELETE, &attr, &io, wincap.shared (), flags); |   /* First try to open the file with sharing not allowed.  If the file | ||||||
|  |      has an open handle on it, this will fail.  That indicates that the | ||||||
|  |      file has to be moved to the recycle bin so that it actually disappears | ||||||
|  |      from its directory even though its in use.  Otherwise, if opening | ||||||
|  |      doesn't fail, the file is not in use and by simply closing the handle | ||||||
|  |      the file will disappear. */ | ||||||
|  |   bool move_to_bin = false; | ||||||
|  |   status = NtOpenFile (&h, DELETE, &attr, &io, 0, flags); | ||||||
|  |   if (status == STATUS_SHARING_VIOLATION) | ||||||
|  |     { | ||||||
|  |       move_to_bin = true; | ||||||
|  |       status = NtOpenFile (&h, DELETE, &attr, &io, wincap.shared (), flags); | ||||||
|  |     } | ||||||
|   if (!NT_SUCCESS (status)) |   if (!NT_SUCCESS (status)) | ||||||
|     { |     { | ||||||
|       if (status == STATUS_DELETE_PENDING) |       if (status == STATUS_DELETE_PENDING) | ||||||
| @@ -283,7 +296,7 @@ unlink_nt (path_conv &win32_name, bool setattrs) | |||||||
|   if (setattrs) |   if (setattrs) | ||||||
|     SetFileAttributes (win32_name, (DWORD) win32_name); |     SetFileAttributes (win32_name, (DWORD) win32_name); | ||||||
|  |  | ||||||
|   if (!win32_name.isremote ()) |   if (move_to_bin && !win32_name.isremote ()) | ||||||
|     try_to_bin (win32_name, h); |     try_to_bin (win32_name, h); | ||||||
|  |  | ||||||
|   DWORD lasterr = 0; |   DWORD lasterr = 0; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user