This is part XVI of cmd engine rewrite.
Nothing fancy, mainly setting success/failure return code for a bunch of commands. Some code cleanup.
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/tests/test_builtins.cmd | 34 ++++++++++++++++++++++++ programs/cmd/tests/test_builtins.cmd.exp | 32 +++++++++++++++++++++- 2 files changed, 65 insertions(+), 1 deletion(-)
diff --git a/programs/cmd/tests/test_builtins.cmd b/programs/cmd/tests/test_builtins.cmd index fed8c20c587..ba8a2cb7619 100644 --- a/programs/cmd/tests/test_builtins.cmd +++ b/programs/cmd/tests/test_builtins.cmd @@ -591,6 +591,40 @@ call :setError 666 & rmdir abc & echo ERRORLEVEL !errorlevel! call :setError 666 & rmdir @:\cba\abc & echo ERRORLEVEL !errorlevel! cd .. && rd /q /s foo
+echo --- success/failure for SETLOCAL/ENDLOCAL commands +call :setError 666 & (setlocal foobar &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (setlocal &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (endlocal foobar &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (setlocal DisableExtensions &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (setlocal EnableExtensions &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +echo --- success/failure for DATE command +call :setError 666 & (date /t >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (date AAAA >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +rem need evelated priviledges to set the date +echo --- success/failure for TIME command +call :setError 666 & (time /t >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (time AAAA >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +rem need evelated priviledges to set the time +echo --- success/failure for BREAK command +call :setError 666 & (break &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (break 345 &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +echo --- success/failure for VER command +call :setError 666 & (ver >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (ver foo >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (ver /f >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +echo --- success/failure for VERIFY command +call :setError 666 & (verify >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (verify on >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (verify foobar >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +echo --- success/failure for VOL command +call :setError 666 & (vol >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (vol c: >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (vol foobar >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (vol /Z >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +echo --- success/failure for LABEL command +call :setError 666 & (label /Z >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +rem need evelated priviledges to test + echo --- setlocal DisableDelayedExpansion echo ------------ Testing 'set' ------------ diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index c7119858d85..75152663850 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -535,7 +535,37 @@ ERRORLEVEL 666 ERRORLEVEL 666 ERRORLEVEL 666 ERRORLEVEL 666 ---- +--- success/failure for SETLOCAL/ENDLOCAL commands +@todo_wine@FAILURE 1 +@todo_wine@SUCCESS 0 +SUCCESS 666 +@todo_wine@SUCCESS@space@ +@todo_wine@SUCCESS 0 +--- success/failure for DATE command +@todo_wine@SUCCESS 0 +@todo_wine@FAILURE 1 +--- success/failure for TIME command +@todo_wine@SUCCESS 0 +@todo_wine@FAILURE 1 +--- success/failure for BREAK command +@todo_wine@SUCCESS 666 +@todo_wine@SUCCESS 666 +--- success/failure for VER command +@todo_wine@SUCCESS 0 +@todo_wine@SUCCESS 0 +@todo_wine@FAILURE 1 +--- success/failure for VERIFY command +@todo_wine@SUCCESS 0 +@todo_wine@SUCCESS 0 +@todo_wine@FAILURE 1 +--- success/failure for VOL command +@todo_wine@SUCCESS 0 +@todo_wine@SUCCESS 0 +@todo_wine@FAILURE 1 +@todo_wine@FAILURE 1 +--- success/failure for LABEL command +@todo_wine@FAILURE 1 +@todo_wine@--- ------------ Testing 'set' ------------ 1 0
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/builtins.c | 49 ++++++++++++++---------- programs/cmd/tests/test_builtins.cmd.exp | 8 ++-- programs/cmd/wcmd.h | 4 +- programs/cmd/wcmdmain.c | 4 +- 4 files changed, 37 insertions(+), 28 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index febf6ba94b6..bf089a8b9f5 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -2298,33 +2298,40 @@ static WCHAR *WCMD_dupenv( const WCHAR *env ) * setlocal pushes the environment onto a stack * Save the environment as unicode so we don't screw anything up. */ -void WCMD_setlocal (const WCHAR *s) { +RETURN_CODE WCMD_setlocal(WCHAR *args) +{ WCHAR *env; struct env_stack *env_copy; WCHAR cwd[MAX_PATH]; BOOL newdelay; + int argno = 0; + WCHAR *argN = args;
/* setlocal does nothing outside of batch programs */ - if (!context) return; - - /* DISABLEEXTENSIONS ignored */ - - /* ENABLEDELAYEDEXPANSION / DISABLEDELAYEDEXPANSION could be parm1 or parm2 - (if both ENABLEEXTENSIONS and ENABLEDELAYEDEXPANSION supplied for example) */ - if (!wcsicmp(param1, L"ENABLEDELAYEDEXPANSION") || !wcsicmp(param2, L"ENABLEDELAYEDEXPANSION")) { - newdelay = TRUE; - } else if (!wcsicmp(param1, L"DISABLEDELAYEDEXPANSION") || !wcsicmp(param2, L"DISABLEDELAYEDEXPANSION")) { - newdelay = FALSE; - } else { - newdelay = delayedsubst; + if (!context) + return NO_ERROR; + newdelay = delayedsubst; + while (argN) + { + WCHAR *thisArg = WCMD_parameter (args, argno++, &argN, FALSE, FALSE); + if (!thisArg || !*thisArg) break; + if (!wcsicmp(thisArg, L"ENABLEDELAYEDEXPANSION")) + newdelay = TRUE; + else if (!wcsicmp(thisArg, L"DISABLEDELAYEDEXPANSION")) + newdelay = FALSE; + /* ENABLE/DISABLE EXTENSIONS ignored for now */ + else if (!wcsicmp(thisArg, L"ENABLEEXTENSIONS") || !wcsicmp(thisArg, L"DISABLEEXTENSIONS")) + {} + else + return errorlevel = ERROR_INVALID_FUNCTION; + TRACE("Setting delayed expansion to %d\n", newdelay); } - WINE_TRACE("Setting delayed expansion to %d\n", newdelay);
env_copy = LocalAlloc (LMEM_FIXED, sizeof (struct env_stack)); if( !env_copy ) { - WINE_ERR ("out of memory\n"); - return; + ERR("out of memory\n"); + return errorlevel = ERROR_OUTOFMEMORY; }
env = GetEnvironmentStringsW (); @@ -2345,7 +2352,7 @@ void WCMD_setlocal (const WCHAR *s) { LocalFree (env_copy);
FreeEnvironmentStringsW (env); - + return errorlevel = NO_ERROR; }
/***************************************************************************** @@ -2355,18 +2362,19 @@ void WCMD_setlocal (const WCHAR *s) { * Note: When searching for '=', search from WCHAR position 1, to handle * special internal environment variables =C:, =D: etc */ -void WCMD_endlocal (void) { +RETURN_CODE WCMD_endlocal(void) +{ WCHAR *env, *old, *p; struct env_stack *temp; int len, n;
/* setlocal does nothing outside of batch programs */ - if (!context) return; + if (!context) return NO_ERROR;
/* setlocal needs a saved environment from within the same context (batch program) as it was saved in */ if (!saved_environment || saved_environment->batchhandle != context->h) - return; + return ERROR_INVALID_FUNCTION;
/* pop the old environment from the stack */ temp = saved_environment; @@ -2419,6 +2427,7 @@ void WCMD_endlocal (void) {
LocalFree (env); LocalFree (temp); + return NO_ERROR; }
/***************************************************************************** diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index 75152663850..c883758cf32 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -536,11 +536,11 @@ ERRORLEVEL 666 ERRORLEVEL 666 ERRORLEVEL 666 --- success/failure for SETLOCAL/ENDLOCAL commands -@todo_wine@FAILURE 1 -@todo_wine@SUCCESS 0 +FAILURE 1 +SUCCESS 0 SUCCESS 666 @todo_wine@SUCCESS@space@ -@todo_wine@SUCCESS 0 +SUCCESS 0 --- success/failure for DATE command @todo_wine@SUCCESS 0 @todo_wine@FAILURE 1 @@ -739,7 +739,7 @@ foo bar@or_broken@foo gotitright 33 -@todo_wine@0@or_broken@1 +0@or_broken@1 foo !WINE_FOO! not empty diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index 5f51a4e1f3a..3c259ec0eb9 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -171,7 +171,7 @@ RETURN_CODE WCMD_create_dir(WCHAR *); RETURN_CODE WCMD_delete(WCHAR *); RETURN_CODE WCMD_directory(WCHAR *); RETURN_CODE WCMD_echo(const WCHAR *); -void WCMD_endlocal (void); +RETURN_CODE WCMD_endlocal(void); void WCMD_enter_paged_mode(const WCHAR *); RETURN_CODE WCMD_exit(void); BOOL WCMD_get_fullpath(const WCHAR *, SIZE_T, WCHAR *, WCHAR **); @@ -192,7 +192,7 @@ RETURN_CODE WCMD_pushd(const WCHAR *args); RETURN_CODE WCMD_remove_dir(WCHAR *command); RETURN_CODE WCMD_rename(void); void WCMD_run_program (WCHAR *command, BOOL called); -void WCMD_setlocal (const WCHAR *args); +RETURN_CODE WCMD_setlocal(WCHAR *args); void WCMD_setshow_date (void); RETURN_CODE WCMD_setshow_default(const WCHAR *args); void WCMD_setshow_env (WCHAR *command); diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index ce48b16d7ec..feb5e75281e 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1878,10 +1878,10 @@ static RETURN_CODE execute_single_command(const WCHAR *command) return_code = WCMD_remove_dir(parms_start); break; case WCMD_SETLOCAL: - WCMD_setlocal(parms_start); + return_code = WCMD_setlocal(parms_start); break; case WCMD_ENDLOCAL: - WCMD_endlocal(); + return_code = WCMD_endlocal(); break; case WCMD_SET: WCMD_setshow_env (parms_start);
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/builtins.c | 14 ++++++++++---- programs/cmd/tests/test_builtins.cmd.exp | 8 ++++---- programs/cmd/wcmd.h | 4 ++-- programs/cmd/wcmdmain.c | 4 ++-- 4 files changed, 18 insertions(+), 12 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index bf089a8b9f5..843274b7969 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -2547,8 +2547,9 @@ RETURN_CODE WCMD_setshow_default(const WCHAR *args) * FIXME: Can't change date yet */
-void WCMD_setshow_date (void) { - +RETURN_CODE WCMD_setshow_date(void) +{ + RETURN_CODE return_code = NO_ERROR; WCHAR curdate[64], buffer[64]; DWORD count;
@@ -2566,8 +2567,10 @@ void WCMD_setshow_date (void) { else WCMD_print_error (); } else { + return_code = ERROR_INVALID_FUNCTION; WCMD_output_stderr (WCMD_LoadMessage(WCMD_NYI)); } + return errorlevel = return_code; }
/**************************************************************************** @@ -3333,8 +3336,9 @@ void WCMD_setshow_prompt (void) { * FIXME: Can't change time yet */
-void WCMD_setshow_time (void) { - +RETURN_CODE WCMD_setshow_time(void) +{ + RETURN_CODE return_code = NO_ERROR; WCHAR curtime[64], buffer[64]; DWORD count; SYSTEMTIME st; @@ -3354,8 +3358,10 @@ void WCMD_setshow_time (void) { else WCMD_print_error (); } else { + return_code = ERROR_INVALID_FUNCTION; WCMD_output_stderr (WCMD_LoadMessage(WCMD_NYI)); } + return errorlevel = return_code; }
/**************************************************************************** diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index c883758cf32..4d84079f6d4 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -542,11 +542,11 @@ SUCCESS 666 @todo_wine@SUCCESS@space@ SUCCESS 0 --- success/failure for DATE command -@todo_wine@SUCCESS 0 -@todo_wine@FAILURE 1 +SUCCESS 0 +FAILURE 1 --- success/failure for TIME command -@todo_wine@SUCCESS 0 -@todo_wine@FAILURE 1 +SUCCESS 0 +FAILURE 1 --- success/failure for BREAK command @todo_wine@SUCCESS 666 @todo_wine@SUCCESS 666 diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index 3c259ec0eb9..edcd6dce56e 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -193,12 +193,12 @@ RETURN_CODE WCMD_remove_dir(WCHAR *command); RETURN_CODE WCMD_rename(void); void WCMD_run_program (WCHAR *command, BOOL called); RETURN_CODE WCMD_setlocal(WCHAR *args); -void WCMD_setshow_date (void); +RETURN_CODE WCMD_setshow_date(void); RETURN_CODE WCMD_setshow_default(const WCHAR *args); void WCMD_setshow_env (WCHAR *command); void WCMD_setshow_path (const WCHAR *args); void WCMD_setshow_prompt (void); -void WCMD_setshow_time (void); +RETURN_CODE WCMD_setshow_time(void); void WCMD_shift (const WCHAR *args); void WCMD_start (WCHAR *args); void WCMD_title (const WCHAR *); diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index feb5e75281e..84692121d8b 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1830,7 +1830,7 @@ static RETURN_CODE execute_single_command(const WCHAR *command) WCMD_change_tty (); break; case WCMD_DATE: - WCMD_setshow_date (); + return_code = WCMD_setshow_date(); break; case WCMD_DEL: case WCMD_ERASE: @@ -1893,7 +1893,7 @@ static RETURN_CODE execute_single_command(const WCHAR *command) WCMD_start (parms_start); break; case WCMD_TIME: - WCMD_setshow_time (); + return_code = WCMD_setshow_time(); break; case WCMD_TITLE: if (lstrlenW(&whichcmd[count]) > 0)
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/builtins.c | 18 +++++++++++++++--- programs/cmd/tests/test_builtins.cmd.exp | 6 +++--- programs/cmd/wcmd.h | 2 +- programs/cmd/wcmdmain.c | 5 ++--- 4 files changed, 21 insertions(+), 10 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index 843274b7969..e2c64221bb2 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -3724,10 +3724,22 @@ void WCMD_verify (const WCHAR *args) { * Display version info. */
-void WCMD_version (void) { - - WCMD_output_asis (version_string); +RETURN_CODE WCMD_version(void) +{ + RETURN_CODE return_code;
+ WCMD_output_asis(L"\r\n"); + if (*quals) + { + WCMD_output_stderr(WCMD_LoadMessage(WCMD_SYNTAXERR)); + return_code = ERROR_INVALID_FUNCTION; + } + else + { + WCMD_output_asis(version_string); + return_code = NO_ERROR; + } + return errorlevel = return_code; }
/**************************************************************************** diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index 4d84079f6d4..fc968a6d0a0 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -551,9 +551,9 @@ FAILURE 1 @todo_wine@SUCCESS 666 @todo_wine@SUCCESS 666 --- success/failure for VER command -@todo_wine@SUCCESS 0 -@todo_wine@SUCCESS 0 -@todo_wine@FAILURE 1 +SUCCESS 0 +SUCCESS 0 +FAILURE 1 --- success/failure for VERIFY command @todo_wine@SUCCESS 0 @todo_wine@SUCCESS 0 diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index edcd6dce56e..62c07af021f 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -204,7 +204,7 @@ void WCMD_start (WCHAR *args); void WCMD_title (const WCHAR *); RETURN_CODE WCMD_type(WCHAR *); void WCMD_verify (const WCHAR *args); -void WCMD_version (void); +RETURN_CODE WCMD_version(void); int WCMD_volume (BOOL set_label, const WCHAR *args); void WCMD_mklink(WCHAR *args);
diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index 84692121d8b..817400aec0e 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1903,8 +1903,7 @@ static RETURN_CODE execute_single_command(const WCHAR *command) return_code = WCMD_type(parms_start); break; case WCMD_VER: - WCMD_output_asis(L"\r\n"); - WCMD_version (); + return_code = WCMD_version(); break; case WCMD_VERIFY: WCMD_verify (parms_start); @@ -4181,7 +4180,7 @@ int __cdecl wmain (int argc, WCHAR *argvW[]) */
interactive = TRUE; - if (!opt_k) WCMD_version (); + if (!opt_k) WCMD_output_asis(version_string); if (echo_mode) WCMD_output_asis(L"\r\n"); /* Read until EOF (which for std input is never, but if redirect in place, may occur */ while ((rpl_status = WCMD_ReadAndParseLine(NULL, &toExecute, GetStdHandle(STD_INPUT_HANDLE))) != RPL_EOF)
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/builtins.c | 35 +++++++++++------------- programs/cmd/tests/test_builtins.cmd.exp | 6 ++-- programs/cmd/wcmd.h | 2 +- programs/cmd/wcmdmain.c | 2 +- 4 files changed, 21 insertions(+), 24 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index e2c64221bb2..2f6e34f6172 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -3697,25 +3697,22 @@ void WCMD_more (WCHAR *args) { * it... */
-void WCMD_verify (const WCHAR *args) { - - int count; - - count = lstrlenW(args); - if (count == 0) { - if (verify_mode) WCMD_output(WCMD_LoadMessage(WCMD_VERIFYPROMPT), L"ON"); - else WCMD_output (WCMD_LoadMessage(WCMD_VERIFYPROMPT), L"OFF"); - return; - } - if (lstrcmpiW(args, L"ON") == 0) { - verify_mode = TRUE; - return; - } - else if (lstrcmpiW(args, L"OFF") == 0) { - verify_mode = FALSE; - return; - } - else WCMD_output_stderr(WCMD_LoadMessage(WCMD_VERIFYERR)); +RETURN_CODE WCMD_verify(void) +{ + RETURN_CODE return_code = NO_ERROR; + + if (!param1[0]) + WCMD_output(WCMD_LoadMessage(WCMD_VERIFYPROMPT), verify_mode ? L"ON" : L"OFF"); + else if (lstrcmpiW(param1, L"ON") == 0) + verify_mode = TRUE; + else if (lstrcmpiW(param1, L"OFF") == 0) + verify_mode = FALSE; + else + { + WCMD_output_stderr(WCMD_LoadMessage(WCMD_VERIFYERR)); + return_code = ERROR_INVALID_FUNCTION; + } + return errorlevel = return_code; }
/**************************************************************************** diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index fc968a6d0a0..2b6f735c4ba 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -555,9 +555,9 @@ SUCCESS 0 SUCCESS 0 FAILURE 1 --- success/failure for VERIFY command -@todo_wine@SUCCESS 0 -@todo_wine@SUCCESS 0 -@todo_wine@FAILURE 1 +SUCCESS 0 +SUCCESS 0 +FAILURE 1 --- success/failure for VOL command @todo_wine@SUCCESS 0 @todo_wine@SUCCESS 0 diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index 62c07af021f..60504cdc3fe 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -203,7 +203,7 @@ void WCMD_shift (const WCHAR *args); void WCMD_start (WCHAR *args); void WCMD_title (const WCHAR *); RETURN_CODE WCMD_type(WCHAR *); -void WCMD_verify (const WCHAR *args); +RETURN_CODE WCMD_verify(void); RETURN_CODE WCMD_version(void); int WCMD_volume (BOOL set_label, const WCHAR *args); void WCMD_mklink(WCHAR *args); diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index 817400aec0e..7ede9ae09ab 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1906,7 +1906,7 @@ static RETURN_CODE execute_single_command(const WCHAR *command) return_code = WCMD_version(); break; case WCMD_VERIFY: - WCMD_verify (parms_start); + return_code = WCMD_verify(); break; case WCMD_VOL: WCMD_volume (FALSE, parms_start);
From: Eric Pouech epouech@codeweavers.com
Adding dedicated entry point for VOL command (ie not shared with LABEL command), and introducing a helper to display volume information.
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/builtins.c | 46 +++++++++++++++++++++++- programs/cmd/directory.c | 12 +++---- programs/cmd/tests/test_builtins.cmd.exp | 8 ++--- programs/cmd/wcmd.h | 5 ++- programs/cmd/wcmdmain.c | 4 +-- 5 files changed, 61 insertions(+), 14 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index 2f6e34f6172..09d6ce631b8 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -3739,6 +3739,22 @@ RETURN_CODE WCMD_version(void) return errorlevel = return_code; }
+BOOL WCMD_print_volume_information(const WCHAR *path) +{ + WCHAR label[MAX_PATH]; + DWORD serial; + + if (!GetVolumeInformationW(path, label, ARRAY_SIZE(label), &serial, NULL, NULL, NULL, 0)) + return FALSE; + if (label[0]) + WCMD_output(WCMD_LoadMessage(WCMD_VOLUMELABEL), path[0], label); + else + WCMD_output(WCMD_LoadMessage(WCMD_VOLUMENOLABEL), path[0]); + + WCMD_output(WCMD_LoadMessage(WCMD_VOLUMESERIALNO), HIWORD(serial), LOWORD(serial)); + return TRUE; +} + /**************************************************************************** * WCMD_volume * @@ -3747,7 +3763,7 @@ RETURN_CODE WCMD_version(void) * Returns 1 on success, 0 otherwise */
-int WCMD_volume(BOOL set_label, const WCHAR *path) +int WCMD_old_volume(BOOL set_label, const WCHAR *path) { DWORD count, serial; WCHAR string[MAX_PATH], label[MAX_PATH], curdir[MAX_PATH]; @@ -3800,6 +3816,34 @@ int WCMD_volume(BOOL set_label, const WCHAR *path) return 1; }
+RETURN_CODE WCMD_volume(void) +{ + WCHAR curdir[MAX_PATH]; + RETURN_CODE return_code = NO_ERROR; + + if (*quals) + return errorlevel = ERROR_INVALID_FUNCTION; + if (!*param1) + { + if (!GetCurrentDirectoryW(ARRAY_SIZE(curdir), curdir)) + return errorlevel = ERROR_INVALID_FUNCTION; + } + else if (param1[1] == L':' && !param1[2]) + { + memcpy(curdir, param1, 2 * sizeof(WCHAR)); + } + else + return errorlevel = ERROR_INVALID_FUNCTION; + curdir[2] = L'\'; + curdir[3] = L'\0'; + if (!WCMD_print_volume_information(curdir)) + { + return_code = GetLastError(); + WCMD_print_error(); + } + return errorlevel = return_code; +} + /************************************************************************** * WCMD_exit * diff --git a/programs/cmd/directory.c b/programs/cmd/directory.c index fdcae9f6a94..3f4f7853710 100644 --- a/programs/cmd/directory.c +++ b/programs/cmd/directory.c @@ -934,14 +934,14 @@ RETURN_CODE WCMD_directory(WCHAR *args) lastDrive = towupper(thisEntry->dirName[0]);
if (!bare) { - WCHAR drive[3]; - + WCHAR drive[4]; WINE_TRACE("Writing volume for '%c:'\n", thisEntry->dirName[0]); - memcpy(drive, thisEntry->dirName, 2 * sizeof(WCHAR)); - drive[2] = 0x00; - status = WCMD_volume (0, drive); + drive[0] = thisEntry->dirName[0]; + drive[1] = thisEntry->dirName[1]; + drive[2] = L'\'; + drive[3] = L'\0'; trailerReqd = TRUE; - if (!status) { + if (!WCMD_print_volume_information(drive)) { errorlevel = ERROR_INVALID_FUNCTION; goto exit; } diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index 2b6f735c4ba..6358d35ca49 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -559,10 +559,10 @@ SUCCESS 0 SUCCESS 0 FAILURE 1 --- success/failure for VOL command -@todo_wine@SUCCESS 0 -@todo_wine@SUCCESS 0 -@todo_wine@FAILURE 1 -@todo_wine@FAILURE 1 +SUCCESS 0 +SUCCESS 0 +FAILURE 1 +FAILURE 1 --- success/failure for LABEL command @todo_wine@FAILURE 1 @todo_wine@--- diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index 60504cdc3fe..3c1ebf0a2f0 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -159,6 +159,8 @@ typedef int RETURN_CODE; /* temporary to detect builtin commands not migrated to handle return code */ #define RETURN_CODE_OLD_CHAINING (-999998)
+BOOL WCMD_print_volume_information(const WCHAR *); + void WCMD_assoc (const WCHAR *, BOOL); RETURN_CODE WCMD_batch(const WCHAR *, WCHAR *, const WCHAR *, HANDLE); RETURN_CODE WCMD_call(WCHAR *command); @@ -205,7 +207,8 @@ void WCMD_title (const WCHAR *); RETURN_CODE WCMD_type(WCHAR *); RETURN_CODE WCMD_verify(void); RETURN_CODE WCMD_version(void); -int WCMD_volume (BOOL set_label, const WCHAR *args); +RETURN_CODE WCMD_volume(void); +int WCMD_old_volume (BOOL set_label, const WCHAR *args); void WCMD_mklink(WCHAR *args);
WCHAR *WCMD_fgets (WCHAR *buf, DWORD n, HANDLE stream); diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index 7ede9ae09ab..24da1d3630a 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1849,7 +1849,7 @@ static RETURN_CODE execute_single_command(const WCHAR *command) WCMD_give_help (parms_start); break; case WCMD_LABEL: - WCMD_volume (TRUE, parms_start); + WCMD_old_volume (TRUE, parms_start); break; case WCMD_MD: case WCMD_MKDIR: @@ -1909,7 +1909,7 @@ static RETURN_CODE execute_single_command(const WCHAR *command) return_code = WCMD_verify(); break; case WCMD_VOL: - WCMD_volume (FALSE, parms_start); + return_code = WCMD_volume(); break; case WCMD_PUSHD: return_code = WCMD_pushd(parms_start);
From: Eric Pouech epouech@codeweavers.com
And finish the separation for LABEL & VOLUME commands entry points.
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/builtins.c | 82 +++++++++++------------- programs/cmd/tests/test_builtins.cmd.exp | 4 +- programs/cmd/wcmd.h | 2 +- programs/cmd/wcmdmain.c | 2 +- 4 files changed, 41 insertions(+), 49 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index 09d6ce631b8..1008802b12e 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -3756,64 +3756,56 @@ BOOL WCMD_print_volume_information(const WCHAR *path) }
/**************************************************************************** - * WCMD_volume + * WCMD_label * - * Display volume information (set_label = FALSE) - * Additionally set volume label (set_label = TRUE) - * Returns 1 on success, 0 otherwise + * Set volume label */
-int WCMD_old_volume(BOOL set_label, const WCHAR *path) +RETURN_CODE WCMD_label(void) { - DWORD count, serial; - WCHAR string[MAX_PATH], label[MAX_PATH], curdir[MAX_PATH]; - BOOL status; + DWORD count; + WCHAR string[MAX_PATH], curdir[MAX_PATH];
- if (!*path) { - status = GetCurrentDirectoryW(ARRAY_SIZE(curdir), curdir); - if (!status) { - WCMD_print_error (); - return 0; + /* FIXME incomplete implementation: + * - no support for /MP qualifier, + * - no support for passing label as parameter + */ + if (*quals) + return errorlevel = ERROR_INVALID_FUNCTION; + if (!*param1) { + if (!GetCurrentDirectoryW(ARRAY_SIZE(curdir), curdir)) { + WCMD_print_error(); + return errorlevel = ERROR_INVALID_FUNCTION; } - status = GetVolumeInformationW(NULL, label, ARRAY_SIZE(label), &serial, NULL, NULL, NULL, 0); } - else { - if ((path[1] != ':') || (lstrlenW(path) != 2)) { + else if (param1[1] == ':' && !param1[2]) { + curdir[0] = param1[0]; + curdir[1] = param1[1]; + } else { WCMD_output_stderr(WCMD_LoadMessage(WCMD_SYNTAXERR)); - return 0; - } - wsprintfW (curdir, L"%s\", path); - status = GetVolumeInformationW(curdir, label, ARRAY_SIZE(label), &serial, NULL, NULL, NULL, 0); - } - if (!status) { - WCMD_print_error (); - return 0; + return errorlevel = ERROR_INVALID_FUNCTION; } - if (label[0] != '\0') { - WCMD_output (WCMD_LoadMessage(WCMD_VOLUMELABEL), - curdir[0], label); + curdir[2] = L'\'; + curdir[3] = L'\0'; + if (!WCMD_print_volume_information(curdir)) { + WCMD_print_error(); + return errorlevel = ERROR_INVALID_FUNCTION; } - else { - WCMD_output (WCMD_LoadMessage(WCMD_VOLUMENOLABEL), - curdir[0]); + + if (WCMD_ReadFile(GetStdHandle(STD_INPUT_HANDLE), string, ARRAY_SIZE(string), &count) && + count > 1) { + string[count-1] = '\0'; /* ReadFile output is not null-terminatrred! */ + if (string[count-2] == '\r') string[count-2] = '\0'; /* Under Windoze we get CRLF! */ } - WCMD_output (WCMD_LoadMessage(WCMD_VOLUMESERIALNO), - HIWORD(serial), LOWORD(serial)); - if (set_label) { - WCMD_output (WCMD_LoadMessage(WCMD_VOLUMEPROMPT)); - if (WCMD_ReadFile(GetStdHandle(STD_INPUT_HANDLE), string, ARRAY_SIZE(string), &count) && - count > 1) { - string[count-1] = '\0'; /* ReadFile output is not null-terminated! */ - if (string[count-2] == '\r') string[count-2] = '\0'; /* Under Windoze we get CRLF! */ - } - if (*path) { - if (!SetVolumeLabelW(curdir, string)) WCMD_print_error (); - } - else { - if (!SetVolumeLabelW(NULL, string)) WCMD_print_error (); + if (*param1) { + if (!SetVolumeLabelW(curdir, string)) + { + errorlevel = GetLastError(); + WCMD_print_error(); + return errorlevel; } } - return 1; + return errorlevel = NO_ERROR; }
RETURN_CODE WCMD_volume(void) diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index 6358d35ca49..1f52ec722b7 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -564,8 +564,8 @@ SUCCESS 0 FAILURE 1 FAILURE 1 --- success/failure for LABEL command -@todo_wine@FAILURE 1 -@todo_wine@--- +FAILURE 1 +--- ------------ Testing 'set' ------------ 1 0 diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index 3c1ebf0a2f0..433067f6b29 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -179,6 +179,7 @@ RETURN_CODE WCMD_exit(void); BOOL WCMD_get_fullpath(const WCHAR *, SIZE_T, WCHAR *, WCHAR **); void WCMD_give_help (const WCHAR *args); RETURN_CODE WCMD_goto(void); +RETURN_CODE WCMD_label(void); void WCMD_leave_paged_mode(void); void WCMD_more (WCHAR *); RETURN_CODE WCMD_move (void); @@ -208,7 +209,6 @@ RETURN_CODE WCMD_type(WCHAR *); RETURN_CODE WCMD_verify(void); RETURN_CODE WCMD_version(void); RETURN_CODE WCMD_volume(void); -int WCMD_old_volume (BOOL set_label, const WCHAR *args); void WCMD_mklink(WCHAR *args);
WCHAR *WCMD_fgets (WCHAR *buf, DWORD n, HANDLE stream); diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index 24da1d3630a..353e955b123 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1849,7 +1849,7 @@ static RETURN_CODE execute_single_command(const WCHAR *command) WCMD_give_help (parms_start); break; case WCMD_LABEL: - WCMD_old_volume (TRUE, parms_start); + return_code = WCMD_label(); break; case WCMD_MD: case WCMD_MKDIR:
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=146827
Your paranoid android.
=== w7u_2qxl (32 bit report) ===
cmd.exe: batch.c:321: Test failed: unexpected char 0x53 position 0 in line 567 (got 'SUCCESS 0', wanted 'FAILURE 1')
=== w7u_el (32 bit report) ===
cmd.exe: batch.c:321: Test failed: unexpected char 0x53 position 0 in line 567 (got 'SUCCESS 0', wanted 'FAILURE 1')
=== w8 (32 bit report) ===
cmd.exe: batch.c:321: Test failed: unexpected char 0x53 position 0 in line 567 (got 'SUCCESS 0', wanted 'FAILURE 1')
=== w864 (32 bit report) ===
cmd.exe: batch.c:321: Test failed: unexpected char 0x53 position 0 in line 567 (got 'SUCCESS 0', wanted 'FAILURE 1')
=== w1064v1507 (32 bit report) ===
cmd.exe: batch.c:321: Test failed: unexpected char 0x53 position 0 in line 567 (got 'SUCCESS 0', wanted 'FAILURE 1')
=== w1064v1809 (32 bit report) ===
cmd.exe: batch.c:321: Test failed: unexpected char 0x53 position 0 in line 567 (got 'SUCCESS 0', wanted 'FAILURE 1')
=== w1064_tsign (32 bit report) ===
cmd.exe: batch.c:321: Test failed: unexpected char 0x53 position 0 in line 567 (got 'SUCCESS 0', wanted 'FAILURE 1')
=== w10pro64 (32 bit report) ===
cmd.exe: batch.c:321: Test failed: unexpected char 0x53 position 0 in line 567 (got 'SUCCESS 0', wanted 'FAILURE 1')
=== w10pro64_en_AE_u8 (32 bit report) ===
cmd.exe: batch.c:321: Test failed: unexpected char 0x53 position 0 in line 567 (got 'SUCCESS 0', wanted 'FAILURE 1')
=== w11pro64 (32 bit report) ===
cmd.exe: batch.c:321: Test failed: unexpected char 0x53 position 0 in line 567 (got 'SUCCESS 0', wanted 'FAILURE 1')
=== w7pro64 (64 bit report) ===
cmd.exe: batch.c:321: Test failed: unexpected char 0x53 position 0 in line 567 (got 'SUCCESS 0', wanted 'FAILURE 1')
=== w864 (64 bit report) ===
cmd.exe: batch.c:321: Test failed: unexpected char 0x53 position 0 in line 567 (got 'SUCCESS 0', wanted 'FAILURE 1')
=== w1064v1507 (64 bit report) ===
cmd.exe: batch.c:321: Test failed: unexpected char 0x53 position 0 in line 567 (got 'SUCCESS 0', wanted 'FAILURE 1')
=== w1064v1809 (64 bit report) ===
cmd.exe: batch.c:321: Test failed: unexpected char 0x53 position 0 in line 567 (got 'SUCCESS 0', wanted 'FAILURE 1')
=== w1064_2qxl (64 bit report) ===
cmd.exe: batch.c:321: Test failed: unexpected char 0x53 position 0 in line 567 (got 'SUCCESS 0', wanted 'FAILURE 1')
=== w1064_tsign (64 bit report) ===
cmd.exe: batch.c:321: Test failed: unexpected char 0x53 position 0 in line 567 (got 'SUCCESS 0', wanted 'FAILURE 1')
=== w10pro64 (64 bit report) ===
cmd.exe: batch.c:321: Test failed: unexpected char 0x53 position 0 in line 567 (got 'SUCCESS 0', wanted 'FAILURE 1')
=== w10pro64_ar (64 bit report) ===
cmd.exe: batch.c:321: Test failed: unexpected char 0x53 position 0 in line 567 (got 'SUCCESS 0', wanted 'FAILURE 1')
=== w10pro64_ja (64 bit report) ===
cmd.exe: batch.c:321: Test failed: unexpected char 0x53 position 0 in line 567 (got 'SUCCESS 0', wanted 'FAILURE 1')
=== w10pro64_zh_CN (64 bit report) ===
cmd.exe: batch.c:321: Test failed: unexpected char 0x53 position 0 in line 567 (got 'SUCCESS 0', wanted 'FAILURE 1')
=== w11pro64_amd (64 bit report) ===
cmd.exe: batch.c:321: Test failed: unexpected char 0x53 position 0 in line 567 (got 'SUCCESS 0', wanted 'FAILURE 1')