Bitcoin ABC  0.22.13
P2P Digital Currency
stdin.cpp
Go to the documentation of this file.
1 // Copyright (c) 2018 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 <io.h> // for isatty()
13 #include <windows.h> // for SetStdinEcho()
14 #else
15 #include <poll.h> // for StdinReady()
16 #include <termios.h> // for SetStdinEcho()
17 #include <unistd.h> // for SetStdinEcho(), isatty()
18 #endif
19 
20 #include <compat/stdin.h>
21 
22 // https://stackoverflow.com/questions/1413445/reading-a-password-from-stdcin
23 void SetStdinEcho(bool enable) {
24 #ifdef WIN32
25  HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
26  DWORD mode;
27  GetConsoleMode(hStdin, &mode);
28  if (!enable) {
29  mode &= ~ENABLE_ECHO_INPUT;
30  } else {
31  mode |= ENABLE_ECHO_INPUT;
32  }
33  SetConsoleMode(hStdin, mode);
34 #else
35  struct termios tty;
36  tcgetattr(STDIN_FILENO, &tty);
37  if (!enable) {
38  tty.c_lflag &= ~ECHO;
39  } else {
40  tty.c_lflag |= ECHO;
41  }
42  (void)tcsetattr(STDIN_FILENO, TCSANOW, &tty);
43 #endif
44 }
45 
46 bool StdinTerminal() {
47 #ifdef WIN32
48  return _isatty(_fileno(stdin));
49 #else
50  return isatty(fileno(stdin));
51 #endif
52 }
53 
54 bool StdinReady() {
55  if (!StdinTerminal()) {
56  return true;
57  }
58 #ifdef WIN32
59  return false;
60 #else
61  struct pollfd fds;
62  fds.fd = 0; /* this is STDIN */
63  fds.events = POLLIN;
64  return poll(&fds, 1, 0) == 1;
65 #endif
66 }
67 
69  SetStdinEcho(false);
70 }
72  SetStdinEcho(true);
73 }
bool StdinTerminal()
Definition: stdin.cpp:46
bool StdinReady()
Definition: stdin.cpp:54
void SetStdinEcho(bool enable)
Definition: stdin.cpp:23
~NoechoInst()
Definition: stdin.cpp:71
NoechoInst()
Definition: stdin.cpp:68