Commit 0efa91de authored by Jason Edmeades's avatar Jason Edmeades Committed by Alexandre Julliard

cmd.exe: Support rd dir1 dir2.

parent cc3dd00c
...@@ -36,6 +36,9 @@ ...@@ -36,6 +36,9 @@
#include "wcmd.h" #include "wcmd.h"
#include <shellapi.h> #include <shellapi.h>
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(cmd);
void WCMD_execute (char *orig_command, char *parameter, char *substitution); void WCMD_execute (char *orig_command, char *parameter, char *substitution);
...@@ -752,44 +755,59 @@ void WCMD_pause (void) { ...@@ -752,44 +755,59 @@ void WCMD_pause (void) {
* Delete a directory. * Delete a directory.
*/ */
void WCMD_remove_dir (void) { void WCMD_remove_dir (char *command) {
if (param1[0] == 0x00) { int argno = 0;
WCMD_output ("Argument missing\n"); int argsProcessed = 0;
return; char *argN = command;
}
/* If subdirectory search not supplied, just try to remove /* Loop through all args */
and report error if it fails (eg if it contains a file) */ while (argN) {
if (strstr (quals, "/S") == NULL) { char *thisArg = WCMD_parameter (command, argno++, &argN);
if (!RemoveDirectory (param1)) WCMD_print_error (); if (argN && argN[0] != '/') {
WINE_TRACE("rd: Processing arg %s (quals:%s)\n", thisArg, quals);
argsProcessed++;
/* Otherwise use ShFileOp to recursively remove a directory */ /* If subdirectory search not supplied, just try to remove
} else { 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 */ SHFILEOPSTRUCT lpDir;
if (strstr (quals, "/Q") == NULL) {
BOOL ok;
char question[MAXSTRING];
/* Ask for confirmation */ /* Ask first */
sprintf(question, "%s, ", param1); if (strstr (quals, "/Q") == NULL) {
ok = WCMD_ask_confirm(question, TRUE); BOOL ok;
char question[MAXSTRING];
/* Abort if answer is 'N' */ /* Ask for confirmation */
if (!ok) return; 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 */ /* Handle no valid args */
lpDir.hwnd = NULL; if (argsProcessed == 0) {
lpDir.pTo = NULL; WCMD_output ("Argument missing\n");
lpDir.pFrom = param1; return;
lpDir.fFlags = FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI;
lpDir.wFunc = FO_DELETE;
if (SHFileOperationA(&lpDir)) WCMD_print_error ();
} }
} }
/**************************************************************************** /****************************************************************************
......
...@@ -55,7 +55,7 @@ void WCMD_print_error (void); ...@@ -55,7 +55,7 @@ void WCMD_print_error (void);
void WCMD_process_command (char *command); void WCMD_process_command (char *command);
void WCMD_pushd (void); void WCMD_pushd (void);
int WCMD_read_console (char *string, int str_len); 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_rename (void);
void WCMD_run_program (char *command, int called); void WCMD_run_program (char *command, int called);
void WCMD_setlocal (const char *command); void WCMD_setlocal (const char *command);
......
...@@ -530,7 +530,7 @@ void WCMD_process_command (char *command) ...@@ -530,7 +530,7 @@ void WCMD_process_command (char *command)
break; break;
case WCMD_RD: case WCMD_RD:
case WCMD_RMDIR: case WCMD_RMDIR:
WCMD_remove_dir (); WCMD_remove_dir (p);
break; break;
case WCMD_SETLOCAL: case WCMD_SETLOCAL:
WCMD_setlocal(p); WCMD_setlocal(p);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment