[PATCH v2 0/2] MR11079: cmd: Add wildcard expansion for arguments to the type program
Fixes https://bugs.winehq.org/show_bug.cgi?id=59816 -- v2: cmd: Modify tests for type command. cmd: Add wilcard expansion for type command arguments. https://gitlab.winehq.org/wine/wine/-/merge_requests/11079
From: Barath Kannan <barathrk11@gmail.com> Signed-off-by: Barath Kannan <barathrk11@gmail.com> --- programs/cmd/builtins.c | 62 +++++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 12 deletions(-) diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index 1c9074b75d3..2d3943e2b59 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -30,6 +30,7 @@ #include "wcmd.h" #include <shellapi.h> +#include "shlwapi.h" #include "winternl.h" #include "winioctl.h" #include "ddk/ntifs.h" @@ -1053,11 +1054,17 @@ RETURN_CODE WCMD_copy(WCHAR * args) /* Build final destination name */ lstrcpyW(outname, destination->name); + WINE_TRACE("The source name is: '%s'\n", wine_dbgstr_w(srcname)); + if (destisdirectory || appendfirstsource) lstrcatW(outname, srcname); + WINE_TRACE("The srcpath is: '%s'\n", wine_dbgstr_w(srcpath)); + /* Build source name */ if (!srcisdevice) lstrcpyW(filenamepart, srcname); + WINE_TRACE("The srcpath is: '%s'\n", wine_dbgstr_w(srcpath)); + /* Do we just overwrite (we do if we are writing to a device) */ overwrite = !prompt; if (dstisdevice || (anyconcats && writtenoneconcat)) { @@ -3439,6 +3446,10 @@ RETURN_CODE WCMD_type(WCHAR *args) int argno = 0; WCHAR *argN = args; BOOL writeHeaders = FALSE; + WIN32_FIND_DATAW fd; + HANDLE hff = INVALID_HANDLE_VALUE; + BOOL havewildcards = FALSE; + WCHAR *fileNamePart; if (param1[0] == 0x00) { WCMD_output_stderr(WCMD_LoadMessage(WCMD_NOARG)); @@ -3458,22 +3469,49 @@ RETURN_CODE WCMD_type(WCHAR *args) if (!argN) break; WINE_TRACE("type: Processing arg '%s'\n", wine_dbgstr_w(thisArg)); - hIn = CreateFileW(thisArg, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, NULL); - if (hIn == INVALID_HANDLE_VALUE) { + + havewildcards = wcspbrk(thisArg, L"*?") ? TRUE : FALSE; + + fileNamePart = PathFindFileNameW(thisArg); + + WINE_TRACE("type: fileNamePart '%s'\n", wine_dbgstr_w(fileNamePart)); + + hff = FindFirstFileW(thisArg, &fd); + + if (hff != INVALID_HANDLE_VALUE) { + do { + lstrcpyW(fileNamePart, fd.cFileName); + WINE_TRACE("type: thisArg: '%s'\n", wine_dbgstr_w(thisArg)); + hIn = CreateFileW(thisArg, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, NULL); + if (hIn == INVALID_HANDLE_VALUE) { + + if(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && + (!lstrcmpW(fd.cFileName, L".") || !lstrcmpW(fd.cFileName, L".."))) { + WINE_TRACE("Skipping directories"); + continue; + } + + WCMD_print_error (); + WCMD_output_stderr(WCMD_LoadMessage(WCMD_READFAIL), thisArg); + return errorlevel = ERROR_INVALID_FUNCTION; + } + hOut = GetStdHandle(STD_OUTPUT_HANDLE); + + if (writeHeaders || havewildcards) { + WCMD_output_stderr(L"\n%1\n\n\n", thisArg); + } + + WCMD_copy_loop(hIn, hOut, GetConsoleMode(hIn, &console_mode) || GetConsoleMode(hOut, &console_mode)); + + CloseHandle (hIn); + } while (FindNextFileW(hff, &fd) != 0); + } + else { WCMD_print_error (); WCMD_output_stderr(WCMD_LoadMessage(WCMD_READFAIL), thisArg); return errorlevel = ERROR_INVALID_FUNCTION; } - hOut = GetStdHandle(STD_OUTPUT_HANDLE); - - if (writeHeaders) { - WCMD_output_stderr(L"\n%1\n\n\n", thisArg); - } - - WCMD_copy_loop(hIn, hOut, GetConsoleMode(hIn, &console_mode) || GetConsoleMode(hOut, &console_mode)); - - CloseHandle (hIn); } return errorlevel = return_code; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11079
From: Barath Kannan <barathrk11@gmail.com> Signed-off-by: Barath Kannan <barathrk11@gmail.com> --- programs/cmd/tests/test_builtins.bat | 5 +++-- programs/cmd/tests/test_builtins.bat.exp | 11 +++++++---- programs/cmd/tests/test_builtins.cmd | 4 +++- programs/cmd/tests/test_builtins.cmd.exp | 11 +++++++---- 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/programs/cmd/tests/test_builtins.bat b/programs/cmd/tests/test_builtins.bat index 4c3d0e7107e..f34492e8ab6 100644 --- a/programs/cmd/tests/test_builtins.bat +++ b/programs/cmd/tests/test_builtins.bat @@ -107,8 +107,9 @@ call :setError 666 & (type i\dont\exist\at\all.txt &&echo SUCCESS !errorlevel!|| call :setError 666 & (type file* i\dont\exist\at\all.txt &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) echo --- call :setError 666 & (type i\dont\exist\at\all.txt file* &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) -cd .. && rd /q /s foo - +cd .. +call :setError 666 & (type foo\file* &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +rd /q /s foo echo --- success/failure for COPY command mkdir foo & cd foo echo a > fileA diff --git a/programs/cmd/tests/test_builtins.bat.exp b/programs/cmd/tests/test_builtins.bat.exp index 36e14d5be91..6a94358dfa8 100644 --- a/programs/cmd/tests/test_builtins.bat.exp +++ b/programs/cmd/tests/test_builtins.bat.exp @@ -67,11 +67,14 @@ SUCCESS 1024 FAILURE 1 SUCCESS 0 FAILURE 1 -@todo_wine@a@space@ -@todo_wine@b@space@ -@todo_wine@FAILURE 1 -@todo_wine@--- +a@space@ +b@space@ +FAILURE 1 +--- FAILURE 1 +a@space@ +b@space@ +SUCCESS 0 --- success/failure for COPY command FAILURE 1 SUCCESS 0 diff --git a/programs/cmd/tests/test_builtins.cmd b/programs/cmd/tests/test_builtins.cmd index f65a301d914..afa32f27c68 100644 --- a/programs/cmd/tests/test_builtins.cmd +++ b/programs/cmd/tests/test_builtins.cmd @@ -690,7 +690,9 @@ call :setError 666 & (type i\dont\exist\at\all.txt &&echo SUCCESS !errorlevel!|| call :setError 666 & (type file* i\dont\exist\at\all.txt &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) echo --- call :setError 666 & (type i\dont\exist\at\all.txt file* &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) -cd .. && rd /q /s foo +cd .. +call :setError 666 & (type foo\file* &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +rd /q /s foo echo --- success/failure for COPY command mkdir foo & cd foo diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index 0f6d9bdb494..c640b906a03 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -586,11 +586,14 @@ SUCCESS 1024 FAILURE 1 SUCCESS 0 FAILURE 1 -@todo_wine@a@space@ -@todo_wine@b@space@ -@todo_wine@FAILURE 1 -@todo_wine@--- +a@space@ +b@space@ FAILURE 1 +--- +FAILURE 1 +a@space@ +b@space@ +SUCCESS 0 --- success/failure for COPY command FAILURE 1 SUCCESS 0 -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11079
participants (2)
-
Barath Kannan -
Barath Kannan (@barath_kannan)