]> sourceware.org Git - newlib-cygwin.git/commitdiff
* autoload.cc (SHFileOperationA): Define.
authorCorinna Vinschen <corinna@vinschen.de>
Thu, 7 Dec 2006 11:53:46 +0000 (11:53 +0000)
committerCorinna Vinschen <corinna@vinschen.de>
Thu, 7 Dec 2006 11:53:46 +0000 (11:53 +0000)
* syscalls.cc (try_to_bin): New function trying to move a file to
the recycle bin.
(unlink): Fix arguments used in CreateFile for delete on close.
Before closing the handle, try to move the file to the recycle bin.

winsup/cygwin/ChangeLog
winsup/cygwin/autoload.cc
winsup/cygwin/syscalls.cc

index c69b81340535a44ce12e2972c32515af701995c1..49e3443331a3793b0b8e7c207e5df67d29002468 100644 (file)
@@ -1,3 +1,11 @@
+2006-12-07  Corinna Vinschen  <corinna@vinschen.de>
+
+       * autoload.cc (SHFileOperationA): Define.
+       * syscalls.cc (try_to_bin): New function trying to move a file to
+       the recycle bin.
+       (unlink): Fix arguments used in CreateFile for delete on close.
+       Before closing the handle, try to move the file to the recycle bin.
+
 2006-12-07  Corinna Vinschen  <corinna@vinschen.de>
 
        * cygheap.h (struct cwdstuff): Add "sync" member and accompanying
index 1e7fb783ae9dcf6091e1b8958365c68cbb044b8c..2a065317471dca64fb017d7ec0bd8450f0971910 100644 (file)
@@ -527,6 +527,7 @@ LoadDLLfuncEx (Wow64DisableWow64FsRedirection, 4, kernel32, 1)
 LoadDLLfuncEx (Wow64RevertWow64FsRedirection, 4, kernel32, 1)
 
 LoadDLLfunc (SHGetDesktopFolder, 4, shell32)
+LoadDLLfunc (SHFileOperationA, 4, shell32)
 
 LoadDLLfuncEx (waveOutGetNumDevs, 0, winmm, 1)
 LoadDLLfuncEx (waveOutOpen, 24, winmm, 1)
index 3ca624e9a9b9427530485b00454238a269cd92ba..3113ac6b3dd4a65ed6767831c763683d3505c0ac 100644 (file)
@@ -45,6 +45,7 @@ details. */
 #include <winioctl.h>
 #include <lmcons.h> /* for UNLEN */
 #include <rpc.h>
+#include <shellapi.h>
 
 #undef fstat
 #undef lstat
@@ -136,6 +137,42 @@ dup2 (int oldfd, int newfd)
   return cygheap->fdtab.dup2 (oldfd, newfd);
 }
 
+#ifndef FOF_NORECURSION
+#define FOF_NORECURSION 0x1000
+#endif
+#ifndef FOF_NORECURSEREPARSE
+#define FOF_NORECURSEREPARSE 0x8000
+#endif
+
+static void
+try_to_bin (const char *win32_path)
+{
+  /* The op.pFrom parameter must be double \0 terminated since it's not
+     just a filename, but a list of filenames.  If the double \0 is
+     missing, SHFileOperationA returns with error number 1026 (which is
+     not a valid system error number). */
+  char file[CYG_MAX_PATH + 1] = { 0 };
+  SHFILEOPSTRUCT op;
+  int ret;
+
+  op.hwnd = NULL;
+  op.wFunc = FO_DELETE;
+  op.pFrom = strcpy (file, win32_path);
+  op.pTo = NULL;
+  op.fFlags = FOF_ALLOWUNDO
+              | FOF_NOCONFIRMATION
+              | FOF_NOCONFIRMMKDIR
+              | FOF_NOERRORUI
+              | FOF_NORECURSION
+              | FOF_NORECURSEREPARSE
+              | FOF_SILENT;
+  op.fAnyOperationsAborted = FALSE;
+  op.hNameMappings = NULL;
+  op.lpszProgressTitle = NULL;
+  ret = SHFileOperationA (&op);
+  debug_printf ("SHFileOperation (%s) = %d\n", win32_path, ret);
+}
+
 extern "C" int
 unlink (const char *ourname)
 {
@@ -208,12 +245,13 @@ unlink (const char *ourname)
       DWORD flags = FILE_FLAG_DELETE_ON_CLOSE;
       if (win32_name.is_rep_symlink ())
         flags |= FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS;
-      h = CreateFile (win32_name, 0, FILE_SHARE_READ, &sec_none_nih,
+      h = CreateFile (win32_name, DELETE, wincap.shared (), &sec_none_nih,
                      OPEN_EXISTING, flags, 0);
       if (h != INVALID_HANDLE_VALUE)
        {
          if (wincap.has_hard_links () && setattrs)
            SetFileAttributes (win32_name, (DWORD) win32_name);
+         try_to_bin (win32_name.get_win32 ());
          BOOL res = CloseHandle (h);
          syscall_printf ("%d = CloseHandle (%p)", res, h);
          if (GetFileAttributes (win32_name) == INVALID_FILE_ATTRIBUTES
This page took 0.040252 seconds and 5 git commands to generate.