[PATCH v3] weston-launch: Fixed TTY switching

mateuszx.potrola at intel.com mateuszx.potrola at intel.com
Mon May 11 00:00:51 PDT 2015


From: Mateusz Polrola <mateuszx.potrola at intel.com>

After weston-launch is executing weston it cannot close TTY file,
because it is still required to properly handle SIGUSR1 and SIGUSR2
signals that are used for switching TTY.

Additionally after opening TTY it has to be activated, so that user
don't have to manually switch to TTY used by weston first to be able to switch
to other TTY.
During shutdown TTY file has to be reopened, as device was already deinitialize by child
process, but it is still required to cleanup VT handling and leave
system in sane state.

Changes since v1:
- Use snprintf to copy tty filename and check for truncation
- Checking for errors of VT_ACTIVATE ioctl call
- Removed VT_WAITACTIVATE ioctl call

Changes since v2:
- Removed extra call to strcpy

Signed-off-by: Mateusz Polrola <mateuszx.potrola at intel.com>
---
 src/weston-launch.c |   22 +++++++++++++++++++---
 1 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/src/weston-launch.c b/src/weston-launch.c
index 10c66de..7eeac27 100644
--- a/src/weston-launch.c
+++ b/src/weston-launch.c
@@ -46,6 +46,7 @@
 #include <linux/vt.h>
 #include <linux/major.h>
 #include <linux/kd.h>
+#include <linux/limits.h>
 
 #include <pwd.h>
 #include <grp.h>
@@ -105,6 +106,7 @@ struct weston_launch {
 	pid_t child;
 	int verbose;
 	char *new_user;
+	char tty_path[PATH_MAX];
 };
 
 union cmsg_data { unsigned char b[4]; int fd; };
@@ -419,6 +421,13 @@ quit(struct weston_launch *wl, int status)
 		pam_end(wl->ph, err);
 	}
 
+	/* tty will be deinitialized by child process, so it has to be
+	 * opened again to correctly cleanup vt handling. */
+	if (wl->tty != STDIN_FILENO) {
+		close(wl->tty);
+		wl->tty = open(wl->tty_path, O_RDWR | O_NOCTTY);
+	}
+
 	if (ioctl(wl->tty, KDSKBMUTE, 0) &&
 	    ioctl(wl->tty, KDSKBMODE, wl->kb_mode))
 		fprintf(stderr, "failed to restore keyboard mode: %m\n");
@@ -521,8 +530,11 @@ setup_tty(struct weston_launch *wl, const char *tty)
 		t = ttyname(STDIN_FILENO);
 		if (t && strcmp(t, tty) == 0)
 			wl->tty = STDIN_FILENO;
-		else
+		else {
 			wl->tty = open(tty, O_RDWR | O_NOCTTY);
+			if (snprintf(wl->tty_path, PATH_MAX, "%s", tty) >= PATH_MAX)
+				error(1, 0, "tty filename too long");
+		}
 	} else {
 		int tty0 = open("/dev/tty0", O_WRONLY | O_CLOEXEC);
 		char filename[16];
@@ -536,6 +548,8 @@ setup_tty(struct weston_launch *wl, const char *tty)
 		snprintf(filename, sizeof filename, "/dev/tty%d", wl->ttynr);
 		wl->tty = open(filename, O_RDWR | O_NOCTTY);
 		close(tty0);
+		if (snprintf(wl->tty_path, PATH_MAX, "%s", filename) >= PATH_MAX)
+			error(1, 0, "tty filename too long");
 	}
 
 	if (wl->tty < 0)
@@ -555,6 +569,10 @@ setup_tty(struct weston_launch *wl, const char *tty)
 		wl->ttynr = minor(buf.st_rdev);
 	}
 
+	/* Activate tty, otherwise tty switches won't work right away. */
+	if (ioctl(wl->tty, VT_ACTIVATE, wl->ttynr))
+		error(1, errno, "failed to activate tty: %m\n");
+
 	if (ioctl(wl->tty, KDGKBMODE, &wl->kb_mode))
 		error(1, errno, "failed to get current keyboard mode: %m\n");
 
@@ -744,8 +762,6 @@ main(int argc, char *argv[])
 		launch_compositor(&wl, argc - optind, argv + optind);
 
 	close(wl.sock[1]);
-	if (wl.tty != STDIN_FILENO)
-		close(wl.tty);
 
 	while (1) {
 		struct pollfd fds[2];
-- 
1.7.7.6

--------------------------------------------------------------
Intel Shannon Limited
Registered in Ireland
Registered Office: Collinstown Industrial Park, Leixlip, County Kildare
Registered Number: 308263
Business address: Dromore House, East Park, Shannon, Co. Clare

This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). Any review or distribution by others is strictly prohibited. If you are not the intended recipient, please contact the sender and delete all copies.




More information about the wayland-devel mailing list