From: Joe Souza <jsouza(a)yahoo.com> --- programs/cmd/builtins.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index b5ad78ab9c7..5efd522259f 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -3417,9 +3417,11 @@ RETURN_CODE WCMD_type(WCHAR *args) while (argN) { WCHAR *thisArg = WCMD_parameter (args, argno++, &argN, FALSE, FALSE); - HANDLE h; - WCHAR buffer[512]; + HANDLE h, hOut; + char buffer[1024]; DWORD count; + BOOL output_redirected; + char *eof; if (!argN) break; @@ -3434,10 +3436,24 @@ RETURN_CODE WCMD_type(WCHAR *args) if (writeHeaders) { WCMD_output_stderr(L"\n%1\n\n\n", thisArg); } - while (WCMD_ReadFile(h, buffer, ARRAY_SIZE(buffer) - 1, &count)) { + + hOut = GetStdHandle(STD_OUTPUT_HANDLE); + output_redirected = (GetFileType(hOut) != FILE_TYPE_CHAR); + + while (ReadFile(h, buffer, ARRAY_SIZE(buffer) - 1, &count, NULL)) { if (count == 0) break; /* ReadFile reports success on EOF! */ buffer[count] = 0; - WCMD_output_asis (buffer); + /* If output is not redirected then TYPE terminates at the EOF character. */ + if (!output_redirected) { + eof = (char *)memchr((void *)buffer, '\x1A', count); + if (eof) { + count = (DWORD)(eof - buffer); + } + } + WriteFile(hOut, buffer, count, &count, NULL); + if (!output_redirected && eof) { + break; + } } CloseHandle (h); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/8874