chiark / gitweb /
unit: introduce ConditionFileIsExecutable= and use it where we check for a binary...
[elogind.git] / src / logind-seat.c
index c232a87d5de8effd1b51b09971f569c5b4791f43..3cf3958c8d47330d13cac925573238713a54ef55 100644 (file)
@@ -86,6 +86,9 @@ int seat_save(Seat *s) {
 
         assert(s);
 
+        if (!s->started)
+                return 0;
+
         r = safe_mkdir("/run/systemd/seats", 0755, 0, 0);
         if (r < 0)
                 goto finish;
@@ -114,27 +117,20 @@ int seat_save(Seat *s) {
         if (s->sessions) {
                 Session *i;
 
-                fputs("OTHER=", f);
+                fputs("SESSIONS=", f);
                 LIST_FOREACH(sessions_by_seat, i, s->sessions) {
-                        if (i == s->active)
-                                continue;
-
                         fprintf(f,
                                 "%s%c",
                                 i->id,
                                 i->sessions_by_seat_next ? ' ' : '\n');
                 }
 
-                fputs("OTHER_UIDS=", f);
-                LIST_FOREACH(sessions_by_seat, i, s->sessions) {
-                        if (i == s->active)
-                                continue;
-
+                fputs("UIDS=", f);
+                LIST_FOREACH(sessions_by_seat, i, s->sessions)
                         fprintf(f,
                                 "%lu%c",
                                 (unsigned long) i->user->uid,
                                 i->sessions_by_seat_next ? ' ' : '\n');
-                }
         }
 
         fflush(f);
@@ -183,20 +179,22 @@ static int vt_allocate(int vtnr) {
         return r;
 }
 
-static int seat_preallocate_vts(Seat *s) {
+int seat_preallocate_vts(Seat *s) {
         int r = 0;
         unsigned i;
 
         assert(s);
         assert(s->manager);
 
+        log_debug("Preallocating VTs...");
+
         if (s->manager->n_autovts <= 0)
                 return 0;
 
         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);
@@ -248,11 +246,15 @@ int seat_set_active(Seat *s, Session *session) {
 
         seat_save(s);
 
-        if (session)
+        if (session) {
                 session_save(session);
+                user_save(session->user);
+        }
 
-        if (old_active)
+        if (old_active) {
                 session_save(old_active);
+                user_save(old_active->user);
+        }
 
         return 0;
 }
@@ -335,11 +337,11 @@ int seat_start(Seat *s) {
         /* Read current VT */
         seat_read_active_vt(s);
 
+        s->started = true;
+
         /* Save seat data */
         seat_save(s);
 
-        s->started = true;
-
         seat_send_signal(s, true);
 
         return 0;
@@ -444,9 +446,12 @@ int seat_get_idle_hint(Seat *s, dual_timestamp *t) {
         return idle_hint;
 }
 
-int seat_check_gc(Seat *s) {
+int seat_check_gc(Seat *s, bool drop_not_started) {
         assert(s);
 
+        if (drop_not_started && !s->started)
+                return 0;
+
         if (seat_is_vtconsole(s))
                 return 1;
 
@@ -487,5 +492,8 @@ bool seat_name_is_valid(const char *name) {
                 if (!seat_name_valid_char(*p))
                         return false;
 
+        if (strlen(name) > 255)
+                return false;
+
         return true;
 }