From 1ebd4c1b0c19f2be29e68f03b7cf705ac108e217 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Mon, 22 Jul 2013 13:28:56 +0000 Subject: [PATCH] [PING] - Alexander Yastrebov: Properly write data into the standard output device depending whether it's a char or a block device. CORE-6628 #resolve #comment Patch committed in revision 59552, thank you Alexander and sorry that it took so long! svn path=/trunk/; revision=59553 --- reactos/base/applications/network/ping/ping.c | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/reactos/base/applications/network/ping/ping.c b/reactos/base/applications/network/ping/ping.c index 8aaf3b3776a..f0f2f732443 100644 --- a/reactos/base/applications/network/ping/ping.c +++ b/reactos/base/applications/network/ping/ping.c @@ -143,10 +143,13 @@ void FormatOutput(UINT uID, ...) va_list valist; WCHAR Buf[1024]; + CHAR AnsiBuf[1024]; LPWSTR pBuf = Buf; + PCHAR pAnsiBuf = AnsiBuf; LPWSTR Format; DWORD written; UINT DataLength; + int AnsiLength; va_start(valist, uID); @@ -169,7 +172,28 @@ void FormatOutput(UINT uID, ...) return; } - WriteConsole(hStdOutput, pBuf, DataLength, &written, NULL); + if(GetFileType(hStdOutput) == FILE_TYPE_CHAR) + { + /* Is a console or a printer */ + WriteConsole(hStdOutput, pBuf, DataLength, &written, NULL); + } + else + { + /* Is a pipe, socket, file or other */ + AnsiLength = WideCharToMultiByte(CP_ACP, 0, pBuf, DataLength,\ + NULL, 0, NULL, NULL); + + if(AnsiLength >= sizeof(AnsiBuf)) + pAnsiBuf = (PCHAR)HeapAlloc(GetProcessHeap(), 0, AnsiLength); + + AnsiLength = WideCharToMultiByte(CP_OEMCP, 0, pBuf, DataLength,\ + pAnsiBuf, AnsiLength, " ", NULL); + + WriteFile(hStdOutput, pAnsiBuf, AnsiLength, &written, NULL); + + if(pAnsiBuf != AnsiBuf) + HeapFree(NULL, 0, pAnsiBuf); + } if(pBuf != Buf) LocalFree(pBuf);