|
|
@ -28,6 +28,7 @@ |
|
|
|
#include <assert.h> |
|
|
|
#include <assert.h> |
|
|
|
#include <poll.h> |
|
|
|
#include <poll.h> |
|
|
|
#include <errno.h> |
|
|
|
#include <errno.h> |
|
|
|
|
|
|
|
#include <termios.h> |
|
|
|
|
|
|
|
|
|
|
|
#include <error.h> |
|
|
|
#include <error.h> |
|
|
|
#include <getopt.h> |
|
|
|
#include <getopt.h> |
|
|
@ -45,6 +46,7 @@ |
|
|
|
#include <termios.h> |
|
|
|
#include <termios.h> |
|
|
|
#include <linux/vt.h> |
|
|
|
#include <linux/vt.h> |
|
|
|
#include <linux/major.h> |
|
|
|
#include <linux/major.h> |
|
|
|
|
|
|
|
#include <linux/kd.h> |
|
|
|
|
|
|
|
|
|
|
|
#include <pwd.h> |
|
|
|
#include <pwd.h> |
|
|
|
#include <grp.h> |
|
|
|
#include <grp.h> |
|
|
@ -69,6 +71,8 @@ struct weston_launch { |
|
|
|
int ttynr; |
|
|
|
int ttynr; |
|
|
|
int sock[2]; |
|
|
|
int sock[2]; |
|
|
|
int drm_fd; |
|
|
|
int drm_fd; |
|
|
|
|
|
|
|
struct termios terminal_attributes; |
|
|
|
|
|
|
|
int kb_mode; |
|
|
|
struct passwd *pw; |
|
|
|
struct passwd *pw; |
|
|
|
|
|
|
|
|
|
|
|
int signalfd; |
|
|
|
int signalfd; |
|
|
@ -369,6 +373,7 @@ handle_socket_msg(struct weston_launch *wl) |
|
|
|
static void |
|
|
|
static void |
|
|
|
quit(struct weston_launch *wl, int status) |
|
|
|
quit(struct weston_launch *wl, int status) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
struct vt_mode mode = { 0 }; |
|
|
|
int err; |
|
|
|
int err; |
|
|
|
|
|
|
|
|
|
|
|
close(wl->signalfd); |
|
|
|
close(wl->signalfd); |
|
|
@ -382,6 +387,20 @@ quit(struct weston_launch *wl, int status) |
|
|
|
pam_end(wl->ph, err); |
|
|
|
pam_end(wl->ph, err); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (ioctl(wl->tty, KDSKBMODE, wl->kb_mode)) |
|
|
|
|
|
|
|
fprintf(stderr, "failed to restore keyboard mode: %m\n"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (ioctl(wl->tty, KDSETMODE, KD_TEXT)) |
|
|
|
|
|
|
|
fprintf(stderr, "failed to set KD_TEXT mode on tty: %m\n"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (tcsetattr(wl->tty, TCSANOW, &wl->terminal_attributes) < 0) |
|
|
|
|
|
|
|
fprintf(stderr, |
|
|
|
|
|
|
|
"could not restore terminal to canonical mode\n"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mode.mode = VT_AUTO; |
|
|
|
|
|
|
|
if (ioctl(wl->tty, VT_SETMODE, &mode) < 0) |
|
|
|
|
|
|
|
fprintf(stderr, "could not reset vt handling\n"); |
|
|
|
|
|
|
|
|
|
|
|
exit(status); |
|
|
|
exit(status); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -441,9 +460,11 @@ handle_signal(struct weston_launch *wl) |
|
|
|
static int |
|
|
|
static int |
|
|
|
setup_tty(struct weston_launch *wl, const char *tty) |
|
|
|
setup_tty(struct weston_launch *wl, const char *tty) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
struct termios raw_attributes; |
|
|
|
struct stat buf; |
|
|
|
struct stat buf; |
|
|
|
struct vt_mode mode = { 0 }; |
|
|
|
struct vt_mode mode = { 0 }; |
|
|
|
char *t; |
|
|
|
char *t; |
|
|
|
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
|
|
if (!wl->new_user) { |
|
|
|
if (!wl->new_user) { |
|
|
|
wl->tty = STDIN_FILENO; |
|
|
|
wl->tty = STDIN_FILENO; |
|
|
@ -481,6 +502,30 @@ setup_tty(struct weston_launch *wl, const char *tty) |
|
|
|
wl->ttynr = minor(buf.st_rdev); |
|
|
|
wl->ttynr = minor(buf.st_rdev); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (tcgetattr(wl->tty, &wl->terminal_attributes) < 0) |
|
|
|
|
|
|
|
error(1, errno, "could not get terminal attributes: %m\n"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Ignore control characters and disable echo */ |
|
|
|
|
|
|
|
raw_attributes = wl->terminal_attributes; |
|
|
|
|
|
|
|
cfmakeraw(&raw_attributes); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Fix up line endings to be normal (cfmakeraw hoses them) */ |
|
|
|
|
|
|
|
raw_attributes.c_oflag |= OPOST | OCRNL; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (tcsetattr(wl->tty, TCSANOW, &raw_attributes) < 0) |
|
|
|
|
|
|
|
error(1, errno, "could not put terminal into raw mode: %m\n"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ioctl(wl->tty, KDGKBMODE, &wl->kb_mode); |
|
|
|
|
|
|
|
ret = ioctl(wl->tty, KDSKBMODE, K_OFF); |
|
|
|
|
|
|
|
if (ret) |
|
|
|
|
|
|
|
ret = ioctl(wl->tty, KDSKBMODE, K_RAW); |
|
|
|
|
|
|
|
if (ret) |
|
|
|
|
|
|
|
error(1, errno, "failed to set keyboard mode on tty: %m\n"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ret = ioctl(wl->tty, KDSETMODE, KD_GRAPHICS); |
|
|
|
|
|
|
|
if (ret) |
|
|
|
|
|
|
|
error(1, errno, "failed to set KD_GRAPHICS mode on tty: %m\n"); |
|
|
|
|
|
|
|
|
|
|
|
mode.mode = VT_PROCESS; |
|
|
|
mode.mode = VT_PROCESS; |
|
|
|
mode.relsig = SIGUSR1; |
|
|
|
mode.relsig = SIGUSR1; |
|
|
|
mode.acqsig = SIGUSR2; |
|
|
|
mode.acqsig = SIGUSR2; |
|
|
|