[gdm] libgdm: don't ever user switch to closing login screen



commit 1fd23f7a6a3f6d40a555e990607d0b7392a1b9a9
Author: Ray Strode <rstrode redhat com>
Date:   Mon Sep 24 21:53:05 2012 -0400

    libgdm: don't ever user switch to closing login screen
    
    bugs in login screen service can mean stray processes
    laying around keeping the login screen session on life
    support in a "closing" state.
    
    libgdm will try to user switch to these defunct sessions.
    
    This commit fixes that.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=684750

 gui/libgdm/gdm-user-switching.c |   29 +++++++++++++++++++++++++++++
 1 files changed, 29 insertions(+), 0 deletions(-)
---
diff --git a/gui/libgdm/gdm-user-switching.c b/gui/libgdm/gdm-user-switching.c
index ca4c7cd..693228e 100644
--- a/gui/libgdm/gdm-user-switching.c
+++ b/gui/libgdm/gdm-user-switching.c
@@ -409,6 +409,8 @@ get_login_window_session_id_for_systemd (const char  *seat_id,
         int        res, i;
         char     **sessions;
         char      *service_id;
+        char      *service_class;
+        char      *state;
 
         res = sd_seat_get_sessions (seat_id, &sessions, NULL, NULL);
         if (res < 0) {
@@ -424,6 +426,33 @@ get_login_window_session_id_for_systemd (const char  *seat_id,
 
         for (i = 0; sessions[i]; i ++) {
 
+                res = sd_session_get_class (sessions[i], &service_class);
+                if (res < 0) {
+                        g_debug ("failed to determine class of session %s: %s", sessions[i], strerror (-res));
+                        ret = FALSE;
+                        goto out;
+                }
+
+                if (strcmp (service_class, "greeter") != 0) {
+                        free (service_class);
+                        continue;
+                }
+
+                free (service_class);
+
+                ret = sd_session_get_state (sessions[i], &state);
+                if (ret < 0) {
+                        g_debug ("failed to determine state of session %s: %s", sessions[i], strerror (-res));
+                        ret = FALSE;
+                        goto out;
+                }
+
+                if (g_strcmp0 (state, "closing") == 0) {
+                        free (state);
+                        continue;
+                }
+                free (state);
+
                 res = sd_session_get_service (sessions[i], &service_id);
                 if (res < 0) {
                         g_debug ("failed to determine service of session %s: %s", sessions[i], strerror (-res));



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]