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