summaryrefslogtreecommitdiff
path: root/dispatcher-daemon/NetworkManagerDispatcher.c
diff options
context:
space:
mode:
Diffstat (limited to 'dispatcher-daemon/NetworkManagerDispatcher.c')
-rw-r--r--dispatcher-daemon/NetworkManagerDispatcher.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/dispatcher-daemon/NetworkManagerDispatcher.c b/dispatcher-daemon/NetworkManagerDispatcher.c
index c61b25cbaf..8f1d366398 100644
--- a/dispatcher-daemon/NetworkManagerDispatcher.c
+++ b/dispatcher-daemon/NetworkManagerDispatcher.c
@@ -52,6 +52,7 @@ typedef enum NMDAction NMDAction;
#define NMD_DEFAULT_PID_FILE LOCALSTATEDIR"/run/NetworkManagerDispatcher.pid"
+static DBusConnection *nmd_dbus_init (void);
/*
* nmd_permission_check
@@ -174,6 +175,22 @@ static char * nmd_get_device_name (DBusConnection *connection, char *path)
return dev_name;
}
+/*
+ * nmd reinit_dbus
+ *
+ * Reconnect to the system message bus if the connection was dropped.
+ *
+ */
+static gboolean nmd_reinit_dbus (gpointer user_data)
+{
+ if (nmd_dbus_init ())
+ {
+ nm_info ("Successfully reconnected to the system bus.");
+ return FALSE;
+ }
+ else
+ return TRUE;
+}
/*
* nmd_dbus_filter
@@ -191,6 +208,14 @@ static DBusHandlerResult nmd_dbus_filter (DBusConnection *connection, DBusMessag
dbus_error_init (&error);
object_path = dbus_message_get_path (message);
+ if (dbus_message_is_signal (message, DBUS_INTERFACE_LOCAL, "Disconnected"))
+ {
+ dbus_connection_unref (connection);
+ connection = NULL;
+ g_timeout_add (3000, nmd_reinit_dbus, NULL);
+ handled = TRUE;
+ }
+
if (dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceNoLongerActive"))
action = NMD_DEVICE_NOW_INACTIVE;
else if (dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceNowActive"))
@@ -225,7 +250,6 @@ static DBusHandlerResult nmd_dbus_filter (DBusConnection *connection, DBusMessag
return (handled ? DBUS_HANDLER_RESULT_HANDLED : DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
}
-
/*
* nmd_dbus_init
*
@@ -246,6 +270,7 @@ static DBusConnection *nmd_dbus_init (void)
return (NULL);
}
+ dbus_connection_set_exit_on_disconnect (connection, FALSE);
dbus_connection_setup_with_g_main (connection, NULL);
if (!dbus_connection_add_filter (connection, nmd_dbus_filter, NULL, NULL))