This is part XIX of cmd engine rewrite.
It's the last MR (for now) for setting success/failure return code on internal commands.
The remaining todo in this area are due to: - incompletly implemented builtin (eg: TYPE not handling multiple files, not wildcards; CHOICE missing a bunch of features; ...), - some commands (like START) being implemented as external executables, hence forcing RETURN CODE = ERRORLEVEL which is not always wanted,
From: Eric Pouech epouech@codeweavers.com
Looks a sane operation as: - it's not supported in modern Windows' cmd.exe, - could only find reference from DOS interpreter, - and it's not implemented in Wine.
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/builtins.c | 14 +------------- programs/cmd/cmd.rc | 3 --- programs/cmd/wcmd.h | 3 +-- programs/cmd/wcmdmain.c | 5 +---- 4 files changed, 3 insertions(+), 22 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index bd0d94f00e8..d1be9aab967 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -45,7 +45,7 @@ const WCHAR inbuilt[][10] = { L"CHDIR", L"CLS", L"COPY", - L"CTTY", + L"", L"DATE", L"DEL", L"DIR", @@ -274,18 +274,6 @@ RETURN_CODE WCMD_clear_screen(void) return NO_ERROR; }
-/**************************************************************************** - * WCMD_change_tty - * - * Change the default i/o device (ie redirect STDin/STDout). - */ - -void WCMD_change_tty (void) { - - WCMD_output_stderr (WCMD_LoadMessage(WCMD_NYI)); - -} - /**************************************************************************** * WCMD_choice * diff --git a/programs/cmd/cmd.rc b/programs/cmd/cmd.rc index 3beb9c62a89..90091090e11 100644 --- a/programs/cmd/cmd.rc +++ b/programs/cmd/cmd.rc @@ -51,9 +51,6 @@ default directory.\n" WCMD_COPY, "COPY <filename> copies a file.\n"
- WCMD_CTTY, -"CTTY changes the input/output device.\n" - WCMD_DATE, "DATE shows or changes the system date.\n"
diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index 6c76070338c..5a54fc5e925 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -164,7 +164,6 @@ BOOL WCMD_print_volume_information(const WCHAR *); 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); RETURN_CODE WCMD_choice(const WCHAR *); RETURN_CODE WCMD_clear_screen(void); RETURN_CODE WCMD_color(void); @@ -357,7 +356,7 @@ extern BOOL delayedsubst; #define WCMD_CHDIR 2 #define WCMD_CLS 3 #define WCMD_COPY 4 -#define WCMD_CTTY 5 +/* no longer used slot */ #define WCMD_DATE 6 #define WCMD_DEL 7 #define WCMD_DIR 8 diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index 8380207e5d2..505d816eabb 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1763,7 +1763,7 @@ static RETURN_CODE execute_single_command(const WCHAR *command) count++; } for (cmd_index=0; cmd_index<=WCMD_EXIT; cmd_index++) { - if (CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE | SORT_STRINGSORT, + if (count && CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE | SORT_STRINGSORT, whichcmd, count, inbuilt[cmd_index], -1) == CSTR_EQUAL) break; } parms_start = WCMD_skip_leading_spaces (&whichcmd[count]); @@ -1825,9 +1825,6 @@ static RETURN_CODE execute_single_command(const WCHAR *command) case WCMD_COPY: return_code = WCMD_copy(parms_start); break; - case WCMD_CTTY: - WCMD_change_tty (); - break; case WCMD_DATE: return_code = WCMD_setshow_date(); break;
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/tests/test_builtins.cmd | 41 ++++++++++++++++++++++++ programs/cmd/tests/test_builtins.cmd.exp | 30 +++++++++++++++++ 2 files changed, 71 insertions(+)
diff --git a/programs/cmd/tests/test_builtins.cmd b/programs/cmd/tests/test_builtins.cmd index b43848575fc..66d5e894662 100644 --- a/programs/cmd/tests/test_builtins.cmd +++ b/programs/cmd/tests/test_builtins.cmd @@ -468,6 +468,35 @@ call :setError 666 & ((for %%i in () do call :setError 33) &&echo SUCCESS !error call :setError 666 & ((for %%i in (a) do call :setError 0) &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) call :setError 666 & ((for %%i in (a) do call :setError 33) &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!)
+echo --- success/failure for external command +mkdir foo & cd foo +call :setError 666 & (I\dont\exist.exe &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & I\dont\exist.exe & echo ERRORLEVEL !errorlevel! +call :setError 666 & (Idontexist.exe &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & Idontexist.exe & echo ERRORLEVEL !errorlevel! +call :setError 666 & (cmd.exe /c "echo foo & exit /b 0" &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (cmd.exe /c "echo foo & exit /b 1024" &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +cd .. && rd /q /s foo +echo --- success/failure for CALL command +mkdir foo & cd foo +echo exit /b %%1 > foobar.bat +rem call :setError 666 & (call I\dont\exist.exe &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +rem terminates batch exec on native... +call :setError 666 & (call Idontexist.exe &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call .\foobar.bat 0 &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call .\foobar.bat 1024 &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call cmd.exe /c "echo foo & exit /b 0" &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call cmd.exe /c "echo foo & exit /b 1025" &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call rmdir foobar.dir &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +cd .. && rd /q /s foo +echo --- success/failure for START command +call :setError 666 & (start "" /foobar >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +rem call :setError 666 & (start /B I\dont\exist.exe &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +rem can't run this test, generates a nice popup under windows +call :setError 666 & (start "" /B /WAIT cmd.exe /c "echo foo & exit /b 1024" &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +rem A call :setError 666 & (start "" /B cmd.exe /c "(choice /C:YN /T:3 /D:Y > NUL) & exit /b 1024" &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +rem can't do on Wine until /T is properly handled in CHOICE +rem SUCCESS 666 echo --- success/failure for TYPE command mkdir foo & cd foo echo a > fileA @@ -591,6 +620,18 @@ 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 MKLINK command +mkdir foo & cd foo +call :setError 666 & (mklink &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (mklink /h foo &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (mklink /h foo foo &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (mklink /z foo foo &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +echo bar > foo +call :setError 666 & (mklink /h foo foo &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (mklink /h bar foo >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (mklink /h bar foo &&echo SUCCESS !errorlevel!||echo FAILURE !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!) diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index 4b162af9a8e..ed0e7d8d1e3 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -465,6 +465,28 @@ SUCCESS 666 SUCCESS 666 SUCCESS 0 FAILURE 33 +--- success/failure for external command +@todo_wine@FAILURE 1 +@todo_wine@ERRORLEVEL 3 +@todo_wine@FAILURE 1 +ERRORLEVEL 9009 +foo@space@ +SUCCESS 0 +foo@space@ +FAILURE 1024 +--- success/failure for CALL command +FAILURE 1 +SUCCESS 0 +FAILURE 1024 +foo@space@ +SUCCESS 0 +foo@space@ +FAILURE 1025 +@todo_wine@FAILURE 2 +--- success/failure for START command +@todo_wine@FAILURE 1 +foo@space@ +SUCCESS 1024 --- success/failure for TYPE command FAILURE 1 SUCCESS 0 @@ -535,6 +557,14 @@ ERRORLEVEL 666 ERRORLEVEL 666 ERRORLEVEL 666 ERRORLEVEL 666 +--- success/failure for MKLINK command +@todo_wine@FAILURE 1 +@todo_wine@FAILURE 1 +@todo_wine@FAILURE 1 +@todo_wine@FAILURE 1 +@todo_wine@FAILURE 1 +@todo_wine@SUCCESS 0 +@todo_wine@FAILURE 1 --- success/failure for SETLOCAL/ENDLOCAL commands FAILURE 1 SUCCESS 0
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 | 14 +++++----- programs/cmd/wcmd.h | 2 +- programs/cmd/wcmdmain.c | 2 +- 4 files changed, 29 insertions(+), 24 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index d1be9aab967..869c3d9d088 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -4088,7 +4088,7 @@ RETURN_CODE WCMD_color(void) * WCMD_mklink */
-void WCMD_mklink(WCHAR *args) +RETURN_CODE WCMD_mklink(WCHAR *args) { int argno = 0; WCHAR *argN = args; @@ -4099,11 +4099,6 @@ void WCMD_mklink(WCHAR *args) WCHAR file1[MAX_PATH]; WCHAR file2[MAX_PATH];
- if (param1[0] == 0x00 || param2[0] == 0x00) { - WCMD_output_stderr(WCMD_LoadMessage(WCMD_NOARG)); - return; - } - file1[0] = 0;
while (argN) { @@ -4119,7 +4114,12 @@ void WCMD_mklink(WCHAR *args) hard = TRUE; else if (lstrcmpiW(thisArg, L"/J") == 0) junction = TRUE; - else { + else if (*thisArg == L'/') + { + return errorlevel = ERROR_INVALID_FUNCTION; + } + else + { if(!file1[0]) lstrcpyW(file1, thisArg); else @@ -4127,13 +4127,18 @@ void WCMD_mklink(WCHAR *args) } }
- if(hard) - ret = CreateHardLinkW(file1, file2, NULL); - else if(!junction) - ret = CreateSymbolicLinkW(file1, file2, isdir); - else - WINE_TRACE("Juction links currently not supported.\n"); + if (*file1 && *file2) + { + if (hard) + ret = CreateHardLinkW(file1, file2, NULL); + else if(!junction) + ret = CreateSymbolicLinkW(file1, file2, isdir); + else + TRACE("Junction links currently not supported.\n"); + } + + if (ret) return errorlevel = NO_ERROR;
- if(!ret) - WCMD_output_stderr(WCMD_LoadMessage(WCMD_READFAIL), file1); + WCMD_output_stderr(WCMD_LoadMessage(WCMD_READFAIL), file1); + return errorlevel = ERROR_INVALID_FUNCTION; } diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index ed0e7d8d1e3..d028c3fe1e6 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -558,13 +558,13 @@ ERRORLEVEL 666 ERRORLEVEL 666 ERRORLEVEL 666 --- success/failure for MKLINK command -@todo_wine@FAILURE 1 -@todo_wine@FAILURE 1 -@todo_wine@FAILURE 1 -@todo_wine@FAILURE 1 -@todo_wine@FAILURE 1 -@todo_wine@SUCCESS 0 -@todo_wine@FAILURE 1 +FAILURE 1 +FAILURE 1 +FAILURE 1 +FAILURE 1 +FAILURE 1 +SUCCESS 0 +FAILURE 1 --- success/failure for SETLOCAL/ENDLOCAL commands FAILURE 1 SUCCESS 0 diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index 5a54fc5e925..a727a651516 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -208,7 +208,7 @@ RETURN_CODE WCMD_type(WCHAR *); RETURN_CODE WCMD_verify(void); RETURN_CODE WCMD_version(void); RETURN_CODE WCMD_volume(void); -void WCMD_mklink(WCHAR *args); +RETURN_CODE WCMD_mklink(WCHAR *args);
WCHAR *WCMD_fgets (WCHAR *buf, DWORD n, HANDLE stream); WCHAR *WCMD_parameter (WCHAR *s, int n, WCHAR **start, BOOL raw, BOOL wholecmdline); diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index 505d816eabb..2826f9a609a 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1928,7 +1928,7 @@ static RETURN_CODE execute_single_command(const WCHAR *command) return_code = WCMD_choice(parms_start); break; case WCMD_MKLINK: - WCMD_mklink(parms_start); + return_code = WCMD_mklink(parms_start); break; case WCMD_EXIT: return_code = WCMD_exit();
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/builtins.c | 11 +++++++++-- programs/cmd/wcmd.h | 2 +- programs/cmd/wcmdmain.c | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index 869c3d9d088..17671c32eba 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -3408,8 +3408,9 @@ RETURN_CODE WCMD_shift(const WCHAR *args) /**************************************************************************** * WCMD_start */ -void WCMD_start(WCHAR *args) +RETURN_CODE WCMD_start(WCHAR *args) { + RETURN_CODE return_code = NO_ERROR; int argno; int have_title; WCHAR file[MAX_PATH]; @@ -3457,6 +3458,11 @@ void WCMD_start(WCHAR *args) * * WCMD_parameter_with_delims will take care of everything for us. */ + /* FIXME: using an external start.exe has several caveats: + * - cannot discriminate syntax error in arguments from child's return code + * - need to access start.exe's child to get its running state + * (not start.exe itself) + */ have_title = FALSE; for (argno=0; ; argno++) { WCHAR *thisArg, *argN; @@ -3521,9 +3527,10 @@ void WCMD_start(WCHAR *args) { SetLastError(ERROR_FILE_NOT_FOUND); WCMD_print_error (); - errorlevel = RETURN_CODE_CANT_LAUNCH; + return_code = errorlevel = ERROR_INVALID_FUNCTION; } free(cmdline); + return return_code; }
/**************************************************************************** diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index a727a651516..c61f9b41cd5 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -202,7 +202,7 @@ RETURN_CODE WCMD_setshow_path(const WCHAR *args); RETURN_CODE WCMD_setshow_prompt(void); RETURN_CODE WCMD_setshow_time(void); RETURN_CODE WCMD_shift(const WCHAR *args); -void WCMD_start (WCHAR *args); +RETURN_CODE WCMD_start(WCHAR *args); RETURN_CODE WCMD_title(const WCHAR *); RETURN_CODE WCMD_type(WCHAR *); RETURN_CODE WCMD_verify(void); diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index 2826f9a609a..b1d3ff81c04 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1886,7 +1886,7 @@ static RETURN_CODE execute_single_command(const WCHAR *command) return_code = WCMD_shift(parms_start); break; case WCMD_START: - WCMD_start (parms_start); + return_code = WCMD_start(parms_start); break; case WCMD_TIME: return_code = WCMD_setshow_time();
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/batch.c | 18 +++++++++++++----- programs/cmd/wcmdmain.c | 6 +----- 2 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/programs/cmd/batch.c b/programs/cmd/batch.c index 17ef569dc3f..d2ad690967d 100644 --- a/programs/cmd/batch.c +++ b/programs/cmd/batch.c @@ -664,11 +664,19 @@ RETURN_CODE WCMD_call(WCHAR *command) /* Run other program if no leading ':' */ if (*command != ':') { - WCMD_run_program(buffer, TRUE); - /* If the thing we try to run does not exist, call returns 1 */ - if (errorlevel == RETURN_CODE_CANT_LAUNCH) - errorlevel = ERROR_INVALID_FUNCTION; - return_code = errorlevel; + if (*WCMD_skip_leading_spaces(buffer) == L'\0') + /* FIXME it's incomplete as (call) should return 1, and (call ) should return 0... + * but we need to get the untouched string in command + */ + return_code = errorlevel = NO_ERROR; + else + { + WCMD_run_program(buffer, TRUE); + /* If the thing we try to run does not exist, call returns 1 */ + if (errorlevel == RETURN_CODE_CANT_LAUNCH) + errorlevel = ERROR_INVALID_FUNCTION; + return_code = errorlevel; + } } else if (context) { diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index b1d3ff81c04..53b08c0b137 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1431,12 +1431,8 @@ void WCMD_run_program (WCHAR *command, BOOL called) /* Quick way to get the filename is to extract the first argument. */ WINE_TRACE("Running '%s' (%d)\n", wine_dbgstr_w(command), called); firstParam = WCMD_parameter(command, 0, NULL, FALSE, TRUE); - if (!firstParam) return;
- if (!firstParam[0]) { - errorlevel = NO_ERROR; - return; - } + if (!firstParam[0]) return;
/* Calculate the search path and stem to search for */ if (wcspbrk(firstParam, L"/\:") == NULL) { /* No explicit path given, search path */
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/tests/test_builtins.cmd.exp | 6 ++--- programs/cmd/wcmd.h | 2 +- programs/cmd/wcmdmain.c | 31 +++++++++++------------- 3 files changed, 18 insertions(+), 21 deletions(-)
diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index d028c3fe1e6..a96c7dde10b 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -466,9 +466,9 @@ SUCCESS 666 SUCCESS 0 FAILURE 33 --- success/failure for external command -@todo_wine@FAILURE 1 +FAILURE 1 @todo_wine@ERRORLEVEL 3 -@todo_wine@FAILURE 1 +FAILURE 1 ERRORLEVEL 9009 foo@space@ SUCCESS 0 @@ -482,7 +482,7 @@ foo@space@ SUCCESS 0 foo@space@ FAILURE 1025 -@todo_wine@FAILURE 2 +FAILURE 2 --- success/failure for START command @todo_wine@FAILURE 1 foo@space@ diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index c61f9b41cd5..dfa4c00e4cd 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -193,7 +193,7 @@ void WCMD_print_error (void); 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); +RETURN_CODE 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); diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index 53b08c0b137..d53072ca567 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1413,7 +1413,7 @@ static RETURN_CODE execute_single_command(const WCHAR *command); * so go back through wcmd_execute. */
-void WCMD_run_program (WCHAR *command, BOOL called) +RETURN_CODE WCMD_run_program(WCHAR *command, BOOL called) { WCHAR temp[MAX_PATH]; WCHAR pathtosearch[MAXSTRING]; @@ -1432,7 +1432,7 @@ void WCMD_run_program (WCHAR *command, BOOL called) WINE_TRACE("Running '%s' (%d)\n", wine_dbgstr_w(command), called); firstParam = WCMD_parameter(command, 0, NULL, FALSE, TRUE);
- if (!firstParam[0]) return; + if (!firstParam[0]) return NO_ERROR;
/* Calculate the search path and stem to search for */ if (wcspbrk(firstParam, L"/\:") == NULL) { /* No explicit path given, search path */ @@ -1445,7 +1445,7 @@ void WCMD_run_program (WCHAR *command, BOOL called) if (lstrlenW(firstParam) >= MAX_PATH) { WCMD_output_asis_stderr(WCMD_LoadMessage(WCMD_LINETOOLONG)); - return; + return ERROR_INVALID_FUNCTION; }
lstrcpyW(stemofsearch, firstParam); @@ -1453,7 +1453,8 @@ void WCMD_run_program (WCHAR *command, BOOL called) } else {
/* Convert eg. ..\fred to include a directory by removing file part */ - if (!WCMD_get_fullpath(firstParam, ARRAY_SIZE(pathtosearch), pathtosearch, NULL)) return; + if (!WCMD_get_fullpath(firstParam, ARRAY_SIZE(pathtosearch), pathtosearch, NULL)) + return ERROR_INVALID_FUNCTION; lastSlash = wcsrchr(pathtosearch, '\'); if (lastSlash && wcschr(lastSlash, '.') != NULL) extensionsupplied = TRUE; lstrcpyW(stemofsearch, lastSlash+1); @@ -1527,7 +1528,8 @@ void WCMD_run_program (WCHAR *command, BOOL called)
/* Since you can have eg. .... on the path, need to expand to full information */ - if (!WCMD_get_fullpath(temp, ARRAY_SIZE(thisDir), thisDir, NULL)) return; + if (!WCMD_get_fullpath(temp, ARRAY_SIZE(thisDir), thisDir, NULL)) + return ERROR_INVALID_FUNCTION; }
/* 1. If extension supplied, see if that file exists */ @@ -1600,7 +1602,7 @@ void WCMD_run_program (WCHAR *command, BOOL called) } if (return_code != RETURN_CODE_ABORTED && return_code != RETURN_CODE_OLD_CHAINING) errorlevel = return_code; - return; + return return_code; } else { DWORD exit_code; /* thisDir contains the file to be launched, but with what? @@ -1625,8 +1627,7 @@ void WCMD_run_program (WCHAR *command, BOOL called) /* strip first and last quote WCHARacters and try again */ WCMD_strip_quotes(command); opt_s = TRUE; - WCMD_run_program(command, called); - return; + return WCMD_run_program(command, called); }
if (!status) @@ -1641,16 +1642,14 @@ void WCMD_run_program (WCHAR *command, BOOL called)
CloseHandle(pe.hProcess); CloseHandle(pe.hThread); - return; + return errorlevel; } } }
/* Not found anywhere - were we called? */ - if (called) { - execute_single_command(command); - return; - } + if (called) + return errorlevel = execute_single_command(command);
/* Not found anywhere - give up */ WCMD_output_stderr(WCMD_LoadMessage(WCMD_NO_COMMAND_FOUND), command); @@ -1658,8 +1657,7 @@ void WCMD_run_program (WCHAR *command, BOOL called) /* If a command fails to launch, it sets errorlevel 9009 - which does not seem to have any associated constant definition */ errorlevel = RETURN_CODE_CANT_LAUNCH; - return; - + return ERROR_INVALID_FUNCTION; }
/* this is obviously wrong... will require more work to be fixed */ @@ -1931,8 +1929,7 @@ static RETURN_CODE execute_single_command(const WCHAR *command) break; default: prev_echo_mode = echo_mode; - WCMD_run_program (whichcmd, FALSE); - return_code = errorlevel; + return_code = WCMD_run_program(whichcmd, FALSE); echo_mode = prev_echo_mode; }
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/wcmd.h | 2 -- programs/cmd/wcmdmain.c | 22 ++-------------------- 2 files changed, 2 insertions(+), 22 deletions(-)
diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index dfa4c00e4cd..6c25b86f7d1 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -156,8 +156,6 @@ typedef int RETURN_CODE; #define RETURN_CODE_SYNTAX_ERROR 255 #define RETURN_CODE_CANT_LAUNCH 9009 #define RETURN_CODE_ABORTED (-999999) -/* temporary to detect builtin commands not migrated to handle return code */ -#define RETURN_CODE_OLD_CHAINING (-999998)
BOOL WCMD_print_volume_information(const WCHAR *);
diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index d53072ca567..d44a505dc47 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1600,7 +1600,7 @@ RETURN_CODE WCMD_run_program(WCHAR *command, BOOL called) TRACE("Batch completed, but was not 'called' so skipping outer batch too\n"); context->skip_rest = TRUE; } - if (return_code != RETURN_CODE_ABORTED && return_code != RETURN_CODE_OLD_CHAINING) + if (return_code != RETURN_CODE_ABORTED) errorlevel = return_code; return return_code; } else { @@ -1803,7 +1803,6 @@ static RETURN_CODE execute_single_command(const WCHAR *command) parms_start[count] = '\0'; }
- return_code = RETURN_CODE_OLD_CHAINING; switch (cmd_index) {
case WCMD_CALL: @@ -1858,6 +1857,7 @@ static RETURN_CODE execute_single_command(const WCHAR *command) return_code = WCMD_setshow_prompt(); break; case WCMD_REM: + return_code = NO_ERROR; break; case WCMD_REN: case WCMD_RENAME: @@ -3653,16 +3653,6 @@ static RETURN_CODE for_control_execute(CMD_FOR_CONTROL *for_ctrl, CMD_NODE *node return return_code; }
-static RETURN_CODE temp_fixup_return_code(CMD_NODE *node, RETURN_CODE return_code, RETURN_CODE fallback_return_code) -{ - if (return_code == RETURN_CODE_OLD_CHAINING) - { - FIXME("Not migrated (%ls) used in chaining\n", node->op == CMD_SINGLE ? node->command->command : L"Too complex"); - return_code = fallback_return_code; - } - return return_code; -} - RETURN_CODE node_execute(CMD_NODE *node) { HANDLE old_stdhandles[3] = {GetStdHandle (STD_INPUT_HANDLE), @@ -3694,22 +3684,16 @@ RETURN_CODE node_execute(CMD_NODE *node) break; case CMD_ONSUCCESS: return_code = node_execute(node->left); - return_code = temp_fixup_return_code(node->left, return_code, NO_ERROR); if (return_code == NO_ERROR) - { return_code = node_execute(node->right); - temp_fixup_return_code(node->right, return_code, 0 /* not used */); - } break; case CMD_ONFAILURE: return_code = node_execute(node->left); - return_code = temp_fixup_return_code(node->left, return_code, ERROR_INVALID_FUNCTION); if (return_code != NO_ERROR && return_code != RETURN_CODE_ABORTED) { /* that's needed for commands (POPD, RMDIR) that don't set errorlevel in case of failure. */ errorlevel = return_code; return_code = node_execute(node->right); - temp_fixup_return_code(node->right, return_code, 0 /* not used */); } break; case CMD_PIPE: @@ -3744,7 +3728,6 @@ RETURN_CODE node_execute(CMD_NODE *node) CloseHandle(GetStdHandle(STD_OUTPUT_HANDLE)); SetStdHandle(STD_OUTPUT_HANDLE, saved_output);
- return_code = temp_fixup_return_code(node->left, return_code, NO_ERROR); if (return_code == NO_ERROR) { HANDLE h = CreateFileW(filename, GENERIC_READ, @@ -3754,7 +3737,6 @@ RETURN_CODE node_execute(CMD_NODE *node) { SetStdHandle(STD_INPUT_HANDLE, h); return_code = node_execute(node->right); - temp_fixup_return_code(node->right, return_code, 0 /* not used */); } else return_code = ERROR_INVALID_FUNCTION; }
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=146964
Your paranoid android.
=== debian11 (build log) ===
WineRunWineTest.pl:error: The task timed out
checked the various failures: - gitlab: failure in http tessts - winetest bot: fixed by MR!6037