launcher: Add back support for specifying VT to run on
This is only available when running weston directly as root typically for ssh logins. It's a somewhat destructive option, as it will take over any existing VT completely, unless there's already an display server running there. https://bugs.freedesktop.org/show_bug.cgi?id=69731
This commit is contained in:
parent
1468e60647
commit
6ff3ff57aa
|
@ -2564,7 +2564,7 @@ drm_compositor_create(struct wl_display *display,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if we run drm-backend using weston-launch */
|
/* Check if we run drm-backend using weston-launch */
|
||||||
ec->base.launcher = weston_launcher_connect(&ec->base);
|
ec->base.launcher = weston_launcher_connect(&ec->base, tty);
|
||||||
if (ec->base.launcher == NULL) {
|
if (ec->base.launcher == NULL) {
|
||||||
weston_log("fatal: drm backend should be run "
|
weston_log("fatal: drm backend should be run "
|
||||||
"using weston-launch binary or as root\n");
|
"using weston-launch binary or as root\n");
|
||||||
|
|
|
@ -880,7 +880,8 @@ fbdev_compositor_create(struct wl_display *display, int *argc, char *argv[],
|
||||||
goto out_free;
|
goto out_free;
|
||||||
|
|
||||||
/* Check if we run fbdev-backend using weston-launch */
|
/* Check if we run fbdev-backend using weston-launch */
|
||||||
compositor->base.launcher = weston_launcher_connect(&compositor->base);
|
compositor->base.launcher =
|
||||||
|
weston_launcher_connect(&compositor->base, param->tty);
|
||||||
if (compositor->base.launcher == NULL && geteuid() != 0) {
|
if (compositor->base.launcher == NULL && geteuid() != 0) {
|
||||||
weston_log("fatal: fbdev backend should be run "
|
weston_log("fatal: fbdev backend should be run "
|
||||||
"using weston-launch binary or as root\n");
|
"using weston-launch binary or as root\n");
|
||||||
|
@ -897,7 +898,8 @@ fbdev_compositor_create(struct wl_display *display, int *argc, char *argv[],
|
||||||
compositor->session_listener.notify = session_notify;
|
compositor->session_listener.notify = session_notify;
|
||||||
wl_signal_add(&compositor->base.session_signal,
|
wl_signal_add(&compositor->base.session_signal,
|
||||||
&compositor->session_listener);
|
&compositor->session_listener);
|
||||||
compositor->base.launcher = weston_launcher_connect(&compositor->base);
|
compositor->base.launcher =
|
||||||
|
weston_launcher_connect(&compositor->base, param->tty);
|
||||||
if (!compositor->base.launcher) {
|
if (!compositor->base.launcher) {
|
||||||
weston_log("Failed to set up launcher.\n");
|
weston_log("Failed to set up launcher.\n");
|
||||||
goto out_udev;
|
goto out_udev;
|
||||||
|
|
|
@ -751,7 +751,8 @@ rpi_compositor_create(struct wl_display *display, int *argc, char *argv[],
|
||||||
compositor->session_listener.notify = session_notify;
|
compositor->session_listener.notify = session_notify;
|
||||||
wl_signal_add(&compositor->base.session_signal,
|
wl_signal_add(&compositor->base.session_signal,
|
||||||
&compositor ->session_listener);
|
&compositor ->session_listener);
|
||||||
compositor->base.launcher = weston_launcher_connect(&compositor->base);
|
compositor->base.launcher =
|
||||||
|
weston_launcher_connect(&compositor->base, param->tty);
|
||||||
if (!compositor->base.launcher) {
|
if (!compositor->base.launcher) {
|
||||||
weston_log("Failed to initialize tty.\n");
|
weston_log("Failed to initialize tty.\n");
|
||||||
goto out_udev;
|
goto out_udev;
|
||||||
|
|
|
@ -247,22 +247,50 @@ vt_handler(int signal_number, void *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
setup_tty(struct weston_launcher *launcher)
|
setup_tty(struct weston_launcher *launcher, int tty)
|
||||||
{
|
{
|
||||||
struct wl_event_loop *loop;
|
struct wl_event_loop *loop;
|
||||||
struct vt_mode mode = { 0 };
|
struct vt_mode mode = { 0 };
|
||||||
struct stat buf;
|
struct stat buf;
|
||||||
int ret;
|
char tty_device[32] ="<stdin>";
|
||||||
|
int ret, kd_mode;
|
||||||
|
|
||||||
if (fstat(STDIN_FILENO, &buf) == -1 ||
|
if (tty == 0) {
|
||||||
|
launcher->tty = tty;
|
||||||
|
} else {
|
||||||
|
snprintf(tty_device, sizeof tty_device, "/dev/tty%d", tty);
|
||||||
|
launcher->tty = open(tty_device, O_RDWR | O_CLOEXEC);
|
||||||
|
if (launcher->tty == -1) {
|
||||||
|
weston_log("couldn't open tty %s: %m\n", tty_device);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fstat(launcher->tty, &buf) == -1 ||
|
||||||
major(buf.st_rdev) != TTY_MAJOR || minor(buf.st_rdev) == 0) {
|
major(buf.st_rdev) != TTY_MAJOR || minor(buf.st_rdev) == 0) {
|
||||||
weston_log("stdin not a vt\n");
|
weston_log("%s not a vt\n", tty_device);
|
||||||
weston_log("if running weston from ssh, "
|
weston_log("if running weston from ssh, "
|
||||||
"use --tty to specify a tty\n");
|
"use --tty to specify a tty\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
launcher->tty = STDIN_FILENO;
|
ret = ioctl(launcher->tty, KDGETMODE, &kd_mode);
|
||||||
|
if (ret) {
|
||||||
|
weston_log("failed to get VT mode: %m\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (kd_mode != KD_TEXT) {
|
||||||
|
weston_log("%s is already in graphics mode, "
|
||||||
|
"is another display server running?\n", tty_device);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = ioctl(launcher->tty, VT_ACTIVATE, minor(buf.st_rdev));
|
||||||
|
weston_log("VT_ACTIVATE ret=%d, %m vt\n", ret);
|
||||||
|
|
||||||
|
ret = ioctl(launcher->tty, VT_WAITACTIVE, minor(buf.st_rdev));
|
||||||
|
weston_log("VT_WAITACTIVE ret=%d, %m vt\n", ret);
|
||||||
|
|
||||||
if (ioctl(launcher->tty, KDGKBMODE, &launcher->kb_mode)) {
|
if (ioctl(launcher->tty, KDGKBMODE, &launcher->kb_mode)) {
|
||||||
weston_log("failed to read keyboard mode: %m\n");
|
weston_log("failed to read keyboard mode: %m\n");
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -304,7 +332,7 @@ weston_launcher_activate_vt(struct weston_launcher *launcher, int vt)
|
||||||
}
|
}
|
||||||
|
|
||||||
struct weston_launcher *
|
struct weston_launcher *
|
||||||
weston_launcher_connect(struct weston_compositor *compositor)
|
weston_launcher_connect(struct weston_compositor *compositor, int tty)
|
||||||
{
|
{
|
||||||
struct weston_launcher *launcher;
|
struct weston_launcher *launcher;
|
||||||
struct wl_event_loop *loop;
|
struct wl_event_loop *loop;
|
||||||
|
@ -328,7 +356,7 @@ weston_launcher_connect(struct weston_compositor *compositor)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
} else if (geteuid() == 0) {
|
} else if (geteuid() == 0) {
|
||||||
if (setup_tty(launcher) == -1) {
|
if (setup_tty(launcher, tty) == -1) {
|
||||||
free(launcher);
|
free(launcher);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
struct weston_launcher;
|
struct weston_launcher;
|
||||||
|
|
||||||
struct weston_launcher *
|
struct weston_launcher *
|
||||||
weston_launcher_connect(struct weston_compositor *compositor);
|
weston_launcher_connect(struct weston_compositor *compositor, int tty);
|
||||||
|
|
||||||
void
|
void
|
||||||
weston_launcher_destroy(struct weston_launcher *launcher);
|
weston_launcher_destroy(struct weston_launcher *launcher);
|
||||||
|
|
Loading…
Reference in New Issue