diff options
author | Lubomir Rintel <lkundrak@v3.sk> | 2019-10-10 15:43:04 +0200 |
---|---|---|
committer | Lubomir Rintel <lkundrak@v3.sk> | 2019-10-18 17:38:57 +0200 |
commit | 976eebae73c4e55b598edf4a05a5470ddff292e8 (patch) | |
tree | 941ef0f2a940538919ef65ee25b52af00d280a2b /clients | |
parent | 8766d05ea946cbaeca69322607a8e4c2d969c28b (diff) | |
download | NetworkManager-976eebae73c4e55b598edf4a05a5470ddff292e8.tar.gz |
cli/devices: keep the AddAndActivateInfo alive until the activation ends
In a future commit it will be useful to know whether the activation
details when the activation succeeds.
This also makes the state tracking of the ongoing activation more
elegant, since we got our device and AC neatly packed together and we
can treat their respective state changes consistently.
Diffstat (limited to 'clients')
-rw-r--r-- | clients/cli/devices.c | 113 |
1 files changed, 46 insertions, 67 deletions
diff --git a/clients/cli/devices.c b/clients/cli/devices.c index e89c0c3747..4321713a0e 100644 --- a/clients/cli/devices.c +++ b/clients/cli/devices.c @@ -1770,62 +1770,10 @@ progress_cb (gpointer user_data) return TRUE; } -static void connected_state_cb (NMDevice *device, NMActiveConnection *active); - -static void -device_state_cb (NMDevice *device, GParamSpec *pspec, gpointer user_data) -{ - NMActiveConnection *active = (NMActiveConnection *) user_data; - - connected_state_cb (device, active); -} - -static void -active_state_cb (NMActiveConnection *active, GParamSpec *pspec, gpointer user_data) -{ - NMDevice *device = (NMDevice *) user_data; - - connected_state_cb (device, active); -} - -static void -connected_state_cb (NMDevice *device, NMActiveConnection *active) -{ - NMDeviceState state; - NMDeviceStateReason reason; - NMActiveConnectionState ac_state; - - state = nm_device_get_state (device); - ac_state = nm_active_connection_get_state (active); - - if (ac_state == NM_ACTIVE_CONNECTION_STATE_ACTIVATING) - return; - - if (state == NM_DEVICE_STATE_ACTIVATED) { - nmc_terminal_erase_line (); - g_print (_("Device '%s' successfully activated with '%s'.\n"), - nm_device_get_iface (device), - nm_active_connection_get_uuid (active)); - } else if ( state <= NM_DEVICE_STATE_DISCONNECTED - || state >= NM_DEVICE_STATE_DEACTIVATING) { - reason = nm_device_get_state_reason (device); - g_print (_("Error: Connection activation failed: (%d) %s.\n"), - reason, gettext (nmc_device_reason_to_string (reason))); - } else - return; - - g_signal_handlers_disconnect_by_func (active, G_CALLBACK (active_state_cb), device); - g_signal_handlers_disconnect_by_func (device, G_CALLBACK (device_state_cb), active); - - g_object_unref (active); - g_object_unref (device); - - quit (); -} - typedef struct { NmCli *nmc; NMDevice *device; + NMActiveConnection *active; char *specific_object; bool hotspot:1; bool create:1; @@ -1855,6 +1803,7 @@ static void add_and_activate_info_free (AddAndActivateInfo *info) { g_object_unref (info->device); + g_clear_object (&info->active); g_free (info->specific_object); nm_g_slice_free (info); } @@ -1863,13 +1812,46 @@ NM_AUTO_DEFINE_FCN0 (AddAndActivateInfo *, _nm_auto_free_add_and_activate_info, #define nm_auto_free_add_and_activate_info nm_auto (_nm_auto_free_add_and_activate_info) static void +connected_state_cb (AddAndActivateInfo *info) +{ + NMDeviceState state; + NMDeviceStateReason reason; + NMActiveConnectionState ac_state; + + state = nm_device_get_state (info->device); + ac_state = nm_active_connection_get_state (info->active); + + if (ac_state == NM_ACTIVE_CONNECTION_STATE_ACTIVATING) + return; + + if (state == NM_DEVICE_STATE_ACTIVATED) { + nmc_terminal_erase_line (); + g_print (_("Device '%s' successfully activated with '%s'.\n"), + nm_device_get_iface (info->device), + nm_active_connection_get_uuid (info->active)); + } else if ( state <= NM_DEVICE_STATE_DISCONNECTED + || state >= NM_DEVICE_STATE_DEACTIVATING) { + reason = nm_device_get_state_reason (info->device); + g_print (_("Error: Connection activation failed: (%d) %s.\n"), + reason, gettext (nmc_device_reason_to_string (reason))); + } else { + return; + } + + g_signal_handlers_disconnect_by_func (info->active, G_CALLBACK (connected_state_cb), info); + g_signal_handlers_disconnect_by_func (info->device, G_CALLBACK (connected_state_cb), info); + add_and_activate_info_free (info); + + quit (); +} + +static void add_and_activate_cb (GObject *client, GAsyncResult *result, gpointer user_data) { nm_auto_free_add_and_activate_info AddAndActivateInfo *info = user_data; NmCli *nmc = info->nmc; - NMDevice *device = info->device; gs_unref_object NMActiveConnection *active = NULL; gs_free_error GError *error = NULL; @@ -1899,16 +1881,15 @@ add_and_activate_cb (GObject *client, return; } - g_signal_connect (device, "notify::state", G_CALLBACK (device_state_cb), active); - g_signal_connect (active, "notify::state", G_CALLBACK (active_state_cb), device); + if (nmc->nmc_config.print_output == NMC_PRINT_PRETTY) + progress_id = g_timeout_add (120, progress_cb, info->device); - connected_state_cb (g_object_ref (device), - g_steal_pointer (&active)); + info->active = g_steal_pointer (&active); + g_signal_connect_swapped (info->device, "notify::state", G_CALLBACK (connected_state_cb), info); + g_signal_connect_swapped (info->active, "notify::state", G_CALLBACK (connected_state_cb), info); + connected_state_cb (g_steal_pointer (&info)); g_timeout_add_seconds (nmc->timeout, timeout_cb, nmc); /* Exit if timeout expires */ - - if (nmc->nmc_config.print_output == NMC_PRINT_PRETTY) - progress_id = g_timeout_add (120, progress_cb, device); } static void @@ -1940,7 +1921,6 @@ connect_device_cb (GObject *client, GAsyncResult *result, gpointer user_data) nm_auto_free_add_and_activate_info AddAndActivateInfo *info = user_data; NmCli *nmc = info->nmc; gs_unref_object NMActiveConnection *active = NULL; - NMDevice *device = info->device; GError *error = NULL; active = nm_client_activate_connection_finish (NM_CLIENT (client), result, &error); @@ -1975,11 +1955,10 @@ connect_device_cb (GObject *client, GAsyncResult *result, gpointer user_data) nm_connection_get_path (NM_CONNECTION (connection))); } - g_signal_connect (device, "notify::state", G_CALLBACK (device_state_cb), active); - g_signal_connect (active, "notify::state", G_CALLBACK (active_state_cb), device); - - connected_state_cb (g_object_ref (device), - g_steal_pointer (&active)); + info->active = g_steal_pointer (&active); + g_signal_connect_swapped (info->device, "notify::state", G_CALLBACK (connected_state_cb), info); + g_signal_connect_swapped (info->active, "notify::state", G_CALLBACK (connected_state_cb), info); + connected_state_cb (g_steal_pointer (&info)); /* Start timer not to loop forever if "notify::state" signal is not issued */ g_timeout_add_seconds (nmc->timeout, timeout_cb, nmc); |