[gnome-session/f16] fix fallback mode login

Matthias Clasen mclasen at fedoraproject.org
Fri Sep 9 12:52:52 UTC 2011


commit f2d02aa32630a4a818262b6086f42ec7c9236b6c
Author: Matthias Clasen <mclasen at redhat.com>
Date:   Fri Sep 9 08:31:57 2011 -0400

    fix fallback mode login

 ...ark-as-handled-the-Disconnected-signal-fr.patch |   45 +++++++
 ...ect-all-dbus-clients-when-dbus-is-disconn.patch |  123 ++++++++++++++++++++
 gnome-session.spec                                 |   11 ++-
 3 files changed, 178 insertions(+), 1 deletions(-)
---
diff --git a/0001-gsm-Never-mark-as-handled-the-Disconnected-signal-fr.patch b/0001-gsm-Never-mark-as-handled-the-Disconnected-signal-fr.patch
new file mode 100644
index 0000000..91449df
--- /dev/null
+++ b/0001-gsm-Never-mark-as-handled-the-Disconnected-signal-fr.patch
@@ -0,0 +1,45 @@
+From 67dd879fbe62bc28d3bbc48b88c3842e2cb827e8 Mon Sep 17 00:00:00 2001
+From: Vincent Untz <vuntz at gnome.org>
+Date: Fri, 9 Sep 2011 09:51:54 +0200
+Subject: [PATCH 1/2] gsm: Never mark as handled the Disconnected signal from
+ dbus
+
+Disconnected is emitted when dbus is quitting. And all the dbus filters
+might be interested in this signal, so never mark it as handled when we
+look at it.
+---
+ gnome-session/gsm-consolekit.c |    3 ++-
+ gnome-session/gsm-shell.c      |    3 ++-
+ 2 files changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/gnome-session/gsm-consolekit.c b/gnome-session/gsm-consolekit.c
+index f53993f..66bebd1 100644
+--- a/gnome-session/gsm-consolekit.c
++++ b/gnome-session/gsm-consolekit.c
+@@ -152,7 +152,8 @@ gsm_consolekit_dbus_filter (DBusConnection *connection,
+                                     DBUS_INTERFACE_LOCAL, "Disconnected") &&
+             strcmp (dbus_message_get_path (message), DBUS_PATH_LOCAL) == 0) {
+                 gsm_consolekit_free_dbus (manager);
+-                return DBUS_HANDLER_RESULT_HANDLED;
++                /* let other filters get this disconnected signal, so that they
++                 * can handle it too */
+         }
+ 
+         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+diff --git a/gnome-session/gsm-shell.c b/gnome-session/gsm-shell.c
+index 0b26f09..9785160 100644
+--- a/gnome-session/gsm-shell.c
++++ b/gnome-session/gsm-shell.c
+@@ -228,7 +228,8 @@ gsm_shell_bus_filter (DBusConnection *connection,
+                                     DBUS_INTERFACE_LOCAL, "Disconnected") &&
+             strcmp (dbus_message_get_path (message), DBUS_PATH_LOCAL) == 0) {
+                 gsm_shell_disconnect_from_bus (shell);
+-                return DBUS_HANDLER_RESULT_HANDLED;
++                /* let other filters get this disconnected signal, so that they
++                 * can handle it too */
+         }
+ 
+         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+-- 
+1.7.6.1
+
diff --git a/0002-gsm-Disconnect-all-dbus-clients-when-dbus-is-disconn.patch b/0002-gsm-Disconnect-all-dbus-clients-when-dbus-is-disconn.patch
new file mode 100644
index 0000000..458436e
--- /dev/null
+++ b/0002-gsm-Disconnect-all-dbus-clients-when-dbus-is-disconn.patch
@@ -0,0 +1,123 @@
+From ae8fa537262d6bec9c7eaa5a963cba98ec4e2136 Mon Sep 17 00:00:00 2001
+From: Vincent Untz <vuntz at gnome.org>
+Date: Fri, 9 Sep 2011 09:54:14 +0200
+Subject: [PATCH 2/2] gsm: Disconnect all dbus clients when dbus is
+ disconnected
+
+When we receive the Disconnected signal from dbus on the session bus,
+then we know we won't be able to talk to dbus clients anymore, so mark
+them as disconnected. Also, do not restart them even if they're supposed
+to be autorestarted, as we won't be able to track them.
+
+At this point, the session is kind of hosed. We could possibly decide
+to simply leave, but we don't do it in case it's a user session and
+there's unsaved data.
+
+This helps a lot in the case of the gdm greeter, see
+https://bugzilla.gnome.org/show_bug.cgi?id=658481
+---
+ gnome-session/gsm-manager.c |   49 +++++++++++++++++++++++++++++++++++++++++++
+ 1 files changed, 49 insertions(+), 0 deletions(-)
+
+diff --git a/gnome-session/gsm-manager.c b/gnome-session/gsm-manager.c
+index b531197..2d74d40 100644
+--- a/gnome-session/gsm-manager.c
++++ b/gnome-session/gsm-manager.c
+@@ -151,6 +151,7 @@ struct GsmManagerPrivate
+ 
+         DBusGProxy             *bus_proxy;
+         DBusGConnection        *connection;
++        gboolean                dbus_disconnected : 1;
+ 
+         /* Interface with other parts of the system */
+         UpClient               *up_client;
+@@ -1814,6 +1815,11 @@ _disconnect_client (GsmManager *manager,
+                                                      "phase");
+         }
+ 
++        if (manager->priv->dbus_disconnected && GSM_IS_DBUS_CLIENT (client)) {
++                g_debug ("GsmManager: dbus disconnected, not restarting application");
++                goto out;
++        }
++
+         if (app == NULL) {
+                 g_debug ("GsmManager: unable to find application for client - not restarting");
+                 goto out;
+@@ -1872,6 +1878,12 @@ _disconnect_dbus_client (const char       *id,
+                 return FALSE;
+         }
+ 
++        /* If no service name, then we simply disconnect all clients */
++        if (!data->service_name) {
++                _disconnect_client (data->manager, client);
++                return TRUE;
++        }
++
+         name = gsm_dbus_client_get_bus_name (GSM_DBUS_CLIENT (client));
+         if (IS_STRING_EMPTY (name)) {
+                 return FALSE;
+@@ -1885,6 +1897,15 @@ _disconnect_dbus_client (const char       *id,
+         return FALSE;
+ }
+ 
++/**
++ * remove_clients_for_connection:
++ * @manager: a #GsmManager
++ * @service_name: a service name
++ *
++ * Disconnects clients that own @service_name.
++ *
++ * If @service_name is NULL, then disconnects all clients for the connection.
++ */
+ static void
+ remove_clients_for_connection (GsmManager *manager,
+                                const char *service_name)
+@@ -1968,10 +1989,32 @@ bus_name_owner_changed (DBusGProxy  *bus_proxy,
+         }
+ }
+ 
++static DBusHandlerResult
++gsm_manager_bus_filter (DBusConnection *connection,
++                        DBusMessage    *message,
++                        void           *user_data)
++{
++        GsmManager *manager;
++
++        manager = GSM_MANAGER (user_data);
++
++        if (dbus_message_is_signal (message,
++                                    DBUS_INTERFACE_LOCAL, "Disconnected") &&
++            strcmp (dbus_message_get_path (message), DBUS_PATH_LOCAL) == 0) {
++                g_debug ("GsmManager: dbus disconnected; disconnecting dbus clients...");
++                manager->priv->dbus_disconnected = TRUE;
++                remove_clients_for_connection (manager, NULL);
++                /* let other filters get this disconnected signal, so that they
++                 * can handle it too */
++        }
++
++        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
++}
+ static gboolean
+ register_manager (GsmManager *manager)
+ {
+         GError *error = NULL;
++        DBusConnection *connection;
+ 
+         error = NULL;
+         manager->priv->connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+@@ -1983,6 +2026,12 @@ register_manager (GsmManager *manager)
+                 exit (1);
+         }
+ 
++        connection = dbus_g_connection_get_connection (manager->priv->connection);
++        dbus_connection_add_filter (connection,
++                                    gsm_manager_bus_filter,
++                                    manager, NULL);
++        manager->priv->dbus_disconnected = FALSE;
++
+         manager->priv->bus_proxy = dbus_g_proxy_new_for_name (manager->priv->connection,
+                                                               DBUS_SERVICE_DBUS,
+                                                               DBUS_PATH_DBUS,
+-- 
+1.7.6.1
+
diff --git a/gnome-session.spec b/gnome-session.spec
index d3c189d..f9df580 100644
--- a/gnome-session.spec
+++ b/gnome-session.spec
@@ -3,7 +3,7 @@
 Summary: GNOME session manager
 Name: gnome-session
 Version: 3.1.91
-Release: 2%{?dist}
+Release: 3%{?dist}
 URL: http://www.gnome.org
 #VCS: git:git://git.gnome.org/gnome-session
 Source0: http://download.gnome.org/sources/gnome-session/3.1/%{name}-%{version}.tar.xz
@@ -13,6 +13,10 @@ Source2: gnome.desktop
 # https://bugzilla.gnome.org/show_bug.cgi?id=644325
 Patch0: gnome-session-3.0.1-renderer-blacklist.patch
 
+# upstream fixes
+Patch1: 0001-gsm-Never-mark-as-handled-the-Disconnected-signal-fr.patch
+Patch2: 0002-gsm-Disconnect-all-dbus-clients-when-dbus-is-disconn.patch
+
 License: GPLv2+
 Group: User Interface/Desktops
 
@@ -78,6 +82,8 @@ Desktop file to add GNOME to display manager session menu.
 %prep
 %setup -q
 %patch0 -p1 -b .blacklist
+%patch1 -p1 -b .disconnect
+%patch2 -p1 -b .disconnect2
 
 echo "ACLOCAL_AMFLAGS = -I m4" >> Makefile.am
 
@@ -151,6 +157,9 @@ glib-compile-schemas %{_datadir}/glib-2.0/schemas || :
 %{_datadir}/glib-2.0/schemas/org.gnome.SessionManager.gschema.xml
 
 %changelog
+* Fri Sep  9 2011 Matthias Clasen <mclasen at redhat.com> 3.1.91-3
+- Some fixes to make gdm fallback mode login work
+
 * Thu Sep  8 2011 Matthias Clasen <mclasen at redhat.com> 3.1.91-2
 - Drop GConf2-gtk dep
 


More information about the scm-commits mailing list