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