[systemd-commits] 4 commits - src/login

Lennart Poettering lennart at kemper.freedesktop.org
Tue Sep 17 11:52:49 PDT 2013


 src/login/logind-dbus.c    |   10 +++++-----
 src/login/logind-seat.c    |   40 ++++++++++++++++++----------------------
 src/login/logind-seat.h    |    3 ++-
 src/login/logind-session.c |    8 ++++----
 src/login/logind.c         |    8 ++++----
 src/login/logind.h         |    2 +-
 6 files changed, 34 insertions(+), 37 deletions(-)

New commits:
commit bf7825ae69f53a7e80a740547919833e49ed1df4
Author: David Herrmann <dh.herrmann at gmail.com>
Date:   Tue Sep 17 17:40:02 2013 +0200

    logind: extract has_vts() from can_multi_session()
    
    We currently use seat_can_multi_session() to test for two things:
     * whether the seat can handle session-switching
     * whether the seat has VTs
    
    As both are currently logically equivalent, we didn't care. However, we
    want to allow session-switching on seats without VTs, so split this helper
    into:
     * seat_can_multi_session(): whether session-switching is supported
     * seat_has_vts(): whether the seat has VTs
    
    Note that only one seat on a system can have VTs. There is only one set of
    them. We automatically assign them to seat0 as usual.
    
    With this patch in place, we can easily add new session-switching/tracking
    methods without breaking any VT code as it is now protected by has_vts(),
    no longer by can_multi_session().

diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c
index 4a23c93..fd8ee1b 100644
--- a/src/login/logind-dbus.c
+++ b/src/login/logind-dbus.c
@@ -429,7 +429,7 @@ static int bus_manager_create_session(Manager *m, DBusMessage *message) {
         }
 
         if (seat) {
-                if (seat_can_multi_session(seat)) {
+                if (seat_has_vts(seat)) {
                         if (vtnr > 63)
                                 return -EINVAL;
                 } else {
diff --git a/src/login/logind-seat.c b/src/login/logind-seat.c
index c5350fb..3dc529b 100644
--- a/src/login/logind-seat.c
+++ b/src/login/logind-seat.c
@@ -201,7 +201,7 @@ int seat_preallocate_vts(Seat *s) {
         if (s->manager->n_autovts <= 0)
                 return 0;
 
-        if (!seat_can_multi_session(s))
+        if (!seat_has_vts(s))
                 return 0;
 
         for (i = 1; i <= s->manager->n_autovts; i++) {
@@ -277,7 +277,7 @@ int seat_active_vt_changed(Seat *s, int vtnr) {
         assert(s);
         assert(vtnr >= 1);
 
-        if (!seat_can_multi_session(s))
+        if (!seat_has_vts(s))
                 return -EINVAL;
 
         log_debug("VT changed to %i", vtnr);
@@ -301,7 +301,7 @@ int seat_read_active_vt(Seat *s) {
 
         assert(s);
 
-        if (!seat_can_multi_session(s))
+        if (!seat_has_vts(s))
                 return 0;
 
         lseek(s->manager->console_active_fd, SEEK_SET, 0);
@@ -412,18 +412,20 @@ int seat_attach_session(Seat *s, Session *session) {
 
         seat_send_changed(s, "Sessions\0");
 
-        /* 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))
+        /* On seats with VTs, the VT logic defines which session is active. On
+         * seats without VTs, we automatically activate the first session. */
+        if (!seat_has_vts(s) && !s->active)
                 seat_set_active(s, session);
 
         return 0;
 }
 
+bool seat_has_vts(Seat *s) {
+        assert(s);
+
+        return seat_is_seat0(s) && s->manager->console_active_fd >= 0;
+}
+
 bool seat_is_seat0(Seat *s) {
         assert(s);
 
@@ -433,19 +435,13 @@ bool seat_is_seat0(Seat *s) {
 bool seat_can_multi_session(Seat *s) {
         assert(s);
 
-        if (!seat_is_seat0(s))
-                return false;
-
-        /* If we can't watch which VT is in the foreground, we don't
-         * support VT switching */
-
-        return s->manager->console_active_fd >= 0;
+        return seat_has_vts(s);
 }
 
 bool seat_can_tty(Seat *s) {
         assert(s);
 
-        return seat_is_seat0(s) && s->manager->console_active_fd >= 0;
+        return seat_has_vts(s);
 }
 
 bool seat_has_master_device(Seat *s) {
diff --git a/src/login/logind-seat.h b/src/login/logind-seat.h
index 47fe89a..d3438b8 100644
--- a/src/login/logind-seat.h
+++ b/src/login/logind-seat.h
@@ -60,6 +60,7 @@ int seat_preallocate_vts(Seat *s);
 
 int seat_attach_session(Seat *s, Session *session);
 
+bool seat_has_vts(Seat *s);
 bool seat_is_seat0(Seat *s);
 bool seat_can_multi_session(Seat *s);
 bool seat_can_tty(Seat *s);
diff --git a/src/login/logind-session.c b/src/login/logind-session.c
index ab1c79c..f856127 100644
--- a/src/login/logind-session.c
+++ b/src/login/logind-session.c
@@ -191,7 +191,7 @@ int session_save(Session *s) {
         if (s->service)
                 fprintf(f, "SERVICE=%s\n", s->service);
 
-        if (s->seat && seat_can_multi_session(s->seat))
+        if (s->seat && seat_has_vts(s->seat))
                 fprintf(f, "VTNR=%i\n", s->vtnr);
 
         if (s->leader > 0)
@@ -301,7 +301,7 @@ int session_load(Session *s) {
                         seat_attach_session(o, s);
         }
 
-        if (vtnr && s->seat && seat_can_multi_session(s->seat)) {
+        if (vtnr && s->seat && seat_has_vts(s->seat)) {
                 int v;
 
                 k = safe_atoi(vtnr, &v);
@@ -372,7 +372,7 @@ int session_activate(Session *s) {
         if (s->seat->active == s)
                 return 0;
 
-        assert(seat_is_seat0(s->seat));
+        assert(seat_has_vts(s->seat));
 
         return chvt(s->vtnr);
 }

commit 9209d5121dfb3049cbf280139c4cc40c2038edcc
Author: David Herrmann <dh.herrmann at gmail.com>
Date:   Tue Sep 17 17:40:01 2013 +0200

    logind: fix session_activate(vtnr = 0)
    
    VT numbers start with 1. If a session has vtnr == 0, we must not assume it
    is running on a VT.
    Note that this could trigger the assert() below as CreateSession() sets
    vtnr to 0, not <0.

diff --git a/src/login/logind-session.c b/src/login/logind-session.c
index 407429c..ab1c79c 100644
--- a/src/login/logind-session.c
+++ b/src/login/logind-session.c
@@ -363,7 +363,7 @@ int session_activate(Session *s) {
         assert(s);
         assert(s->user);
 
-        if (s->vtnr < 0)
+        if (s->vtnr <= 0)
                 return -ENOTSUP;
 
         if (!s->seat)

commit 20e1bd9d1b289761a1b0010d778bdaf924f317b3
Author: David Herrmann <dh.herrmann at gmail.com>
Date:   Tue Sep 17 17:40:00 2013 +0200

    logind: fix seat_can_tty() to check for VTs
    
    A seat provides text-logins if it has VTs. This is always limited to seat0
    so the seat_is_seat0() check is correct. However, if VTs are disabled, no
    seat provides text-logins so we also need to check for the console-fd.
    
    This was previously:
      return seat_is_vtconsole();
    It looked right, but was functionally equivalent to seat_is_seat0(). The
    rename of this helper made it more obvious that it is missing the VT test.

diff --git a/src/login/logind-seat.c b/src/login/logind-seat.c
index 9b6ceb3..c5350fb 100644
--- a/src/login/logind-seat.c
+++ b/src/login/logind-seat.c
@@ -445,7 +445,7 @@ bool seat_can_multi_session(Seat *s) {
 bool seat_can_tty(Seat *s) {
         assert(s);
 
-        return seat_is_seat0(s);
+        return seat_is_seat0(s) && s->manager->console_active_fd >= 0;
 }
 
 bool seat_has_master_device(Seat *s) {

commit 92432fcc7f3a0320c07e99c5d395568a3aa216b6
Author: David Herrmann <dh.herrmann at gmail.com>
Date:   Tue Sep 17 17:39:59 2013 +0200

    logind: rename vtconsole to seat0
    
    The seat->vtconsole member always points to the default seat seat0. Even
    if VTs are disabled, it's used as default seat. Therefore, rename it to
    seat0 to correctly state what it is.
    
    This also changes the seat files in /run from IS_VTCONSOLE to IS_SEAT0. It
    wasn't used by any code, yet, so this seems fine.
    
    While we are at it, we also remove every "if (s->vtconsole)" as this
    pointer is always valid!

diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c
index 113a2b7..4a23c93 100644
--- a/src/login/logind-dbus.c
+++ b/src/login/logind-dbus.c
@@ -404,8 +404,8 @@ static int bus_manager_create_session(Manager *m, DBusMessage *message) {
                 int v;
 
                 if (!seat)
-                        seat = m->vtconsole;
-                else if (seat != m->vtconsole)
+                        seat = m->seat0;
+                else if (seat != m->seat0)
                         return -EINVAL;
 
                 v = vtnr_from_tty(tty);
@@ -420,8 +420,8 @@ static int bus_manager_create_session(Manager *m, DBusMessage *message) {
         } else if (tty_is_console(tty)) {
 
                 if (!seat)
-                        seat = m->vtconsole;
-                else if (seat != m->vtconsole)
+                        seat = m->seat0;
+                else if (seat != m->seat0)
                         return -EINVAL;
 
                 if (vtnr != 0)
diff --git a/src/login/logind-seat.c b/src/login/logind-seat.c
index 2c60b8a..9b6ceb3 100644
--- a/src/login/logind-seat.c
+++ b/src/login/logind-seat.c
@@ -105,11 +105,11 @@ int seat_save(Seat *s) {
 
         fprintf(f,
                 "# This is private data. Do not parse.\n"
-                "IS_VTCONSOLE=%i\n"
+                "IS_SEAT0=%i\n"
                 "CAN_MULTI_SESSION=%i\n"
                 "CAN_TTY=%i\n"
                 "CAN_GRAPHICAL=%i\n",
-                seat_is_vtconsole(s),
+                seat_is_seat0(s),
                 seat_can_multi_session(s),
                 seat_can_tty(s),
                 seat_can_graphical(s));
@@ -424,16 +424,16 @@ int seat_attach_session(Seat *s, Session *session) {
         return 0;
 }
 
-bool seat_is_vtconsole(Seat *s) {
+bool seat_is_seat0(Seat *s) {
         assert(s);
 
-        return s->manager->vtconsole == s;
+        return s->manager->seat0 == s;
 }
 
 bool seat_can_multi_session(Seat *s) {
         assert(s);
 
-        if (!seat_is_vtconsole(s))
+        if (!seat_is_seat0(s))
                 return false;
 
         /* If we can't watch which VT is in the foreground, we don't
@@ -445,7 +445,7 @@ bool seat_can_multi_session(Seat *s) {
 bool seat_can_tty(Seat *s) {
         assert(s);
 
-        return seat_is_vtconsole(s);
+        return seat_is_seat0(s);
 }
 
 bool seat_has_master_device(Seat *s) {
@@ -503,7 +503,7 @@ int seat_check_gc(Seat *s, bool drop_not_started) {
         if (drop_not_started && !s->started)
                 return 0;
 
-        if (seat_is_vtconsole(s))
+        if (seat_is_seat0(s))
                 return 1;
 
         return seat_has_master_device(s);
diff --git a/src/login/logind-seat.h b/src/login/logind-seat.h
index bd5390f..47fe89a 100644
--- a/src/login/logind-seat.h
+++ b/src/login/logind-seat.h
@@ -60,7 +60,7 @@ int seat_preallocate_vts(Seat *s);
 
 int seat_attach_session(Seat *s, Session *session);
 
-bool seat_is_vtconsole(Seat *s);
+bool seat_is_seat0(Seat *s);
 bool seat_can_multi_session(Seat *s);
 bool seat_can_tty(Seat *s);
 bool seat_has_master_device(Seat *s);
diff --git a/src/login/logind-session.c b/src/login/logind-session.c
index fa8b515..407429c 100644
--- a/src/login/logind-session.c
+++ b/src/login/logind-session.c
@@ -372,7 +372,7 @@ int session_activate(Session *s) {
         if (s->seat->active == s)
                 return 0;
 
-        assert(seat_is_vtconsole(s->seat));
+        assert(seat_is_seat0(s->seat));
 
         return chvt(s->vtnr);
 }
diff --git a/src/login/logind.c b/src/login/logind.c
index c99c284..702382a 100644
--- a/src/login/logind.c
+++ b/src/login/logind.c
@@ -858,7 +858,7 @@ int manager_dispatch_vcsa_udev(Manager *m) {
          * VTs, to make sure our auto VTs never go away. */
 
         if (name && startswith(name, "vcsa") && streq_ptr(udev_device_get_action(d), "remove"))
-                r = seat_preallocate_vts(m->vtconsole);
+                r = seat_preallocate_vts(m->seat0);
 
         udev_device_unref(d);
 
@@ -883,9 +883,9 @@ int manager_dispatch_button_udev(Manager *m) {
 
 int manager_dispatch_console(Manager *m) {
         assert(m);
+        assert(m->seat0);
 
-        if (m->vtconsole)
-                seat_read_active_vt(m->vtconsole);
+        seat_read_active_vt(m->seat0);
 
         return 0;
 }
@@ -1543,7 +1543,7 @@ int manager_startup(Manager *m) {
                 return r;
 
         /* Instantiate magic seat 0 */
-        r = manager_add_seat(m, "seat0", &m->vtconsole);
+        r = manager_add_seat(m, "seat0", &m->seat0);
         if (r < 0)
                 return r;
 
diff --git a/src/login/logind.h b/src/login/logind.h
index a76936d..9e6296c 100644
--- a/src/login/logind.h
+++ b/src/login/logind.h
@@ -74,7 +74,7 @@ struct Manager {
         unsigned reserve_vt;
         int reserve_vt_fd;
 
-        Seat *vtconsole;
+        Seat *seat0;
 
         char **kill_only_users, **kill_exclude_users;
         bool kill_user_processes;



More information about the systemd-commits mailing list