Module: wine Branch: master Commit: 0efa91de15c393dc403994049292c1fa9313146f URL: http://source.winehq.org/git/wine.git/?a=commit;h=0efa91de15c393dc4039940492...
Author: Jason Edmeades us@edmeades.me.uk Date: Sun Mar 4 22:33:27 2007 +0000
cmd.exe: Support rd dir1 dir2.
---
programs/cmd/builtins.c | 74 +++++++++++++++++++++++++++++------------------ programs/cmd/wcmd.h | 2 +- programs/cmd/wcmdmain.c | 2 +- 3 files changed, 48 insertions(+), 30 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index 243a589..3aeac71 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -36,6 +36,9 @@
#include "wcmd.h" #include <shellapi.h> +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(cmd);
void WCMD_execute (char *orig_command, char *parameter, char *substitution);
@@ -752,44 +755,59 @@ void WCMD_pause (void) { * Delete a directory. */
-void WCMD_remove_dir (void) { +void WCMD_remove_dir (char *command) {
- if (param1[0] == 0x00) { - WCMD_output ("Argument missing\n"); - return; - } + int argno = 0; + int argsProcessed = 0; + char *argN = command;
- /* 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 (); + /* Loop through all args */ + while (argN) { + char *thisArg = WCMD_parameter (command, argno++, &argN); + if (argN && argN[0] != '/') { + WINE_TRACE("rd: Processing arg %s (quals:%s)\n", thisArg, quals); + argsProcessed++;
- /* Otherwise use ShFileOp to recursively remove a directory */ - } else { + /* 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 (thisArg)) WCMD_print_error ();
- SHFILEOPSTRUCT lpDir; + /* Otherwise use ShFileOp to recursively remove a directory */ + } else {
- /* Ask first */ - if (strstr (quals, "/Q") == NULL) { - BOOL ok; - char question[MAXSTRING]; + SHFILEOPSTRUCT lpDir;
- /* Ask for confirmation */ - sprintf(question, "%s, ", param1); - ok = WCMD_ask_confirm(question, TRUE); + /* Ask first */ + if (strstr (quals, "/Q") == NULL) { + BOOL ok; + char question[MAXSTRING];
- /* Abort if answer is 'N' */ - if (!ok) return; + /* Ask for confirmation */ + sprintf(question, "%s, ", thisArg); + ok = WCMD_ask_confirm(question, TRUE); + + /* Abort if answer is 'N' */ + if (!ok) return; + } + + /* Do the delete */ + lpDir.hwnd = NULL; + lpDir.pTo = NULL; + lpDir.pFrom = thisArg; + lpDir.fFlags = FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI; + lpDir.wFunc = FO_DELETE; + if (SHFileOperationA(&lpDir)) WCMD_print_error (); + } } + }
- /* Do the delete */ - 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 (); + /* Handle no valid args */ + if (argsProcessed == 0) { + WCMD_output ("Argument missing\n"); + return; } + }
/**************************************************************************** diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index d6357f0..61e3044 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -55,7 +55,7 @@ void WCMD_print_error (void); void WCMD_process_command (char *command); void WCMD_pushd (void); int WCMD_read_console (char *string, int str_len); -void WCMD_remove_dir (void); +void WCMD_remove_dir (char *command); void WCMD_rename (void); void WCMD_run_program (char *command, int called); void WCMD_setlocal (const char *command); diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index 40dad28..f0331c5 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -530,7 +530,7 @@ void WCMD_process_command (char *command) break; case WCMD_RD: case WCMD_RMDIR: - WCMD_remove_dir (); + WCMD_remove_dir (p); break; case WCMD_SETLOCAL: WCMD_setlocal(p);