X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flogind-seat.c;h=bc695fea837f7daddd9e9393443e952deaec548f;hb=e7886786a6fec22fa770eb1554781d5f82c4b349;hp=751f59a48d6f3d74239263f5be67e4761cccf8bd;hpb=a185c5aa2d8bef98716f8cf160da263c17e588b2;p=elogind.git diff --git a/src/logind-seat.c b/src/logind-seat.c index 751f59a48..bc695fea8 100644 --- a/src/logind-seat.c +++ b/src/logind-seat.c @@ -41,7 +41,7 @@ Seat *seat_new(Manager *m, const char *id) { if (!s) return NULL; - s->state_file = strappend("/run/systemd/seat/", id); + s->state_file = strappend("/run/systemd/seats/", id); if (!s->state_file) { free(s); return NULL; @@ -86,7 +86,10 @@ int seat_save(Seat *s) { assert(s); - r = safe_mkdir("/run/systemd/seat", 0755, 0, 0); + if (!s->started) + return 0; + + r = safe_mkdir("/run/systemd/seats", 0755, 0, 0); if (r < 0) goto finish; @@ -196,7 +199,7 @@ static int seat_preallocate_vts(Seat *s) { if (!seat_is_vtconsole(s)) return 0; - for (i = 1; i < s->manager->n_autovts; i++) { + for (i = 1; i <= s->manager->n_autovts; i++) { int q; q = vt_allocate(i); @@ -226,8 +229,40 @@ int seat_apply_acls(Seat *s, Session *old_active) { return r; } +int seat_set_active(Seat *s, Session *session) { + Session *old_active; + + assert(s); + assert(!session || session->seat == s); + + if (session == s->active) + return 0; + + old_active = s->active; + s->active = session; + + seat_apply_acls(s, old_active); + + if (session && session->started) + session_send_changed(session, "Active\0"); + + if (!session || session->started) + seat_send_changed(s, "ActiveSession\0"); + + seat_save(s); + + if (session) + session_save(session); + + if (old_active) + session_save(old_active); + + return 0; +} + int seat_active_vt_changed(Seat *s, int vtnr) { - Session *i, *new_active = NULL, *old_active; + Session *i, *new_active = NULL; + int r; assert(s); assert(vtnr >= 1); @@ -243,16 +278,10 @@ int seat_active_vt_changed(Seat *s, int vtnr) { break; } - if (new_active == s->active) - return 0; - - old_active = s->active; - s->active = new_active; - - seat_apply_acls(s, old_active); + r = seat_set_active(s, new_active); manager_spawn_autovt(s->manager, vtnr); - return 0; + return r; } int seat_read_active_vt(Seat *s) { @@ -314,6 +343,8 @@ int seat_start(Seat *s) { s->started = true; + seat_send_signal(s, true); + return 0; } @@ -322,16 +353,17 @@ int seat_stop(Seat *s) { assert(s); - if (!s->started) - return 0; - - log_info("Removed seat %s.", s->id); + if (s->started) + log_info("Removed seat %s.", s->id); seat_stop_sessions(s); unlink(s->state_file); seat_add_to_gc_queue(s); + if (s->started) + seat_send_signal(s, false); + s->started = false; return r; @@ -357,17 +389,19 @@ int seat_attach_session(Seat *s, Session *session) { assert(session); assert(!session->seat); - if (!seat_is_vtconsole(s)) { - if (s->sessions) - return -EEXIST; - - assert(!s->active); - s->active = session; - } + if (!seat_is_vtconsole(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_is_vtconsole(s)) { + assert(!s->active); + seat_set_active(s, session); + } + return 0; }