[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH v2] xenconsole: Allow non-interactive use



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 <martin@xxxxxxxxxx>
Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
Cc: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
Cc: Ian Campbell <ian.campbell@xxxxxxxxxx>
Cc: Wei Liu <wei.liu2@xxxxxxxxxx>
---
 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@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.