chiark / gitweb /
logind: check whether newly created session is active
[elogind.git] / src / logind-seat.c
index 95c66dd7125649cff8d54efbe6c475e65109bc9f..df91cd0d8a53ebc057dd77a197bc84e11be8953c 100644 (file)
@@ -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;
 
@@ -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) {
@@ -324,18 +353,17 @@ int seat_stop(Seat *s) {
 
         assert(s);
 
-        if (!s->started)
-                return 0;
-
-        log_info("Removed seat %s.", s->id);
-
-        seat_send_signal(s, false);
+        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;
@@ -361,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;
 }