This is part XVII of cmd engine rewrite.
Mostly ensuring that another bunch of internal commands set return code / error level.
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/tests/test_builtins.cmd | 44 ++++++++++++++++++++++++ programs/cmd/tests/test_builtins.cmd.exp | 33 ++++++++++++++++++ 2 files changed, 77 insertions(+)
diff --git a/programs/cmd/tests/test_builtins.cmd b/programs/cmd/tests/test_builtins.cmd index f8bc4a220f6..2b02888e4b2 100644 --- a/programs/cmd/tests/test_builtins.cmd +++ b/programs/cmd/tests/test_builtins.cmd @@ -625,6 +625,50 @@ 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 --- success/failure for PATH command +call :setError 666 & (path >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +set SAVED_PATH=%PATH% > NUL +call :setError 666 & (path @:\I\dont\Exist &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +path +call :setError 666 & (path ; &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +path +call :setError 666 & (path !SAVED_PATH! &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +set "SAVED_PATH=" +echo --- success/failure for SET command +call :setError 666 & (set >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (set "SAVED_PATH=%PATH%" >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (set S >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (set "SAVED_PATH=" >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (set "SAVED_PATH=" >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (set /Q >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (set ThisVariableLikelyDoesntExist >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +rem missing /A and /p tests +echo --- success/failure for ASSOC command +call :setError 666 & (assoc >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (assoc cmd >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (assoc .idontexist >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +rem testing changing the assoc requires elevated privilege +echo --- success/failure for FTYPE command +call :setError 666 & (ftype >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (ftype cmdfile >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (ftype fileidontexist >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +rem testing changing the ftype requires elevated privilege +echo --- success/failure for SHIFT command +call :setError 666 & shift /abc &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel! +call :testSuccessFailureShift 1 +goto :afterSuccessFailureShift +:testSuccessFailureShift +call :setError 666 & shift &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel! +call :setError 666 & shift &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel! +goto :eof +:afterSuccessFailureShift +echo --- success/failure for HELP command +call :setError 666 & help >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel! +call :setError 666 & help help >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel! +call :setError 666 & help ACommandThatLikelyDoesntExist >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel! +echo --- success/failure for PROMPT command +call :setError 666 & prompt >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel! +rem doesn't seem to set errors either on invalid $ escapes, nor qualifiers 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 1f52ec722b7..bc6c7fcb9b2 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -565,6 +565,39 @@ FAILURE 1 FAILURE 1 --- success/failure for LABEL command FAILURE 1 +--- success/failure for PATH command +@todo_wine@SUCCESS 0 +@todo_wine@SUCCESS 0 +PATH=@:\I\dont\Exist@space@ +@todo_wine@SUCCESS 0 +@todo_wine@PATH=(null) +@todo_wine@SUCCESS 0 +--- success/failure for SET command +@todo_wine@SUCCESS 0 +SUCCESS 0 +@todo_wine@FAILURE 1 +SUCCESS 0 +SUCCESS 0 +@todo_wine@FAILURE 1 +@todo_wine@FAILURE 1 +--- success/failure for ASSOC command +SUCCESS 0 +@todo_wine@FAILURE 1 +@todo_wine@FAILURE 1 +--- success/failure for FTYPE command +SUCCESS 0 +@todo_wine@FAILURE 2 +@todo_wine@FAILURE 2 +--- success/failure for SHIFT command +@todo_wine@FAILURE 1 +SUCCESS 666 +SUCCESS 666 +--- success/failure for HELP command +@todo_wine@FAILURE 1 +@todo_wine@FAILURE 1 +@todo_wine@SUCCESS 0 +--- success/failure for PROMPT command +@todo_wine@SUCCESS 0 --- ------------ Testing 'set' ------------ 1
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/builtins.c | 28 ++++++++++++------------ programs/cmd/cmd.rc | 1 - programs/cmd/tests/test_builtins.cmd.exp | 10 ++++----- programs/cmd/wcmd.h | 3 +-- programs/cmd/wcmdmain.c | 2 +- 5 files changed, 21 insertions(+), 23 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index a1cc66b8613..7d5c30407c3 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -3283,27 +3283,27 @@ void WCMD_setshow_env (WCHAR *s) { * Set/Show the path environment variable */
-void WCMD_setshow_path (const WCHAR *args) { - +RETURN_CODE WCMD_setshow_path(const WCHAR *args) +{ WCHAR string[1024]; - DWORD status;
if (!*param1 && !*param2) { - status = GetEnvironmentVariableW(L"PATH", string, ARRAY_SIZE(string)); - if (status != 0) { - WCMD_output_asis(L"PATH="); - WCMD_output_asis ( string); - WCMD_output_asis(L"\r\n"); - } - else { - WCMD_output_stderr(WCMD_LoadMessage(WCMD_NOPATH)); - } + if (!GetEnvironmentVariableW(L"PATH", string, ARRAY_SIZE(string))) + wcscpy(string, L"(null)"); + WCMD_output_asis(L"PATH="); + WCMD_output_asis(string); + WCMD_output_asis(L"\r\n"); } else { if (*args == '=') args++; /* Skip leading '=' */ - status = SetEnvironmentVariableW(L"PATH", args); - if (!status) WCMD_print_error(); + if (args[0] == L';' && *WCMD_skip_leading_spaces((WCHAR *)(args + 1)) == L'\0') args = NULL; + if (!SetEnvironmentVariableW(L"PATH", args)) + { + WCMD_print_error(); + return errorlevel = ERROR_INVALID_FUNCTION; + } } + return errorlevel = NO_ERROR; }
/**************************************************************************** diff --git a/programs/cmd/cmd.rc b/programs/cmd/cmd.rc index 9e66f27380d..3beb9c62a89 100644 --- a/programs/cmd/cmd.rc +++ b/programs/cmd/cmd.rc @@ -390,7 +390,6 @@ Enter HELP <command> for further information on any of the above commands.\n" WCMD_ARGERR, "Parameter error\n" WCMD_VOLUMESERIALNO, "Volume Serial Number is %1!04x!-%2!04x!\n\n" WCMD_VOLUMEPROMPT, "Volume label (11 characters, <Enter> for none)?" - WCMD_NOPATH, "PATH not found\n" WCMD_ANYKEY,"Press any key to continue... " WCMD_CONSTITLE,"Wine Command Prompt" WCMD_VERSION,"Microsoft Windows %1!S!\n" diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index bc6c7fcb9b2..9131b8d4ef5 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -566,12 +566,12 @@ FAILURE 1 --- success/failure for LABEL command FAILURE 1 --- success/failure for PATH command -@todo_wine@SUCCESS 0 -@todo_wine@SUCCESS 0 +SUCCESS 0 +SUCCESS 0 PATH=@:\I\dont\Exist@space@ -@todo_wine@SUCCESS 0 -@todo_wine@PATH=(null) -@todo_wine@SUCCESS 0 +SUCCESS 0 +PATH=(null) +SUCCESS 0 --- success/failure for SET command @todo_wine@SUCCESS 0 SUCCESS 0 diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index 433067f6b29..d5777e8f153 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -199,7 +199,7 @@ RETURN_CODE WCMD_setlocal(WCHAR *args); 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); +RETURN_CODE WCMD_setshow_path(const WCHAR *args); void WCMD_setshow_prompt (void); RETURN_CODE WCMD_setshow_time(void); void WCMD_shift (const WCHAR *args); @@ -438,7 +438,6 @@ extern WCHAR version_string[]; #define WCMD_ARGERR 1027 #define WCMD_VOLUMESERIALNO 1028 #define WCMD_VOLUMEPROMPT 1029 -#define WCMD_NOPATH 1030 #define WCMD_ANYKEY 1031 #define WCMD_CONSTITLE 1032 #define WCMD_VERSION 1033 diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index 353e955b123..afc2eb3b531 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1859,7 +1859,7 @@ static RETURN_CODE execute_single_command(const WCHAR *command) return_code = WCMD_move(); break; case WCMD_PATH: - WCMD_setshow_path (parms_start); + return_code = WCMD_setshow_path(parms_start); break; case WCMD_PAUSE: WCMD_pause ();
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/builtins.c | 73 ++++++++++++------------ programs/cmd/tests/test_builtins.cmd.exp | 8 +-- programs/cmd/wcmd.h | 2 +- programs/cmd/wcmdmain.c | 2 +- 4 files changed, 44 insertions(+), 41 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index 7d5c30407c3..2238995b53c 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -3156,8 +3156,9 @@ exprerrorreturn: * Set/Show the environment variables */
-void WCMD_setshow_env (WCHAR *s) { - +RETURN_CODE WCMD_setshow_env(WCHAR *s) +{ + RETURN_CODE return_code = NO_ERROR; LPVOID env; WCHAR *p; BOOL status; @@ -3166,13 +3167,12 @@ void WCMD_setshow_env (WCHAR *s) { if (param1[0] == 0x00 && quals[0] == 0x00) { env = GetEnvironmentStringsW(); WCMD_setshow_sortenv( env, NULL ); - return; }
/* See if /P supplied, and if so echo the prompt, and read in a reply */ - if (CompareStringW(LOCALE_USER_DEFAULT, - NORM_IGNORECASE | SORT_STRINGSORT, - s, 2, L"/P", -1) == CSTR_EQUAL) { + else if (CompareStringW(LOCALE_USER_DEFAULT, + NORM_IGNORECASE | SORT_STRINGSORT, + s, 2, L"/P", -1) == CSTR_EQUAL) { DWORD count;
s += 2; @@ -3188,20 +3188,22 @@ void WCMD_setshow_env (WCHAR *s) { /* If no parameter, or no '=' sign, return an error */ if (!(*s) || ((p = wcschr (s, '=')) == NULL )) { WCMD_output_stderr(WCMD_LoadMessage(WCMD_NOARG)); - return; + return_code = ERROR_INVALID_FUNCTION; } - - /* Output the prompt */ - *p++ = '\0'; - if (*p) WCMD_output_asis(p); - - /* Read the reply */ - 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! */ - WINE_TRACE("set /p: Setting var '%s' to '%s'\n", wine_dbgstr_w(s), - wine_dbgstr_w(string)); - SetEnvironmentVariableW(s, string); + else + { + /* Output the prompt */ + *p++ = '\0'; + if (*p) WCMD_output_asis(p); + + /* Read the reply */ + 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! */ + TRACE("set /p: Setting var '%s' to '%s'\n", wine_dbgstr_w(s), + wine_dbgstr_w(string)); + SetEnvironmentVariableW(s, string); + } }
/* See if /A supplied, and if so calculate the results of all the expressions */ @@ -3234,11 +3236,10 @@ void WCMD_setshow_env (WCHAR *s) { /* If parsing failed, issue the error message */ if (rc > 0) { WCMD_output_stderr(WCMD_LoadMessage(rc)); - return; + return_code = ERROR_INVALID_FUNCTION; } - /* If we have no context (interactive or cmd.exe /c) print the final result */ - if (!context) { + else if (!context) { swprintf(string, ARRAY_SIZE(string), L"%d", result); WCMD_output_asis(string); } @@ -3259,22 +3260,24 @@ void WCMD_setshow_env (WCHAR *s) { env = GetEnvironmentStringsW(); if (WCMD_setshow_sortenv( env, s ) == 0) { WCMD_output_stderr(WCMD_LoadMessage(WCMD_MISSINGENV), s); - errorlevel = ERROR_INVALID_FUNCTION; + return_code = ERROR_INVALID_FUNCTION; } - return; } - *p++ = '\0'; - - if (!*p) p = NULL; - WINE_TRACE("set: Setting var '%s' to '%s'\n", wine_dbgstr_w(s), - wine_dbgstr_w(p)); - status = SetEnvironmentVariableW(s, p); - gle = GetLastError(); - if ((!status) & (gle == ERROR_ENVVAR_NOT_FOUND)) { - errorlevel = ERROR_INVALID_FUNCTION; - } else if (!status) WCMD_print_error(); - else if (!interactive) errorlevel = NO_ERROR; + else + { + *p++ = '\0'; + + if (!*p) p = NULL; + TRACE("set: Setting var '%s' to '%s'\n", wine_dbgstr_w(s), + wine_dbgstr_w(p)); + status = SetEnvironmentVariableW(s, p); + gle = GetLastError(); + if ((!status) & (gle == ERROR_ENVVAR_NOT_FOUND)) { + return_code = ERROR_INVALID_FUNCTION; + } else if (!status) WCMD_print_error(); + } } + return errorlevel = return_code; }
/**************************************************************************** diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index 9131b8d4ef5..8d6025f7c54 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -573,13 +573,13 @@ SUCCESS 0 PATH=(null) SUCCESS 0 --- success/failure for SET command -@todo_wine@SUCCESS 0 SUCCESS 0 -@todo_wine@FAILURE 1 SUCCESS 0 +FAILURE 1 SUCCESS 0 -@todo_wine@FAILURE 1 -@todo_wine@FAILURE 1 +SUCCESS 0 +FAILURE 1 +FAILURE 1 --- success/failure for ASSOC command SUCCESS 0 @todo_wine@FAILURE 1 diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index d5777e8f153..2282c9f5d9c 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -198,7 +198,7 @@ void WCMD_run_program (WCHAR *command, BOOL called); RETURN_CODE WCMD_setlocal(WCHAR *args); RETURN_CODE WCMD_setshow_date(void); RETURN_CODE WCMD_setshow_default(const WCHAR *args); -void WCMD_setshow_env (WCHAR *command); +RETURN_CODE WCMD_setshow_env(WCHAR *command); RETURN_CODE WCMD_setshow_path(const WCHAR *args); void WCMD_setshow_prompt (void); RETURN_CODE WCMD_setshow_time(void); diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index afc2eb3b531..e3ec39d65ed 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1884,7 +1884,7 @@ static RETURN_CODE execute_single_command(const WCHAR *command) return_code = WCMD_endlocal(); break; case WCMD_SET: - WCMD_setshow_env (parms_start); + return_code = WCMD_setshow_env(parms_start); break; case WCMD_SHIFT: WCMD_shift (parms_start);
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/builtins.c | 12 +++++++----- programs/cmd/tests/test_builtins.cmd.exp | 8 ++++---- programs/cmd/wcmd.h | 2 +- programs/cmd/wcmdmain.c | 4 ++-- 4 files changed, 14 insertions(+), 12 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index 2238995b53c..ac26896f0a8 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -3867,8 +3867,8 @@ RETURN_CODE WCMD_exit(void) * Lists or sets file associations (assoc = TRUE) * Lists or sets file types (assoc = FALSE) */ -void WCMD_assoc (const WCHAR *args, BOOL assoc) { - +RETURN_CODE WCMD_assoc(const WCHAR *args, BOOL assoc) +{ HKEY key; DWORD accessOptions = KEY_READ; WCHAR *newValue; @@ -3885,7 +3885,7 @@ void WCMD_assoc (const WCHAR *args, BOOL assoc) { /* Open a key to HKEY_CLASSES_ROOT for enumerating */ if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"", 0, accessOptions, &key) != ERROR_SUCCESS) { WINE_FIXME("Unexpected failure opening HKCR key: %ld\n", GetLastError()); - return; + return ERROR_INVALID_FUNCTION; }
/* If no parameters then list all associations */ @@ -3955,7 +3955,7 @@ void WCMD_assoc (const WCHAR *args, BOOL assoc) { if (rc == ERROR_SUCCESS) WCMD_output_asis(keyValue); WCMD_output_asis(L"\r\n"); RegCloseKey(readKey); - + errorlevel = rc == ERROR_SUCCESS ? NO_ERROR : ERROR_INVALID_FUNCTION; } else { WCHAR msgbuffer[MAXSTRING];
@@ -3966,7 +3966,7 @@ void WCMD_assoc (const WCHAR *args, BOOL assoc) { LoadStringW(hinst, WCMD_NOFTYPE, msgbuffer, ARRAY_SIZE(msgbuffer)); } WCMD_output_stderr(msgbuffer, keyValue); - errorlevel = ERROR_FILE_NOT_FOUND; + errorlevel = assoc ? ERROR_INVALID_FUNCTION : ERROR_FILE_NOT_FOUND; }
/* Not a query - it's a set or clear of a value */ @@ -4032,6 +4032,8 @@ void WCMD_assoc (const WCHAR *args, BOOL assoc) {
/* Clean up */ RegCloseKey(key); + + return errorlevel; }
/**************************************************************************** diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index 8d6025f7c54..0cff90d83be 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -582,12 +582,12 @@ FAILURE 1 FAILURE 1 --- success/failure for ASSOC command SUCCESS 0 -@todo_wine@FAILURE 1 -@todo_wine@FAILURE 1 +FAILURE 1 +FAILURE 1 --- success/failure for FTYPE command SUCCESS 0 -@todo_wine@FAILURE 2 -@todo_wine@FAILURE 2 +FAILURE 2 +FAILURE 2 --- success/failure for SHIFT command @todo_wine@FAILURE 1 SUCCESS 666 diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index 2282c9f5d9c..79ef2bb65a7 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -161,7 +161,7 @@ typedef int RETURN_CODE;
BOOL WCMD_print_volume_information(const WCHAR *);
-void WCMD_assoc (const WCHAR *, BOOL); +RETURN_CODE WCMD_assoc(const WCHAR *, BOOL); RETURN_CODE WCMD_batch(const WCHAR *, WCHAR *, const WCHAR *, HANDLE); RETURN_CODE WCMD_call(WCHAR *command); void WCMD_change_tty (void); diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index e3ec39d65ed..6212dacf7e7 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1918,13 +1918,13 @@ static RETURN_CODE execute_single_command(const WCHAR *command) return_code = WCMD_popd(); break; case WCMD_ASSOC: - WCMD_assoc(parms_start, TRUE); + return_code = WCMD_assoc(parms_start, TRUE); break; case WCMD_COLOR: WCMD_color(); break; case WCMD_FTYPE: - WCMD_assoc(parms_start, FALSE); + return_code = WCMD_assoc(parms_start, FALSE); break; case WCMD_MORE: WCMD_more(parms_start);
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/builtins.c | 8 ++++---- programs/cmd/tests/test_builtins.cmd.exp | 2 +- programs/cmd/wcmd.h | 2 +- programs/cmd/wcmdmain.c | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index ac26896f0a8..a509f68382a 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -1474,7 +1474,6 @@ RETURN_CODE WCMD_delete(WCHAR *args) argsProcessed = TRUE; if (!WCMD_delete_one(thisArg)) { - WCMD_output_stderr(WCMD_LoadMessage(WCMD_FILENOTFOUND), thisArg); errorlevel = ERROR_INVALID_FUNCTION; } } @@ -3374,7 +3373,8 @@ RETURN_CODE WCMD_setshow_time(void) * Optional /n says where to start shifting (n=0-8) */
-void WCMD_shift (const WCHAR *args) { +RETURN_CODE WCMD_shift(const WCHAR *args) +{ int start;
if (context != NULL) { @@ -3388,7 +3388,7 @@ void WCMD_shift (const WCHAR *args) { } else { SetLastError(ERROR_INVALID_PARAMETER); WCMD_print_error(); - return; + return errorlevel = ERROR_INVALID_FUNCTION; }
WINE_TRACE("Shifting variables, starting at %d\n", start); @@ -3397,7 +3397,7 @@ void WCMD_shift (const WCHAR *args) { } context -> shift_count[9] = context -> shift_count[9] + 1; } - + return NO_ERROR; }
/**************************************************************************** diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index 0cff90d83be..8804bd48c4b 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -589,7 +589,7 @@ SUCCESS 0 FAILURE 2 FAILURE 2 --- success/failure for SHIFT command -@todo_wine@FAILURE 1 +FAILURE 1 SUCCESS 666 SUCCESS 666 --- success/failure for HELP command diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index 79ef2bb65a7..192680eac42 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -202,7 +202,7 @@ RETURN_CODE WCMD_setshow_env(WCHAR *command); RETURN_CODE WCMD_setshow_path(const WCHAR *args); void WCMD_setshow_prompt (void); RETURN_CODE WCMD_setshow_time(void); -void WCMD_shift (const WCHAR *args); +RETURN_CODE WCMD_shift(const WCHAR *args); void WCMD_start (WCHAR *args); void WCMD_title (const WCHAR *); RETURN_CODE WCMD_type(WCHAR *); diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index 6212dacf7e7..a9704a80fb2 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1887,7 +1887,7 @@ static RETURN_CODE execute_single_command(const WCHAR *command) return_code = WCMD_setshow_env(parms_start); break; case WCMD_SHIFT: - WCMD_shift (parms_start); + return_code = WCMD_shift(parms_start); break; case WCMD_START: WCMD_start (parms_start);
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/builtins.c | 63 +++++++++++++----------- programs/cmd/tests/directory.c | 2 +- programs/cmd/tests/test_builtins.cmd | 2 +- programs/cmd/tests/test_builtins.cmd.exp | 6 +-- programs/cmd/wcmd.h | 2 +- programs/cmd/wcmdmain.c | 3 +- 6 files changed, 42 insertions(+), 36 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index a509f68382a..d3dede6b9f5 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -1733,43 +1733,50 @@ int WCMD_for_nexttoken(int lasttoken, const WCHAR *tokenstr, return nexttoken; }
+static int find_in_array(const WCHAR array[][10], size_t sz, const WCHAR *what) +{ + int i; + + for (i = 0; i < sz; i++) + if (CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE | SORT_STRINGSORT, + what, -1, array[i], -1) == CSTR_EQUAL) + return i; + return -1; +} + /************************************************************************** * WCMD_give_help * * Simple on-line help. Help text is stored in the resource file. */
-void WCMD_give_help (const WCHAR *args) +RETURN_CODE WCMD_give_help(WCHAR *args) { - size_t i; + WCHAR *help_on = WCMD_parameter(args, 0, NULL, FALSE, FALSE);
- args = WCMD_skip_leading_spaces((WCHAR*) args); - if (!*args) { - WCMD_output_asis (WCMD_LoadMessage(WCMD_ALLHELP)); - } - else { - /* Display help message for builtin commands */ - for (i=0; i<=WCMD_EXIT; i++) { - if (CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE | SORT_STRINGSORT, - args, -1, inbuilt[i], -1) == CSTR_EQUAL) { - WCMD_output_asis (WCMD_LoadMessage(i)); - return; - } - } - /* Launch the command with the /? option for external commands shipped with cmd.exe */ - for (i = 0; i <= ARRAY_SIZE(externals); i++) { - if (CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE | SORT_STRINGSORT, - args, -1, externals[i], -1) == CSTR_EQUAL) { - WCHAR cmd[128]; - lstrcpyW(cmd, args); - lstrcatW(cmd, L" /?"); - WCMD_run_program(cmd, FALSE); - return; - } + /* yes, return code / errorlevel look inverted, but native does it this way */ + if (!*help_on) + WCMD_output_asis(WCMD_LoadMessage(WCMD_ALLHELP)); + else + { + int i; + /* Display help message for builtin commands */ + if ((i = find_in_array(inbuilt, ARRAY_SIZE(inbuilt), help_on)) >= 0) + WCMD_output_asis(WCMD_LoadMessage(i)); + else if ((i = find_in_array(externals, ARRAY_SIZE(externals), help_on)) >= 0) + { + WCHAR cmd[128]; + lstrcpyW(cmd, help_on); + lstrcatW(cmd, L" /?"); + WCMD_run_program(cmd, FALSE); + } + else + { + WCMD_output(WCMD_LoadMessage(WCMD_NOCMDHELP), help_on); + return errorlevel = NO_ERROR; + } } - WCMD_output (WCMD_LoadMessage(WCMD_NOCMDHELP), args); - } - return; + return errorlevel = ERROR_INVALID_FUNCTION; }
/**************************************************************************** diff --git a/programs/cmd/tests/directory.c b/programs/cmd/tests/directory.c index 1a62ce120ca..11c65f62689 100644 --- a/programs/cmd/tests/directory.c +++ b/programs/cmd/tests/directory.c @@ -138,7 +138,7 @@ static void test_basic(void) ok(stderr_size > 0, "unexpected stderr buffer size %ld.\n", stderr_size);
/* errorlevel for usage is 0. But, cmd.exe's exit code is 1. */ - todo_wine run_dir("/?", 1); + run_dir("/?", 1); ok(stdout_size > 0, "unexpected stdout buffer size %ld.\n", stdout_size); ok(stderr_size == 0, "unexpected stderr buffer size %ld.\n", stderr_size); } diff --git a/programs/cmd/tests/test_builtins.cmd b/programs/cmd/tests/test_builtins.cmd index 2b02888e4b2..2bda4ad68ff 100644 --- a/programs/cmd/tests/test_builtins.cmd +++ b/programs/cmd/tests/test_builtins.cmd @@ -664,7 +664,7 @@ goto :eof :afterSuccessFailureShift echo --- success/failure for HELP command call :setError 666 & help >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel! -call :setError 666 & help help >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel! +call :setError 666 & help dir >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel! call :setError 666 & help ACommandThatLikelyDoesntExist >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel! echo --- success/failure for PROMPT command call :setError 666 & prompt >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel! diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index 8804bd48c4b..0d0bbb95e15 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -593,9 +593,9 @@ FAILURE 1 SUCCESS 666 SUCCESS 666 --- success/failure for HELP command -@todo_wine@FAILURE 1 -@todo_wine@FAILURE 1 -@todo_wine@SUCCESS 0 +FAILURE 1 +FAILURE 1 +SUCCESS 0 --- success/failure for PROMPT command @todo_wine@SUCCESS 0 --- diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index 192680eac42..1eae5701b8b 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -177,7 +177,7 @@ 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 **); -void WCMD_give_help (const WCHAR *args); +RETURN_CODE WCMD_give_help(WCHAR *args); RETURN_CODE WCMD_goto(void); RETURN_CODE WCMD_label(void); void WCMD_leave_paged_mode(void); diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index a9704a80fb2..d83da05cb30 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1807,7 +1807,6 @@ static RETURN_CODE execute_single_command(const WCHAR *command) cmd_index = WCMD_HELP; memcpy(parms_start, whichcmd, count * sizeof(WCHAR)); parms_start[count] = '\0'; - }
return_code = RETURN_CODE_OLD_CHAINING; @@ -1846,7 +1845,7 @@ static RETURN_CODE execute_single_command(const WCHAR *command) return_code = WCMD_goto(); break; case WCMD_HELP: - WCMD_give_help (parms_start); + return_code = WCMD_give_help(parms_start); break; case WCMD_LABEL: return_code = WCMD_label();
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/builtins.c | 4 +++- programs/cmd/tests/test_builtins.cmd.exp | 2 +- programs/cmd/wcmd.h | 2 +- programs/cmd/wcmdmain.c | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index d3dede6b9f5..c8c4dfbaa0b 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -3321,7 +3321,8 @@ RETURN_CODE WCMD_setshow_path(const WCHAR *args) * Set or show the command prompt. */
-void WCMD_setshow_prompt (void) { +RETURN_CODE WCMD_setshow_prompt(void) +{
WCHAR *s;
@@ -3336,6 +3337,7 @@ void WCMD_setshow_prompt (void) { } else SetEnvironmentVariableW(L"PROMPT", s); } + return errorlevel = NO_ERROR; }
/**************************************************************************** diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index 0d0bbb95e15..de82728369a 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -597,7 +597,7 @@ FAILURE 1 FAILURE 1 SUCCESS 0 --- success/failure for PROMPT command -@todo_wine@SUCCESS 0 +SUCCESS 0 --- ------------ Testing 'set' ------------ 1 diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index 1eae5701b8b..f225ad0b9ff 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -200,7 +200,7 @@ RETURN_CODE WCMD_setshow_date(void); RETURN_CODE WCMD_setshow_default(const WCHAR *args); RETURN_CODE WCMD_setshow_env(WCHAR *command); RETURN_CODE WCMD_setshow_path(const WCHAR *args); -void WCMD_setshow_prompt (void); +RETURN_CODE WCMD_setshow_prompt(void); RETURN_CODE WCMD_setshow_time(void); RETURN_CODE WCMD_shift(const WCHAR *args); void WCMD_start (WCHAR *args); diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index d83da05cb30..ed520a05ed6 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1864,7 +1864,7 @@ static RETURN_CODE execute_single_command(const WCHAR *command) WCMD_pause (); break; case WCMD_PROMPT: - WCMD_setshow_prompt (); + return_code = WCMD_setshow_prompt(); break; case WCMD_REM: break;
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=146871
Your paranoid android.
=== debian11b (64 bit WoW report) ===
user32: win.c:4037: Test failed: Expected active window 00000000026C016C, got 0000000003B2017A. win.c:4038: Test failed: Expected focus window 00000000026C016C, got 0000000003B2017A.