[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