From 2a90e2940870c66a1d702ae87dadb851a79193cf Mon Sep 17 00:00:00 2001 From: Anton Vorontsov Date: Fri, 17 Jun 2011 20:10:46 +0400 Subject: [PATCH] kvm tools: Fix broken terminal when kvm exits because of a signal Issuing 'killall kvm' leaves the terminal on which kvm was running in a broken state. This is because atexit(3) handlers are not called if a process terminates because of a signal. Installing a proper handler for the TERM signal fixes the issue. p.s. The rest of the kvm tools use signal(2), and not sigaction(2), so I continue the tradition. Signed-off-by: Anton Vorontsov Signed-off-by: Pekka Enberg --- tools/kvm/term.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tools/kvm/term.c b/tools/kvm/term.c index 689d52dfefb6..9947223273de 100644 --- a/tools/kvm/term.c +++ b/tools/kvm/term.c @@ -4,6 +4,7 @@ #include #include #include +#include #include "kvm/read-write.h" #include "kvm/term.h" @@ -102,6 +103,13 @@ static void term_cleanup(void) tcsetattr(STDIN_FILENO, TCSANOW, &orig_term); } +static void term_sig_cleanup(int sig) +{ + term_cleanup(); + signal(sig, SIG_DFL); + raise(sig); +} + void term_init(void) { struct termios term; @@ -113,5 +121,6 @@ void term_init(void) term.c_lflag &= ~(ICANON | ECHO | ISIG); tcsetattr(STDIN_FILENO, TCSANOW, &term); + signal(SIGTERM, term_sig_cleanup); atexit(term_cleanup); } -- 2.39.5