[systemd-devel] [PATCH v2 09/10] logind: extract has_vts() from can_multi_session()

Lennart Poettering lennart at poettering.net
Tue Sep 17 11:52:57 PDT 2013


On Tue, 17.09.13 17:40, David Herrmann (dh.herrmann at gmail.com) wrote:

Applied #6 to #9, please update/rebase #5 and #10.

Thanks a lot!

> 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().
> ---
>  src/login/logind-dbus.c    |  2 +-
>  src/login/logind-seat.c    | 32 ++++++++++++++------------------
>  src/login/logind-seat.h    |  1 +
>  src/login/logind-session.c |  6 +++---
>  4 files changed, 19 insertions(+), 22 deletions(-)
> 
> 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 4c2c424..f88738a 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++) {
> @@ -282,7 +282,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);
> @@ -306,7 +306,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);
> @@ -417,18 +417,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);
>  
> @@ -438,19 +440,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 1df2a06..906115a 100644
> --- a/src/login/logind-session.c
> +++ b/src/login/logind-session.c
> @@ -206,7 +206,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)
> @@ -316,7 +316,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);
> @@ -387,7 +387,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);
>  }


Lennart

-- 
Lennart Poettering - Red Hat, Inc.


More information about the systemd-devel mailing list