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