If xenconsole is run with stdin closed or redirected to /dev/null,
console_loop() will return immediately due to failure to read from
STDIN_FILENO. This patch tests if stdin and stdout are both connected to
a TTY and, if not, xenconsole will not attempt to read from stdin or
modify stdout terminal attributes.

Existing behaviour when xenconsole is run from a terminal does not
change.

This allows for non-interactive use, eg. running "xl create -c" under
systemd or piping the output of "xl console" to another command.

Signed-off-by: Martin Lucina <mar...@lucina.net>
Cc: Ian Jackson <ian.jack...@eu.citrix.com>
Cc: Stefano Stabellini <stefano.stabell...@eu.citrix.com>
Cc: Ian Campbell <ian.campb...@citrix.com>
Cc: Wei Liu <wei.l...@citrix.com>
---
 tools/console/client/main.c | 23 ++++++++++++++++-------
 1 file changed, 16 insertions(+), 7 deletions(-)

diff --git a/tools/console/client/main.c b/tools/console/client/main.c
index f4c783b..753b3aa 100644
--- a/tools/console/client/main.c
+++ b/tools/console/client/main.c
@@ -168,16 +168,19 @@ static void restore_term(int fd, struct termios *old)
        tcsetattr(fd, TCSANOW, old);
 }
 
-static int console_loop(int fd, struct xs_handle *xs, char *pty_path)
+static int console_loop(int fd, struct xs_handle *xs, char *pty_path,
+                       bool interactive)
 {
-       int ret, xs_fd = xs_fileno(xs), max_fd;
+       int ret, xs_fd = xs_fileno(xs), max_fd = -1;
 
        do {
                fd_set fds;
 
                FD_ZERO(&fds);
-               FD_SET(STDIN_FILENO, &fds);
-               max_fd = STDIN_FILENO;
+               if (interactive) {
+                       FD_SET(STDIN_FILENO, &fds);
+                       max_fd = STDIN_FILENO;
+               }
                FD_SET(xs_fd, &fds);
                if (xs_fd > max_fd) max_fd = xs_fd;
                if (fd != -1) FD_SET(fd, &fds);
@@ -284,6 +287,10 @@ int main(int argc, char **argv)
        struct xs_handle *xs;
        char *end;
        console_type type = CONSOLE_INVAL;
+       bool interactive = 0;
+
+       if (isatty(STDIN_FILENO) && isatty(STDOUT_FILENO))
+               interactive = 1;
 
        while((ch = getopt_long(argc, argv, sopt, lopt, &opt_ind)) != -1) {
                switch(ch) {
@@ -390,9 +397,11 @@ int main(int argc, char **argv)
        }
 
        init_term(spty, &attr);
-       init_term(STDIN_FILENO, &stdin_old_attr);
-       atexit(restore_term_stdin); /* if this fails, oh dear */
-       console_loop(spty, xs, path);
+       if (interactive) {
+               init_term(STDIN_FILENO, &stdin_old_attr);
+               atexit(restore_term_stdin); /* if this fails, oh dear */
+       }
+       console_loop(spty, xs, path, interactive);
 
        free(path);
        free(dom_path);
-- 
2.1.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

Reply via email to