Jason Edmeades : cmd.exe: Add rd /s support.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Feb 27 06:46:12 CST 2007


Module: wine
Branch: master
Commit: 69194ce0d786349d17286d333f7d3252ec0584e5
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=69194ce0d786349d17286d333f7d3252ec0584e5

Author: Jason Edmeades <us at edmeades.me.uk>
Date:   Mon Feb 26 23:04:40 2007 +0000

cmd.exe: Add rd /s support.

---

 programs/cmd/builtins.c |   20 +++++++++++++++++++-
 1 files changed, 19 insertions(+), 1 deletions(-)

diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c
index 9a8b513..4f73fd0 100644
--- a/programs/cmd/builtins.c
+++ b/programs/cmd/builtins.c
@@ -35,6 +35,7 @@
 #define WIN32_LEAN_AND_MEAN
 
 #include "wcmd.h"
+#include <shellapi.h>
 
 void WCMD_execute (char *orig_command, char *parameter, char *substitution);
 
@@ -633,7 +634,24 @@ void WCMD_remove_dir (void) {
     WCMD_output ("Argument missing\n");
     return;
   }
-  if (!RemoveDirectory (param1)) WCMD_print_error ();
+
+  /* If subdirectory search not supplied, just try to remove
+     and report error if it fails (eg if it contains a file) */
+  if (strstr (quals, "/S") == NULL) {
+    if (!RemoveDirectory (param1)) WCMD_print_error ();
+
+  /* Otherwise use ShFileOp to recursively remove a directory */
+  } else {
+
+    /* Do the delete */
+    SHFILEOPSTRUCT lpDir;
+    lpDir.hwnd   = NULL;
+    lpDir.pTo    = NULL;
+    lpDir.pFrom  = param1;
+    lpDir.fFlags = FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI;
+    lpDir.wFunc  = FO_DELETE;
+    if (SHFileOperationA(&lpDir)) WCMD_print_error ();
+  }
 }
 
 /****************************************************************************




More information about the wine-cvs mailing list