X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flogin%2Flogind-seat.c;h=06debf887a0da77d802d43c4c35dbd8914fa3efd;hb=c485d3ba094a0bf8d0165a4ba3eb5602cc21812a;hp=8c83a2c5ecd3088c256580c3bbd7a771779cbe56;hpb=addedec48ba0ffc4472ef6d3b5a45c9d4239f1cd;p=elogind.git diff --git a/src/login/logind-seat.c b/src/login/logind-seat.c index 8c83a2c5e..06debf887 100644 --- a/src/login/logind-seat.c +++ b/src/login/logind-seat.c @@ -6,16 +6,16 @@ Copyright 2011 Lennart Poettering systemd is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. systemd is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + Lesser General Public License for more details. - You should have received a copy of the GNU General Public License + You should have received a copy of the GNU Lesser General Public License along with systemd; If not, see . ***/ @@ -30,6 +30,8 @@ #include "logind-seat.h" #include "logind-acl.h" #include "util.h" +#include "mkdir.h" +#include "path-util.h" Seat *seat_new(Manager *m, const char *id) { Seat *s; @@ -47,7 +49,7 @@ Seat *seat_new(Manager *m, const char *id) { return NULL; } - s->id = file_name_from_path(s->state_file); + s->id = path_get_file_name(s->state_file); s->manager = m; if (hashmap_put(m->seats, s->id, s) < 0) { @@ -390,18 +392,19 @@ int seat_attach_session(Seat *s, Session *session) { assert(session); assert(!session->seat); - if (!seat_can_multi_session(s) && s->sessions) - return -EEXIST; - session->seat = s; LIST_PREPEND(Session, sessions_by_seat, s->sessions, session); seat_send_changed(s, "Sessions\0"); - if (!seat_can_multi_session(s)) { - assert(!s->active); + /* Note that even if a seat is not multi-session capable it + * still might have multiple sessions on it since old, dead + * sessions might continue to be tracked until all their + * processes are gone. The most recently added session + * (i.e. the first in s->sessions) is the one that matters. */ + + if (!seat_can_multi_session(s)) seat_set_active(s, session); - } return 0; }