diff options
author | Karl-Johan Alm <kalle.alm@gmail.com> | 2018-07-19 23:48:38 +0900 |
---|---|---|
committer | Karl-Johan Alm <karljohan-alm@garage.co.jp> | 2019-10-01 12:19:31 +0900 |
commit | 0da503e9475fea5644168544668581796bf66334 (patch) | |
tree | 76c6131af2e7580f6ce5c51f2322fd4dc68daffd /src/compat/stdin.cpp | |
parent | b0e268d2f6ac9b80247b5dab353794ba6b3c2828 (diff) |
add stdin helpers for password input support
Diffstat (limited to 'src/compat/stdin.cpp')
-rw-r--r-- | src/compat/stdin.cpp | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/src/compat/stdin.cpp b/src/compat/stdin.cpp new file mode 100644 index 0000000000..4f2ba1e9c4 --- /dev/null +++ b/src/compat/stdin.cpp @@ -0,0 +1,72 @@ +// Copyright (c) 2018 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#if defined(HAVE_CONFIG_H) +#include <config/bitcoin-config.h> +#endif + +#include <cstdio> // for fileno(), stdin + +#ifdef WIN32 +#include <windows.h> // for SetStdinEcho() +#include <io.h> // for isatty() +#else +#include <termios.h> // for SetStdinEcho() +#include <unistd.h> // for SetStdinEcho(), isatty() +#include <sys/poll.h> // for StdinReady() +#endif + +#include <compat/stdin.h> + +// https://stackoverflow.com/questions/1413445/reading-a-password-from-stdcin +void SetStdinEcho(bool enable) +{ +#ifdef WIN32 + HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); + DWORD mode; + GetConsoleMode(hStdin, &mode); + if (!enable) { + mode &= ~ENABLE_ECHO_INPUT; + } else { + mode |= ENABLE_ECHO_INPUT; + } + SetConsoleMode(hStdin, mode); +#else + struct termios tty; + tcgetattr(STDIN_FILENO, &tty); + if (!enable) { + tty.c_lflag &= ~ECHO; + } else { + tty.c_lflag |= ECHO; + } + (void)tcsetattr(STDIN_FILENO, TCSANOW, &tty); +#endif +} + +bool StdinTerminal() +{ +#ifdef WIN32 + return _isatty(_fileno(stdin)); +#else + return isatty(fileno(stdin)); +#endif +} + +bool StdinReady() +{ + if (!StdinTerminal()) { + return true; + } +#ifdef WIN32 + return false; +#else + struct pollfd fds; + fds.fd = 0; /* this is STDIN */ + fds.events = POLLIN; + return poll(&fds, 1, 0) == 1; +#endif +} + +NoechoInst::NoechoInst() { SetStdinEcho(false); } +NoechoInst::~NoechoInst() { SetStdinEcho(true); } |