blob: c4cba0c07cf23aa01751a2a62f4c575326648a85 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
#include "term.h"
#include <termios.h>
#include <unistd.h>
#include <poll.h>
#include <signal.h>
#include <stdlib.h>
class canonical_termios_t
{
public:
canonical_termios_t()
: restore_tios(false)
{
if (tcgetattr(0, &old_tios) == 0)
{
struct termios new_tios = old_tios;
new_tios.c_lflag &= ~(ICANON | ECHO);
if (tcsetattr(0, TCSANOW, &new_tios) == 0)
restore_tios = true;
}
}
~canonical_termios_t()
{
if (restore_tios)
tcsetattr(0, TCSANOW, &old_tios);
}
private:
struct termios old_tios;
bool restore_tios;
};
static canonical_termios_t tios; // exit() will clean up for us
int canonical_terminal_t::read()
{
struct pollfd pfd;
pfd.fd = 0;
pfd.events = POLLIN;
int ret = poll(&pfd, 1, 0);
if (ret <= 0 || !(pfd.revents & POLLIN))
return -1;
unsigned char ch;
ret = ::read(0, &ch, 1);
return ret <= 0 ? -1 : ch;
}
void canonical_terminal_t::write(char ch)
{
if (::write(1, &ch, 1) != 1)
abort();
}
|