From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/builtins.c | 20 +++++++++++++------- programs/cmd/tests/test_builtins.cmd.exp | 8 ++++---- programs/cmd/wcmd.h | 2 +- programs/cmd/wcmdmain.c | 2 +- 4 files changed, 19 insertions(+), 13 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index 7b4bc3b61bb..6e0a7830900 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -1875,15 +1875,19 @@ RETURN_CODE WCMD_goto(void) * Push a directory onto the stack */
-void WCMD_pushd (const WCHAR *args) +RETURN_CODE WCMD_pushd(const WCHAR *args) { struct env_stack *curdir; WCHAR *thisdir; + RETURN_CODE return_code; + + if (!*args) + return errorlevel = NO_ERROR;
if (wcschr(args, '/') != NULL) { SetLastError(ERROR_INVALID_PARAMETER); WCMD_print_error(); - return; + return errorlevel = ERROR_INVALID_FUNCTION; }
curdir = LocalAlloc (LMEM_FIXED, sizeof (struct env_stack)); @@ -1892,18 +1896,19 @@ void WCMD_pushd (const WCHAR *args) LocalFree(curdir); LocalFree(thisdir); WINE_ERR ("out of memory\n"); - return; + return errorlevel = ERROR_INVALID_FUNCTION; }
/* Change directory using CD code with /D parameter */ lstrcpyW(quals, L"/D"); GetCurrentDirectoryW (1024, thisdir); - errorlevel = NO_ERROR; - WCMD_setshow_default(args); - if (errorlevel) { + + return_code = WCMD_setshow_default(args); + if (return_code != NO_ERROR) + { LocalFree(curdir); LocalFree(thisdir); - return; + return errorlevel = ERROR_INVALID_FUNCTION; } else { curdir -> next = pushd_directories; curdir -> strings = thisdir; @@ -1914,6 +1919,7 @@ void WCMD_pushd (const WCHAR *args) } pushd_directories = curdir; } + return errorlevel = return_code; }
diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index 8d5926580d9..eb6abb14dea 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -508,12 +508,12 @@ FAILURE 1 SUCCESS 0 SUCCESS 0 --- success/failure for PUSHD/POPD commands -@todo_wine@SUCCESS 0 SUCCESS 0 +SUCCESS 0 +FAILURE 1 +SUCCESS 666 @todo_wine@FAILURE 1 -@todo_wine@SUCCESS 666 -@todo_wine@FAILURE 1 -@todo_wine@--- success/failure for DIR command +--- success/failure for DIR command FAILURE 1 FAILURE 1 SUCCESS 0 diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index 0ca14e9f2ac..93620f05656 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -188,7 +188,7 @@ void WCMD_output_asis_stderr (const WCHAR *message); void WCMD_pause (void); void WCMD_popd (void); void WCMD_print_error (void); -void WCMD_pushd (const WCHAR *args); +RETURN_CODE WCMD_pushd(const WCHAR *args); void WCMD_remove_dir (WCHAR *command); RETURN_CODE WCMD_rename(void); void WCMD_run_program (WCHAR *command, BOOL called); diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index dc7da5979be..f8a08878fcb 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1909,7 +1909,7 @@ static RETURN_CODE execute_single_command(const WCHAR *command) WCMD_volume (FALSE, parms_start); break; case WCMD_PUSHD: - WCMD_pushd(parms_start); + return_code = WCMD_pushd(parms_start); break; case WCMD_POPD: WCMD_popd();