diff options
-rw-r--r-- | src/devices/team/nm-device-team.c | 65 |
1 files changed, 44 insertions, 21 deletions
diff --git a/src/devices/team/nm-device-team.c b/src/devices/team/nm-device-team.c index 2e5424ccc2..2933fee976 100644 --- a/src/devices/team/nm-device-team.c +++ b/src/devices/team/nm-device-team.c @@ -169,6 +169,7 @@ update_connection (NMDevice *device, NMConnection *connection) { NMDeviceTeam *self = NM_DEVICE_TEAM (device); NMSettingTeam *s_team = nm_connection_get_setting_team (connection); + NMDeviceTeamPrivate *priv = NM_DEVICE_TEAM_GET_PRIVATE (self); if (!s_team) { s_team = (NMSettingTeam *) nm_setting_team_new (); @@ -176,7 +177,7 @@ update_connection (NMDevice *device, NMConnection *connection) } g_object_set (G_OBJECT (s_team), NM_SETTING_TEAM_CONFIG, NULL, NULL); - if (ensure_teamd_connection (device)) { + if (priv->tdc) { const char *config = NULL; int err; @@ -273,11 +274,6 @@ teamd_cleanup (NMDevice *device, gboolean device_state_failed) { NMDeviceTeamPrivate *priv = NM_DEVICE_TEAM_GET_PRIVATE (device); - if (priv->teamd_dbus_watch) { - g_bus_unwatch_name (priv->teamd_dbus_watch); - priv->teamd_dbus_watch = 0; - } - if (priv->teamd_process_watch) { g_source_remove (priv->teamd_process_watch); priv->teamd_process_watch = 0; @@ -333,6 +329,7 @@ teamd_dbus_appeared (GDBusConnection *connection, _LOGI (LOGD_TEAM, "teamd appeared on D-Bus"); teamd_timeout_remove (device); + nm_device_queue_recheck_assume (device); success = ensure_teamd_connection (device); if (nm_device_get_state (device) == NM_DEVICE_STATE_PREPARE) { @@ -355,7 +352,7 @@ teamd_dbus_vanished (GDBusConnection *connection, g_return_if_fail (priv->teamd_dbus_watch); - if (priv->teamd_timeout) { + if (!priv->teamd_pid) { /* g_bus_watch_name will always raise an initial signal, to indicate whether the * name exists/not exists initially. Do not take this as a failure, until the * startup timeout is over. @@ -363,7 +360,7 @@ teamd_dbus_vanished (GDBusConnection *connection, * Note that g_bus_watch_name is guaranteed to alternate vanished/appeared signals, * so we won't hit this condition again (because the next signal is either 'appeared' * or 'timeout'). */ - _LOGD (LOGD_TEAM, "teamd vanished from D-Bus (ignored)"); + _LOGD (LOGD_TEAM, "teamd not on D-Bus (ignored)"); return; } @@ -403,6 +400,25 @@ teamd_child_setup (gpointer user_data G_GNUC_UNUSED) nm_unblock_posix_signals (NULL); } +static void +nm_device_team_watch_dbus (NMDeviceTeam *self) +{ + NMDeviceTeamPrivate *priv = NM_DEVICE_TEAM_GET_PRIVATE (self); + const char *iface = nm_device_get_ip_iface (NM_DEVICE (self)); + char *tmp_str = NULL; + + /* Register D-Bus name watcher */ + tmp_str = g_strdup_printf ("org.libteam.teamd.%s", iface); + priv->teamd_dbus_watch = g_bus_watch_name (G_BUS_TYPE_SYSTEM, + tmp_str, + G_BUS_NAME_WATCHER_FLAGS_NONE, + teamd_dbus_appeared, + teamd_dbus_vanished, + NM_DEVICE (self), + NULL); + g_free (tmp_str); +} + static gboolean teamd_start (NMDevice *device, NMSettingTeam *s_team) { @@ -417,8 +433,7 @@ teamd_start (NMDevice *device, NMSettingTeam *s_team) gboolean ret; int status; - if (priv->teamd_dbus_watch || - priv->teamd_process_watch || + if (priv->teamd_process_watch || priv->teamd_pid > 0 || priv->tdc || priv->teamd_timeout) @@ -477,17 +492,6 @@ teamd_start (NMDevice *device, NMSettingTeam *s_team) /* Start a timeout for teamd to appear at D-Bus */ priv->teamd_timeout = g_timeout_add_seconds (5, teamd_timeout_cb, device); - /* Register D-Bus name watcher */ - tmp_str = g_strdup_printf ("org.libteam.teamd.%s", iface); - priv->teamd_dbus_watch = g_bus_watch_name (G_BUS_TYPE_SYSTEM, - tmp_str, - G_BUS_NAME_WATCHER_FLAGS_NONE, - teamd_dbus_appeared, - teamd_dbus_vanished, - device, - NULL); - g_free (tmp_str); - ret = g_spawn_async ("/", (char **) argv->pdata, NULL, G_SPAWN_DO_NOT_REAP_CHILD, &teamd_child_setup, NULL, &priv->teamd_pid, &error); g_ptr_array_free (argv, TRUE); @@ -692,6 +696,16 @@ nm_device_team_init (NMDeviceTeam * self) } static void +constructed (GObject *object) +{ + NMDeviceTeam *self = NM_DEVICE_TEAM (object); + + G_OBJECT_CLASS (nm_device_team_parent_class)->constructed (object); + + nm_device_team_watch_dbus (self); +} + +static void get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { @@ -728,6 +742,14 @@ set_property (GObject *object, guint prop_id, static void dispose (GObject *object) { + NMDeviceTeam *self = NM_DEVICE_TEAM (object); + NMDeviceTeamPrivate *priv = NM_DEVICE_TEAM_GET_PRIVATE (self); + + if (priv->teamd_dbus_watch) { + g_bus_unwatch_name (priv->teamd_dbus_watch); + priv->teamd_dbus_watch = 0; + } + teamd_cleanup (NM_DEVICE (object), FALSE); G_OBJECT_CLASS (nm_device_team_parent_class)->dispose (object); @@ -744,6 +766,7 @@ nm_device_team_class_init (NMDeviceTeamClass *klass) parent_class->connection_type = NM_SETTING_TEAM_SETTING_NAME; /* virtual methods */ + object_class->constructed = constructed; object_class->get_property = get_property; object_class->set_property = set_property; object_class->dispose = dispose; |