LCOV - code coverage report
Current view: top level - src/compat - stdin.cpp (source / functions) Hit Total Coverage
Test: total_coverage.info Lines: 17 21 81.0 %
Date: 2020-09-26 01:30:44 Functions: 7 7 100.0 %

          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); }

Generated by: LCOV version 1.15