From e5d8bf82c3e0301f300c2d0fd22c2e881a76ae7f Mon Sep 17 00:00:00 2001 From: Sebastian Messmer Date: Sat, 19 May 2018 06:29:28 -0700 Subject: [PATCH] Make DontEchoStdinToStdoutRAII work on windows --- src/cpp-utils/io/DontEchoStdinToStdoutRAII.h | 66 +++++++++++++++----- 1 file changed, 49 insertions(+), 17 deletions(-) diff --git a/src/cpp-utils/io/DontEchoStdinToStdoutRAII.h b/src/cpp-utils/io/DontEchoStdinToStdoutRAII.h index 27731534..4ca04803 100644 --- a/src/cpp-utils/io/DontEchoStdinToStdoutRAII.h +++ b/src/cpp-utils/io/DontEchoStdinToStdoutRAII.h @@ -2,38 +2,70 @@ #ifndef MESSMER_CPPUTILS_IO_DONTECHOSTDINTOSTDOUTRAII_H #define MESSMER_CPPUTILS_IO_DONTECHOSTDINTOSTDOUTRAII_H -#include -#include -#include -#include +#include #include "../macros.h" -namespace cpputils { - /** * If you create an instance of this class in your scope, then any user input from stdin * won't be echoed back to stdout until the instance leaves the scope. * This can be very handy for password inputs where you don't want the password to be visible on screen. */ + +#if !defined(_MSC_VER) + +#include +#include + +namespace cpputils { + class DontEchoStdinToStdoutRAII final { public: - DontEchoStdinToStdoutRAII(): _old_state() { - tcgetattr(STDIN_FILENO, &_old_state); - termios new_state = _old_state; - new_state.c_lflag &= ~ECHO; - tcsetattr(STDIN_FILENO, TCSANOW, &new_state); - } + DontEchoStdinToStdoutRAII() : _old_state() { + tcgetattr(STDIN_FILENO, &_old_state); + termios new_state = _old_state; + new_state.c_lflag &= ~ECHO; + tcsetattr(STDIN_FILENO, TCSANOW, &new_state); + } - ~DontEchoStdinToStdoutRAII() { - tcsetattr(STDIN_FILENO, TCSANOW, &_old_state); - } + ~DontEchoStdinToStdoutRAII() { + tcsetattr(STDIN_FILENO, TCSANOW, &_old_state); + } private: - termios _old_state; + termios _old_state; - DISALLOW_COPY_AND_ASSIGN(DontEchoStdinToStdoutRAII); + DISALLOW_COPY_AND_ASSIGN(DontEchoStdinToStdoutRAII); +}; + +} + +#else + +#include + +namespace cpputils { + +class DontEchoStdinToStdoutRAII final { +public: + DontEchoStdinToStdoutRAII() : _old_state() { + HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); + GetConsoleMode(hStdin, &_old_state); + SetConsoleMode(hStdin, _old_state & (~ENABLE_ECHO_INPUT)); + } + + ~DontEchoStdinToStdoutRAII() { + HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); + SetConsoleMode(hStdin, _old_state); + } + +private: + DWORD _old_state; + + DISALLOW_COPY_AND_ASSIGN(DontEchoStdinToStdoutRAII); }; } #endif + +#endif