tools/console: xenconsole tolerate tty errors
authorIan Jackson <ian.jackson@eu.citrix.com>
Thu, 27 Feb 2014 17:46:49 +0000 (17:46 +0000)
committerIan Jackson <Ian.Jackson@eu.citrix.com>
Wed, 19 Mar 2014 13:37:19 +0000 (13:37 +0000)
Since 28d386fc4341 (XSA-57), libxl writes an empty value for the
console tty node, with read-only permission for the guest, when
setting up pv console "frontends".  (The actual tty value is later set
by xenconsoled.)   Writing an empty node is not strictly necessary to
stop the frontend from writing dangerous values here, but it is a good
belt-and-braces approach.

Unfortunately this confuses xenconsole.  It reads the empty value, and
tries to open it as the tty.  xenconsole then exits.

Fix this by having xenconsole treat an empty value the same way as no
value at all.

Also, make the error opening the tty be nonfatal: we just print a
warning, but do not exit.  I think this is helpful in theoretical
situations where xenconsole is racing with libxl and/or xenconsoled.

Signed-off-by: Ian Jackson <Ian.Jackson@eu.citrix.com>
Acked-by: Ian Campbell <Ian.Campbell@citrix.com>
CC: George Dunlap <george.dunlap@eu.citrix.com>
---
v2: Combine two conditions and move the free

tools/console/client/main.c

index 7ce4f24aba7a9e0388fd6317685eec11bd2c2b1d..f4c783bf82bd120c14e02e2705a78afc392cbc05 100644 (file)
@@ -114,12 +114,12 @@ static int get_pty_fd(struct xs_handle *xs, char *path, int seconds)
                        /* We only watch for one thing, so no need to 
                         * disambiguate: just read the pty path */
                        pty_path = xs_read(xs, XBT_NULL, path, &len);
-                       if (pty_path != NULL) {
+                       if (pty_path != NULL && pty_path[0] != '\0') {
                                pty_fd = open(pty_path, O_RDWR | O_NOCTTY);
                                if (pty_fd == -1)
-                                       err(errno, "Could not open tty `%s'", pty_path);
-                               free(pty_path);
+                                       warn("Could not open tty `%s'", pty_path);
                        }
+                       free(pty_path);
                }
        } while (pty_fd == -1 && (now = time(NULL)) < start + seconds);