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