text: // Copyright (c) 2018-2019 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/techcoin-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 <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); }
  