Commit bd1e39a7 authored by Stefan Agner's avatar Stefan Agner Committed by Pekka Paalanen

weston-launch: reset tty properly

On weston-launch exit we see errors such as:
  failed to restore keyboard mode: Invalid argument
  failed to set KD_TEXT mode on tty: Invalid argument

This has been resolved by making sure the tty file descriptor
does not get closed. However, the ioctrl's KDSKBMODE/KDSETMODE
and VT_SETMODE still fail with -EIO:
  failed to restore keyboard mode: Input/output error
  failed to set KD_TEXT mode on tty: Input/output error

It turns out the reason for this lies in some very particular
behavior of the kernel, the separation of weston-launch/weston
and the fact that we restore the tty only after the weston
process quits: When the controlling process for a TTY exits,
all open file descriptors for that TTY are put in a hung-up
state! For more details see this systemd-logind issue:

We can work around by reopening the particular TTY. This allows
to properly restore the TTY settings such that a successive VT
switch will show text terminals fine again.
Signed-off-by: default avatarStefan Agner <>
Reviewed-by: default avatarEmil Velikov <>
parent 247392a3
......@@ -440,6 +440,7 @@ quit(struct weston_launch *wl, int status)
struct vt_mode mode = { 0 };
int err;
int oldtty;
......@@ -452,6 +453,19 @@ quit(struct weston_launch *wl, int status)
pam_end(wl->ph, err);
* Get a fresh handle to the tty as the previous one is in
* hang-up state since weston (the controlling process for
* the tty) exit at this point. Reopen before closing the
* file descriptor to avoid a potential race condition.
* A similar fix exists in logind, see:
oldtty = wl->tty;
wl->tty = open_tty_by_number(wl->ttynr);
if (ioctl(wl->tty, KDSKBMUTE, 0) &&
ioctl(wl->tty, KDSKBMODE, wl->kb_mode))
fprintf(stderr, "failed to restore keyboard mode: %s\n",
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment