55 lines
1.7 KiB
Diff
55 lines
1.7 KiB
Diff
|
Subject: tools/console: reset tty when xenconsole fails
|
||
|
From: Ian Jackson ian.jackson@eu.citrix.com Mon Feb 24 15:16:19 2014 +0000
|
||
|
Date: Wed Mar 19 13:37:19 2014 +0000:
|
||
|
Git: 111931f36885874103d65685ab15ea3d25d93da7
|
||
|
|
||
|
If xenconsole (the client program) fails, it calls err. This would
|
||
|
previously neglect to reset the user's terminal to sanity. Use atexit
|
||
|
to do so.
|
||
|
|
||
|
This routinely happens in Xen 4.4 RC5 with pygrub because libxl
|
||
|
writes the value "" to the tty xenstore key when using xenconsole.
|
||
|
After this patch this just results in a harmless error message.
|
||
|
|
||
|
Reported-by: M A Young <m.a.young@durham.ac.uk>
|
||
|
Signed-off-by: Ian Jackson <Ian.Jackson@eu.citrix.com>
|
||
|
CC: M A Young <m.a.young@durham.ac.uk>
|
||
|
CC: Ian Campbell <Ian.Campbell@citrix.com>
|
||
|
Acked-by: George Dunlap <george.dunlap@eu.citrix.com>
|
||
|
Acked-by: Ian Campbell <ian.campbell@citrix.com>
|
||
|
|
||
|
---
|
||
|
v2: Fix whitespace error (reintroduce hard tab)
|
||
|
Fix commit message not to claim ignorance about root cause
|
||
|
|
||
|
Index: xen-4.4.0-testing/tools/console/client/main.c
|
||
|
===================================================================
|
||
|
--- xen-4.4.0-testing.orig/tools/console/client/main.c
|
||
|
+++ xen-4.4.0-testing/tools/console/client/main.c
|
||
|
@@ -258,6 +258,13 @@ typedef enum {
|
||
|
CONSOLE_SERIAL,
|
||
|
} console_type;
|
||
|
|
||
|
+static struct termios stdin_old_attr;
|
||
|
+
|
||
|
+static void restore_term_stdin(void)
|
||
|
+{
|
||
|
+ restore_term(STDIN_FILENO, &stdin_old_attr);
|
||
|
+}
|
||
|
+
|
||
|
int main(int argc, char **argv)
|
||
|
{
|
||
|
struct termios attr;
|
||
|
@@ -384,9 +391,9 @@ int main(int argc, char **argv)
|
||
|
}
|
||
|
|
||
|
init_term(spty, &attr);
|
||
|
- init_term(STDIN_FILENO, &attr);
|
||
|
+ init_term(STDIN_FILENO, &stdin_old_attr);
|
||
|
+ atexit(restore_term_stdin); /* if this fails, oh dear */
|
||
|
console_loop(spty, xs, path);
|
||
|
- restore_term(STDIN_FILENO, &attr);
|
||
|
|
||
|
free(path);
|
||
|
free(dom_path);
|