xref: /kvmtool/term.c (revision b4405289e6180bd98050ebb6ab5192bf6a62a0a0)
1*b4405289SAsias He #include <poll.h>
2*b4405289SAsias He #include <stdbool.h>
3*b4405289SAsias He #include <termios.h>
4*b4405289SAsias He #include <stdio.h>
5*b4405289SAsias He #include <unistd.h>
6*b4405289SAsias He #include <sys/uio.h>
7*b4405289SAsias He 
8*b4405289SAsias He #include "kvm/read-write.h"
9*b4405289SAsias He #include "kvm/term.h"
10*b4405289SAsias He #include "kvm/util.h"
11*b4405289SAsias He 
12*b4405289SAsias He static struct termios orig_term;
13*b4405289SAsias He 
14*b4405289SAsias He int active_console = CONSOLE_8250;
15*b4405289SAsias He 
16*b4405289SAsias He int term_getc(int who)
17*b4405289SAsias He {
18*b4405289SAsias He 	int c;
19*b4405289SAsias He 
20*b4405289SAsias He 	if (who != active_console)
21*b4405289SAsias He 		return -1;
22*b4405289SAsias He 
23*b4405289SAsias He 	if (read_in_full(STDIN_FILENO, &c, 1) < 0)
24*b4405289SAsias He 		return -1;
25*b4405289SAsias He 	return c;
26*b4405289SAsias He }
27*b4405289SAsias He 
28*b4405289SAsias He int term_putc(int who, char *addr, int cnt)
29*b4405289SAsias He {
30*b4405289SAsias He 	if (who != active_console)
31*b4405289SAsias He 		return -1;
32*b4405289SAsias He 
33*b4405289SAsias He 	while (cnt--) {
34*b4405289SAsias He 		fprintf(stdout, "%c", *addr++);
35*b4405289SAsias He 	}
36*b4405289SAsias He 
37*b4405289SAsias He 	fflush(stdout);
38*b4405289SAsias He 	return cnt;
39*b4405289SAsias He }
40*b4405289SAsias He 
41*b4405289SAsias He int term_getc_iov(int who, struct iovec *iov, int iovcnt)
42*b4405289SAsias He {
43*b4405289SAsias He 	if (who != active_console)
44*b4405289SAsias He 		return -1;
45*b4405289SAsias He 
46*b4405289SAsias He 	return readv(STDIN_FILENO, iov, iovcnt);
47*b4405289SAsias He }
48*b4405289SAsias He 
49*b4405289SAsias He int term_putc_iov(int who, struct iovec *iov, int iovcnt)
50*b4405289SAsias He {
51*b4405289SAsias He 	if (who != active_console)
52*b4405289SAsias He 		return -1;
53*b4405289SAsias He 
54*b4405289SAsias He 	return writev(STDOUT_FILENO, iov, iovcnt);
55*b4405289SAsias He }
56*b4405289SAsias He 
57*b4405289SAsias He bool term_readable(int who)
58*b4405289SAsias He {
59*b4405289SAsias He 	struct pollfd pollfd = (struct pollfd) {
60*b4405289SAsias He 		.fd	= STDIN_FILENO,
61*b4405289SAsias He 		.events	= POLLIN,
62*b4405289SAsias He 		.revents = 0,
63*b4405289SAsias He 	};
64*b4405289SAsias He 
65*b4405289SAsias He 	if (who != active_console)
66*b4405289SAsias He 		return false;
67*b4405289SAsias He 
68*b4405289SAsias He 	return poll(&pollfd, 1, 0) > 0;
69*b4405289SAsias He }
70*b4405289SAsias He 
71*b4405289SAsias He static void term_cleanup(void)
72*b4405289SAsias He {
73*b4405289SAsias He 	tcsetattr(STDIN_FILENO, TCSANOW, &orig_term);
74*b4405289SAsias He }
75*b4405289SAsias He 
76*b4405289SAsias He void term_init(void)
77*b4405289SAsias He {
78*b4405289SAsias He 	struct termios term;
79*b4405289SAsias He 
80*b4405289SAsias He 	if (tcgetattr(STDIN_FILENO, &orig_term) < 0)
81*b4405289SAsias He 		die("unable to save initial standard input settings");
82*b4405289SAsias He 
83*b4405289SAsias He 	term = orig_term;
84*b4405289SAsias He 	term.c_lflag &= ~(ICANON |ECHO | ISIG);
85*b4405289SAsias He 	tcsetattr(STDIN_FILENO, TCSANOW, &term);
86*b4405289SAsias He 
87*b4405289SAsias He 	atexit(term_cleanup);
88*b4405289SAsias He }
89