This is part XVI of cmd engine rewrite.
Nothing fancy, mainly setting success/failure return code for a bunch of commands. Some code cleanup.
-- v2: programs/cmd: Set success/failure return code for LABEL command. programs/cmd: Set success/failure return code for VOL command. programs/cmd: Set success/failure return code for VERIFY command. programs/cmd: Set success/failure return code for VER command. programs/cmd: Set success/failure return code for DATE TIME commands. programs/cmd: Set success/failure return code for SETLOCAL/ENDLOCAL commands. programs/cmd/tests: Test success / failure for more commands.
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..f8bc4a220f6 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 & (<NUL label >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 | 83 +++++++++++------------- programs/cmd/tests/test_builtins.cmd.exp | 4 +- programs/cmd/wcmd.h | 2 +- programs/cmd/wcmdmain.c | 2 +- 4 files changed, 42 insertions(+), 49 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index 09d6ce631b8..a1cc66b8613 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -3756,64 +3756,57 @@ 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 (); + else return errorlevel = ERROR_INVALID_FUNCTION; + 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:
V2: fixed failing test on late Win10 & Win11