summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
7e8185e)
If controllers can expect logind to have "prepared" the VT (e.g. set it to
graphics mode, etc) then TakeControl() should fail if said preparation
failed (and session_restore_vt() was called).
(David: fixed up !CONFIG_VT case and errno-numbers)
static int session_open_vt(Session *s) {
char path[sizeof("/dev/tty") + DECIMAL_STR_MAX(s->vtnr)];
static int session_open_vt(Session *s) {
char path[sizeof("/dev/tty") + DECIMAL_STR_MAX(s->vtnr)];
- if (!s->vtnr)
- return -1;
+ if (s->vtnr < 1)
+ return -ENODEV;
if (s->vtfd >= 0)
return s->vtfd;
if (s->vtfd >= 0)
return s->vtfd;
-void session_prepare_vt(Session *s) {
+int session_prepare_vt(Session *s) {
int vt, r;
struct vt_mode mode = { 0 };
sigset_t mask;
int vt, r;
struct vt_mode mode = { 0 };
sigset_t mask;
+ if (s->vtnr < 1)
+ return 0;
+
vt = session_open_vt(s);
if (vt < 0)
vt = session_open_vt(s);
if (vt < 0)
r = fchown(vt, s->user->uid, -1);
r = fchown(vt, s->user->uid, -1);
+ if (r < 0) {
+ r = -errno;
+ log_error("Cannot change owner of /dev/tty%u: %m", s->vtnr);
r = ioctl(vt, KDSKBMODE, K_OFF);
r = ioctl(vt, KDSKBMODE, K_OFF);
+ if (r < 0) {
+ r = -errno;
+ log_error("Cannot set K_OFF on /dev/tty%u: %m", s->vtnr);
r = ioctl(vt, KDSETMODE, KD_GRAPHICS);
r = ioctl(vt, KDSETMODE, KD_GRAPHICS);
+ if (r < 0) {
+ r = -errno;
+ log_error("Cannot set KD_GRAPHICS on /dev/tty%u: %m", s->vtnr);
sigemptyset(&mask);
sigaddset(&mask, SIGUSR1);
sigemptyset(&mask);
sigaddset(&mask, SIGUSR1);
mode.relsig = SIGUSR1;
mode.acqsig = SIGUSR1;
r = ioctl(vt, VT_SETMODE, &mode);
mode.relsig = SIGUSR1;
mode.acqsig = SIGUSR1;
r = ioctl(vt, VT_SETMODE, &mode);
+ if (r < 0) {
+ r = -errno;
+ log_error("Cannot set VT_PROCESS on /dev/tty%u: %m", s->vtnr);
- log_error("cannot mute VT %u for session %s (%d/%d)", s->vtnr, s->id, r, errno);
}
void session_restore_vt(Session *s) {
}
void session_restore_vt(Session *s) {
- session_swap_controller(s, t);
-
/* When setting a session controller, we forcibly mute the VT and set
* it into graphics-mode. Applications can override that by changing
* VT state after calling TakeControl(). However, this serves as a good
/* When setting a session controller, we forcibly mute the VT and set
* it into graphics-mode. Applications can override that by changing
* VT state after calling TakeControl(). However, this serves as a good
* exits.
* If logind crashes/restarts, we restore the controller during restart
* or reset the VT in case it crashed/exited, too. */
* exits.
* If logind crashes/restarts, we restore the controller during restart
* or reset the VT in case it crashed/exited, too. */
+ r = session_prepare_vt(s);
+ if (r < 0)
+ return r;
+
+ session_swap_controller(s, t);
const char *kill_who_to_string(KillWho k) _const_;
KillWho kill_who_from_string(const char *s) _pure_;
const char *kill_who_to_string(KillWho k) _const_;
KillWho kill_who_from_string(const char *s) _pure_;
-void session_prepare_vt(Session *s);
+int session_prepare_vt(Session *s);
void session_restore_vt(Session *s);
bool session_is_controller(Session *s, const char *sender);
void session_restore_vt(Session *s);
bool session_is_controller(Session *s, const char *sender);