From 0b893bb2aa563c216b9c85403ffb904aa32fa892 Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Thu, 6 Dec 2012 14:44:14 +0100 Subject: [PATCH] uterm: vt: use current VT if it is unused If we autoselect a VT and the current VT is unused, use it. This is similar to the behavior of Weston and X-Server. Signed-off-by: David Herrmann --- src/uterm_vt.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/uterm_vt.c b/src/uterm_vt.c index 8a00052..a751fac 100644 --- a/src/uterm_vt.c +++ b/src/uterm_vt.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -742,6 +743,7 @@ static int seat_find_vt(const char *seat, char **out) static const char def_vt[] = "/dev/tty0"; char *vt; int ret, fd, err1, id; + struct stat st; ret = asprintf(&vt, "/dev/ttyF%s", seat); if (ret < 0) @@ -756,6 +758,25 @@ static int seat_find_vt(const char *seat, char **out) free(vt); if (!strcmp(seat, "seat0") && !access(def_vt, F_OK)) { + /* First check whether our controlling terminal is a real VT. If + * it is, use it but verify very hard that it really is. */ + ret = fstat(STDERR_FILENO, &st); + if (!ret && major(st.st_rdev) == TTY_MAJOR && + minor(st.st_rdev) > 0) { + ret = asprintf(&vt, "/dev/tty%d", minor(st.st_rdev)); + if (ret < 0) + return -ENOMEM; + + if (!access(vt, F_OK)) { + *out = vt; + return 0; + } + + free(vt); + } + + /* Otherwise, try to find a new terminal via the OPENQRY ioctl + * on any existing VT. */ fd = open(def_vt, O_NONBLOCK | O_NOCTTY | O_CLOEXEC); if (fd < 0) { err1 = errno;