X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flogin%2Flogind-session.c;h=ce5dbb4d5ccfa0a62d5da46c7cff8b7ac64df5f7;hb=e93549ef29c4123d9ee45acb5815048390201e49;hp=c1800e085464ed6a28593e56525f5cdc5904f777;hpb=56f64d95763a799ba4475daf44d8e9f72a1bd474;p=elogind.git diff --git a/src/login/logind-session.c b/src/login/logind-session.c index c1800e085..ce5dbb4d5 100644 --- a/src/login/logind-session.c +++ b/src/login/logind-session.c @@ -28,9 +28,7 @@ #include #include -#include "sd-id128.h" #include "sd-messages.h" -#include "strv.h" #include "util.h" #include "mkdir.h" #include "path-util.h" @@ -301,6 +299,7 @@ int session_load(Session *s) { _cleanup_free_ char *remote = NULL, *seat = NULL, *vtnr = NULL, + *state = NULL, *pos = NULL, *leader = NULL, *type = NULL, @@ -327,6 +326,7 @@ int session_load(Session *s) { "SERVICE", &s->service, "DESKTOP", &s->desktop, "VTNR", &vtnr, + "STATE", &state, "POS", &pos, "LEADER", &leader, "TYPE", &type, @@ -355,7 +355,7 @@ int session_load(Session *s) { return r; } - user = hashmap_get(s->manager->users, ULONG_TO_PTR((unsigned long) u)); + user = hashmap_get(s->manager->users, UID_TO_PTR(u)); if (!user) { log_error("User of session %s not known.", s->id); return -ENOENT; @@ -415,13 +415,18 @@ int session_load(Session *s) { s->class = c; } + if (state && streq(state, "closing")) + s->stopping = true; + if (s->fifo_path) { int fd; /* If we open an unopened pipe for reading we will not get an EOF. to trigger an EOF we hence open it for - reading, but close it right-away which then will - trigger the EOF. */ + writing, but close it right away which then will + trigger the EOF. This will happen immediately if no + other process has the FIFO open for writing, i. e. + when the session died before logind (re)started. */ fd = session_create_fifo(s); safe_close(fd); @@ -967,10 +972,8 @@ static int session_open_vt(Session *s) { sprintf(path, "/dev/tty%u", s->vtnr); s->vtfd = open(path, O_RDWR | O_CLOEXEC | O_NONBLOCK | O_NOCTTY); - if (s->vtfd < 0) { - log_error_errno(errno, "cannot open VT %s of session %s: %m", path, s->id); - return -errno; - } + if (s->vtfd < 0) + return log_error_errno(errno, "cannot open VT %s of session %s: %m", path, s->id); return s->vtfd; }