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

[Xen-changelog] [xen master] xenconsole: Allow non-interactive use



commit 9072240954fc8a7c74ae04d2eb51c98bc0cb3356
Author:     Martin Lucina <martin@xxxxxxxxxx>
AuthorDate: Fri Jul 24 13:30:48 2015 +0200
Commit:     Ian Campbell <ian.campbell@xxxxxxxxxx>
CommitDate: Fri Jul 24 12:41:24 2015 +0100

    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>
    Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
---
 tools/console/client/main.c |   23 ++++++++++++++++-------
 1 files 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);
--
generated by git-patchbot for /home/xen/git/xen.git#master

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

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