From: Barath Kannan <barathrk11@gmail.com> Signed-off-by: Barath Kannan <barathrk11@gmail.com> --- programs/cmd/builtins.c | 54 +++++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 13 deletions(-) diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index 1c9074b75d3..549e17d0655 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" @@ -3439,6 +3440,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)); @@ -3457,23 +3462,46 @@ 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); + + 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 current and previous 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/11094