From 63cd1b345d6094404a2b8ad50a126650525c282f Mon Sep 17 00:00:00 2001 From: Robert Love Date: Fri, 24 Feb 2006 18:59:03 +0000 Subject: [PATCH] 2006-02-24 Robert Love Patch from Timo Hoenig : * src/NetworkManagerDbus.c: Survive DBUS restarts like a champ. git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1490 4912f4e0-d625-0410-9fb7-b9a5a253dbdc --- ChangeLog | 5 +++++ src/NetworkManagerDbus.c | 39 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3e2e7a371c..1306a486d5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2006-02-24 Robert Love + + Patch from Timo Hoenig : + * src/NetworkManagerDbus.c: Survive DBUS restarts like a champ. + 2006-02-24 Robert Love Patch from Dan Winship : diff --git a/src/NetworkManagerDbus.c b/src/NetworkManagerDbus.c index 3362c417c2..67b711b81b 100644 --- a/src/NetworkManagerDbus.c +++ b/src/NetworkManagerDbus.c @@ -46,6 +46,8 @@ static char *get_nmi_match_string (const char *owner); +static gpointer nm_dbus_reinit (gpointer user_data); + /* * nm_dbus_create_error_message * @@ -494,10 +496,13 @@ static DBusHandlerResult nm_dbus_signal_filter (DBusConnection *connection, DBus handled = TRUE; } } - else if (dbus_message_is_signal (message, DBUS_INTERFACE_DBUS, "Disconnected")) + else if (dbus_message_is_signal (message, DBUS_INTERFACE_LOCAL, "Disconnected")) { - /* FIXME: try to recover from disconnection */ + nm_hal_deinit (data); + dbus_connection_unref (data->dbus_connection); data->dbus_connection = NULL; + nm_dhcp_manager_dispose (data->dhcp_manager); + g_thread_create ((GThreadFunc) nm_dbus_reinit, (gpointer) data, FALSE, NULL); handled = TRUE; } else if (dbus_message_is_signal (message, DBUS_INTERFACE_DBUS, "NameOwnerChanged")) @@ -734,6 +739,34 @@ static char *get_nmi_match_string (const char *owner) return g_strdup_printf ("type='signal',interface='" NMI_DBUS_INTERFACE "',sender='%s',path='" NMI_DBUS_PATH "'", owner); } +/* + * nm_dbus_reinit + * + * Reconnect to the system message bus if the connection was dropped. + * + */ + +static gpointer nm_dbus_reinit (gpointer user_data) +{ + NMData *data = (NMData *) user_data; + char *owner; + + g_return_val_if_fail (data != NULL, NULL); + + while ((data->dbus_connection = nm_dbus_init (data)) == NULL) + g_usleep (G_USEC_PER_SEC * 3); + + /* if HAL was quick it is already back on the bus. Thus, we do not receive NameOwnerChanged */ + if ((owner = get_name_owner (data->dbus_connection, "org.freedesktop.Hal"))) + nm_hal_init (data); + + data->dhcp_manager = nm_dhcp_manager_new (data); + + nm_info ("Successfully reconnected to the system bus."); + + return NULL; +} + /* * nm_dbus_init @@ -762,7 +795,7 @@ DBusConnection *nm_dbus_init (NMData *data) goto out; } - //dbus_connection_set_exit_on_disconnect (connection, FALSE); + dbus_connection_set_exit_on_disconnect (connection, FALSE); dbus_connection_setup_with_g_main (connection, data->main_context); data->nm_methods = nm_dbus_nm_methods_setup ();