chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
logind: add new session type "web" for PAM web clients, such as cockpit
[elogind.git]
/
src
/
login
/
logind-session.c
diff --git
a/src/login/logind-session.c
b/src/login/logind-session.c
index fdeacb150acb42a84f203cb052fc412a613c6a50..9d05faf47ceab9aa60cb99b84aaa967d867e6333 100644
(file)
--- a/
src/login/logind-session.c
+++ b/
src/login/logind-session.c
@@
-153,8
+153,6
@@
void session_free(Session *s) {
hashmap_remove(s->manager->sessions, s->id);
hashmap_remove(s->manager->sessions, s->id);
- s->vt_source = sd_event_source_unref(s->vt_source);
-
free(s->state_file);
free(s);
}
free(s->state_file);
free(s);
}
@@
-978,8
+976,8
@@
int session_kill(Session *s, KillWho who, int signo) {
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;
@@
-994,59
+992,56
@@
static int session_open_vt(Session *s) {
return s->vtfd;
}
return s->vtfd;
}
-static int session_vt_fn(sd_event_source *source, const struct signalfd_siginfo *si, void *data) {
- Session *s = data;
-
- if (s->vtfd >= 0)
- ioctl(s->vtfd, VT_RELDISP, 1);
-
- return 0;
-}
-
-void session_prepare_vt(Session *s) {
+int session_prepare_vt(Session *s) {
int vt, r;
struct vt_mode mode = { 0 };
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)
- return;
+ return
vt
;
r = fchown(vt, s->user->uid, -1);
r = fchown(vt, s->user->uid, -1);
- if (r < 0)
+ if (r < 0) {
+ r = -errno;
+ log_error("Cannot change owner of /dev/tty%u: %m", s->vtnr);
goto error;
goto error;
+ }
r = ioctl(vt, KDSKBMODE, K_OFF);
r = ioctl(vt, KDSKBMODE, K_OFF);
- if (r < 0)
+ if (r < 0) {
+ r = -errno;
+ log_error("Cannot set K_OFF on /dev/tty%u: %m", s->vtnr);
goto error;
goto error;
+ }
r = ioctl(vt, KDSETMODE, KD_GRAPHICS);
r = ioctl(vt, KDSETMODE, KD_GRAPHICS);
- if (r < 0)
- goto error;
-
- sigemptyset(&mask);
- sigaddset(&mask, SIGUSR1);
- sigprocmask(SIG_BLOCK, &mask, NULL);
-
- r = sd_event_add_signal(s->manager->event, &s->vt_source, SIGUSR1, session_vt_fn, s);
- if (r < 0)
+ if (r < 0) {
+ r = -errno;
+ log_error("Cannot set KD_GRAPHICS on /dev/tty%u: %m", s->vtnr);
goto error;
goto error;
+ }
/* Oh, thanks to the VT layer, VT_AUTO does not work with KD_GRAPHICS.
* So we need a dummy handler here which just acknowledges *all* VT
* switch requests. */
mode.mode = VT_PROCESS;
/* Oh, thanks to the VT layer, VT_AUTO does not work with KD_GRAPHICS.
* So we need a dummy handler here which just acknowledges *all* VT
* switch requests. */
mode.mode = VT_PROCESS;
- mode.relsig = SIG
USR1
;
- mode.acqsig = SIG
USR
1;
+ mode.relsig = SIG
RTMIN
;
+ mode.acqsig = SIG
RTMIN +
1;
r = ioctl(vt, VT_SETMODE, &mode);
r = ioctl(vt, VT_SETMODE, &mode);
- if (r < 0)
+ if (r < 0) {
+ r = -errno;
+ log_error("Cannot set VT_PROCESS on /dev/tty%u: %m", s->vtnr);
goto error;
goto error;
+ }
- return;
+ return
0
;
error:
error:
- log_error("cannot mute VT %u for session %s (%d/%d)", s->vtnr, s->id, r, errno);
session_restore_vt(s);
session_restore_vt(s);
+ return r;
}
void session_restore_vt(Session *s) {
}
void session_restore_vt(Session *s) {
@@
-1058,8
+1053,6
@@
void session_restore_vt(Session *s) {
if (vt < 0)
return;
if (vt < 0)
return;
- s->vt_source = sd_event_source_unref(s->vt_source);
-
ioctl(vt, KDSETMODE, KD_TEXT);
if (read_one_line_file("/sys/module/vt/parameters/default_utf8", &utf8) >= 0 && *utf8 == '1')
ioctl(vt, KDSETMODE, KD_TEXT);
if (read_one_line_file("/sys/module/vt/parameters/default_utf8", &utf8) >= 0 && *utf8 == '1')
@@
-1125,8
+1118,6
@@
int session_set_controller(Session *s, const char *sender, bool force) {
return r;
}
return r;
}
- 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
@@
-1135,7
+1126,11
@@
int session_set_controller(Session *s, const char *sender, bool force) {
* 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. */
- session_prepare_vt(s);
+ r = session_prepare_vt(s);
+ if (r < 0)
+ return r;
+
+ session_swap_controller(s, t);
return 0;
}
return 0;
}
@@
-1164,6
+1159,7
@@
static const char* const session_type_table[_SESSION_TYPE_MAX] = {
[SESSION_X11] = "x11",
[SESSION_WAYLAND] = "wayland",
[SESSION_MIR] = "mir",
[SESSION_X11] = "x11",
[SESSION_WAYLAND] = "wayland",
[SESSION_MIR] = "mir",
+ [SESSION_WEB] = "web",
};
DEFINE_STRING_TABLE_LOOKUP(session_type, SessionType);
};
DEFINE_STRING_TABLE_LOOKUP(session_type, SessionType);