diff --git a/main.c b/main.c index 650f225..1f32329 100644 --- a/main.c +++ b/main.c @@ -30,6 +30,24 @@ static void usage(char *argv[]) static struct kvm *kvm; +static struct termios tty_origin_stdin; +static struct termios tty_origin_stdout; +static struct termios tty_origin_stderr; + +static void tty_save_origins(void) +{ + tcgetattr(fileno(stdin), &tty_origin_stdin); + tcgetattr(fileno(stdout), &tty_origin_stdout); + tcgetattr(fileno(stderr), &tty_origin_stderr); +} + +static void tty_restore_origins(void) +{ + tcsetattr(fileno(stdin), TCSAFLUSH, &tty_origin_stdin); + tcsetattr(fileno(stdout), TCSAFLUSH, &tty_origin_stdout); + tcsetattr(fileno(stderr), TCSAFLUSH, &tty_origin_stderr); +} + static void tty_set_canon_flag(int fd, int on) { struct termios tty; @@ -46,6 +64,7 @@ static void tty_set_canon_flag(int fd, int on) static void shutdown(void) { tty_set_canon_flag(fileno(stdin), 0); + tty_restore_origins(); } static void handle_sigint(int sig) @@ -123,6 +142,8 @@ int main(int argc, char *argv[]) bool single_step = false; int i; + tty_save_origins(); + atexit(shutdown); signal(SIGQUIT, handle_sigquit);