Line data Source code
1 : // Copyright (c) 2018-2019 The Bitcoin Core developers 2 : // Distributed under the MIT software license, see the accompanying 3 : // file COPYING or http://www.opensource.org/licenses/mit-license.php. 4 : 5 : #if defined(HAVE_CONFIG_H) 6 : #include <config/bitcoin-config.h> 7 : #endif 8 : 9 : #include <cstdio> // for fileno(), stdin 10 : 11 : #ifdef WIN32 12 : #include <windows.h> // for SetStdinEcho() 13 : #include <io.h> // for isatty() 14 : #else 15 : #include <termios.h> // for SetStdinEcho() 16 : #include <unistd.h> // for SetStdinEcho(), isatty() 17 : #include <poll.h> // for StdinReady() 18 : #endif 19 : 20 : #include <compat/stdin.h> 21 : 22 : // https://stackoverflow.com/questions/1413445/reading-a-password-from-stdcin 23 8 : void SetStdinEcho(bool enable) 24 : { 25 : #ifdef WIN32 26 : HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); 27 : DWORD mode; 28 : GetConsoleMode(hStdin, &mode); 29 : if (!enable) { 30 : mode &= ~ENABLE_ECHO_INPUT; 31 : } else { 32 : mode |= ENABLE_ECHO_INPUT; 33 : } 34 : SetConsoleMode(hStdin, mode); 35 : #else 36 8 : struct termios tty; 37 8 : tcgetattr(STDIN_FILENO, &tty); 38 8 : if (!enable) { 39 4 : tty.c_lflag &= ~ECHO; 40 4 : } else { 41 4 : tty.c_lflag |= ECHO; 42 : } 43 8 : (void)tcsetattr(STDIN_FILENO, TCSANOW, &tty); 44 : #endif 45 8 : } 46 : 47 10 : bool StdinTerminal() 48 : { 49 : #ifdef WIN32 50 : return _isatty(_fileno(stdin)); 51 : #else 52 10 : return isatty(fileno(stdin)); 53 : #endif 54 : } 55 : 56 4 : bool StdinReady() 57 : { 58 4 : if (!StdinTerminal()) { 59 4 : return true; 60 : } 61 : #ifdef WIN32 62 : return false; 63 : #else 64 0 : struct pollfd fds; 65 0 : fds.fd = 0; /* this is STDIN */ 66 0 : fds.events = POLLIN; 67 0 : return poll(&fds, 1, 0) == 1; 68 : #endif 69 4 : } 70 : 71 8 : NoechoInst::NoechoInst() { SetStdinEcho(false); } 72 8 : NoechoInst::~NoechoInst() { SetStdinEcho(true); }