[PATCH] xenconsole: Allow non-interactive use

  • From: Martin Lucina <martin@xxxxxxxxxx>
  • Date: Wed, 22 Jul 2015 18:48:09 +0200

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 | 24 ++++++++++++++++++------
1 file changed, 18 insertions(+), 6 deletions(-)

diff --git a/tools/console/client/main.c b/tools/console/client/main.c
index f4c783b..8a42101 100644
--- a/tools/console/client/main.c
+++ b/tools/console/client/main.c
@@ -168,7 +168,8 @@ 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;

@@ -176,8 +177,13 @@ static int console_loop(int fd, struct xs_handle *xs, char
*pty_path)
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;
+ }
+ else {
+ max_fd = -1;
+ }
FD_SET(xs_fd, &fds);
if (xs_fd > max_fd) max_fd = xs_fd;
if (fd != -1) FD_SET(fd, &fds);
@@ -284,6 +290,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 +400,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


Other related posts:

  • » [PATCH] xenconsole: Allow non-interactive use - Martin Lucina