diff options
Diffstat (limited to 'tools/plink/winplink.c')
-rwxr-xr-x[-rw-r--r--] | tools/plink/winplink.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/tools/plink/winplink.c b/tools/plink/winplink.c index 451eff3b8..29ed4e5d2 100644..100755 --- a/tools/plink/winplink.c +++ b/tools/plink/winplink.c @@ -3,6 +3,7 @@ */ #include <stdio.h> +#include <fcntl.h> #include <stdlib.h> #include <assert.h> #include <stdarg.h> @@ -774,3 +775,57 @@ int main(int argc, char **argv) cleanup_exit(exitcode); return 0; /* placate compiler warning */ } + +#ifdef _MSC_VER +#pragma warning(disable:4273) +#endif + +#ifndef _DEBUG +_Check_return_opt_ int __cdecl printf(_In_z_ _Printf_format_string_ const char * pFmt, ...) +{ + static int ConsoleCreated=0; + va_list arglist; + if (!ConsoleCreated) + { + int hConHandle; + long lStdHandle; + CONSOLE_SCREEN_BUFFER_INFO coninfo; + + FILE *fp; + const unsigned int MAX_CONSOLE_LINES = 500; + ConsoleCreated=1; + if (!AttachConsole(ATTACH_PARENT_PROCESS)) + AllocConsole(); + + // set the screen buffer to be big enough to let us scroll text + GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo); + coninfo.dwSize.Y = MAX_CONSOLE_LINES; + SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize); + + // redirect unbuffered STDOUT to the console + lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE); + hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); + fp = fdopen( hConHandle, "w" ); + *stdout = *fp; + setvbuf( stdout, NULL, _IONBF, 0 ); + + // redirect unbuffered STDIN to the console + lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE); + hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); + fp = fdopen( hConHandle, "r" ); + *stdin = *fp; + setvbuf( stdin, NULL, _IONBF, 0 ); + + // redirect unbuffered STDERR to the console + lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE); + hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); + fp = fdopen( hConHandle, "w" ); + *stderr = *fp; + setvbuf( stderr, NULL, _IONBF, 0 ); + + } + + va_start(arglist, pFmt ); + return vfprintf(stderr, pFmt, arglist); +} +#endif |