From: Joe Souza jsouza@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); }