diff options
author | Thomas Haller <thaller@redhat.com> | 2018-04-19 15:27:54 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2018-04-30 16:36:29 +0200 |
commit | 9424aa0562ebcbeaa61588aafcfb1da914c41a75 (patch) | |
tree | a14e89f79c403e5ad81b897dd37317cd12ee53e5 | |
parent | 9c2785f31c333b94f66484acf040e9f1b2d9e6a5 (diff) | |
download | NetworkManager-9424aa0562ebcbeaa61588aafcfb1da914c41a75.tar.gz |
manager: extend helper function to find all matching active-connections
... instead of just the first.
It's not used yet, and there is no change in behavior.
-rw-r--r-- | src/nm-manager.c | 86 |
1 files changed, 61 insertions, 25 deletions
diff --git a/src/nm-manager.c b/src/nm-manager.c index 63064b5776..1367203207 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -352,10 +352,11 @@ static void active_connection_parent_active (NMActiveConnection *active, NMActiveConnection *parent_ac, NMManager *self); -static NMActiveConnection *active_connection_find_first (NMManager *self, - NMSettingsConnection *settings_connection, - const char *uuid, - NMActiveConnectionState max_state); +static NMActiveConnection *active_connection_find (NMManager *self, + NMSettingsConnection *settings_connection, + const char *uuid, + NMActiveConnectionState max_state, + GPtrArray **out_all_matching); static NMConnectivity *concheck_get_mgr (NMManager *self); @@ -799,10 +800,11 @@ _delete_volatile_connection_do (NMManager *self, if (!NM_FLAGS_HAS (nm_settings_connection_get_flags (connection), NM_SETTINGS_CONNECTION_INT_FLAGS_VOLATILE)) return; - if (active_connection_find_first (self, - connection, - NULL, - NM_ACTIVE_CONNECTION_STATE_DEACTIVATED)) + if (active_connection_find (self, + connection, + NULL, + NM_ACTIVE_CONNECTION_STATE_DEACTIVATED, + NULL)) return; if (!nm_settings_has_connection (priv->settings, connection)) return; @@ -944,15 +946,19 @@ nm_manager_get_active_connections (NMManager *manager) } static NMActiveConnection * -active_connection_find_first (NMManager *self, - NMSettingsConnection *settings_connection, - const char *uuid, - NMActiveConnectionState max_state) +active_connection_find (NMManager *self, + NMSettingsConnection *settings_connection, + const char *uuid, + NMActiveConnectionState max_state, + GPtrArray **out_all_matching) { NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self); NMActiveConnection *ac; + NMActiveConnection *best_ac = NULL; + GPtrArray *all = NULL; nm_assert (!settings_connection || NM_IS_SETTINGS_CONNECTION (settings_connection)); + nm_assert (!out_all_matching || !*out_all_matching); c_list_for_each_entry (ac, &priv->active_connections_lst_head, active_connections_lst) { NMSettingsConnection *con; @@ -964,10 +970,37 @@ active_connection_find_first (NMManager *self, continue; if (nm_active_connection_get_state (ac) > max_state) continue; - return ac; + + if (!out_all_matching) + return ac; + + if (!best_ac) { + best_ac = ac; + continue; + } + + if (!all) { + all = g_ptr_array_new_with_free_func (g_object_unref); + g_ptr_array_add (all, g_object_ref (best_ac)); + } + g_ptr_array_add (all, g_object_ref (ac)); } - return NULL; + if (!best_ac) + return NULL; + + /* as an optimization, we only allocate out_all_matching, if there are more + * than one result. If there is only one result, we only return the single + * element and don't bother allocating an array. That's the common case. + * + * Also, in case we have multiple results, we return the *first* one + * as @best_ac. */ + nm_assert ( !all + || ( all->len >= 2 + && all->pdata[0] == best_ac)); + + *out_all_matching = all; + return best_ac; } static NMActiveConnection * @@ -982,10 +1015,11 @@ active_connection_find_first_by_connection (NMManager *self, is_settings_connection = NM_IS_SETTINGS_CONNECTION (connection); /* Depending on whether connection is a settings connection, * either lookup by object-identity of @connection, or compare the UUID */ - return active_connection_find_first (self, - is_settings_connection ? NM_SETTINGS_CONNECTION (connection) : NULL, - is_settings_connection ? NULL : nm_connection_get_uuid (connection), - NM_ACTIVE_CONNECTION_STATE_DEACTIVATING); + return active_connection_find (self, + is_settings_connection ? NM_SETTINGS_CONNECTION (connection) : NULL, + is_settings_connection ? NULL : nm_connection_get_uuid (connection), + NM_ACTIVE_CONNECTION_STATE_DEACTIVATING, + NULL); } static gboolean @@ -996,7 +1030,7 @@ _get_activatable_connections_filter (NMSettings *settings, if (NM_FLAGS_HAS (nm_settings_connection_get_flags (connection), NM_SETTINGS_CONNECTION_INT_FLAGS_VOLATILE)) return FALSE; - return !active_connection_find_first (user_data, connection, NULL, NM_ACTIVE_CONNECTION_STATE_DEACTIVATING); + return !active_connection_find (user_data, connection, NULL, NM_ACTIVE_CONNECTION_STATE_DEACTIVATING, NULL); } NMSettingsConnection ** @@ -2031,7 +2065,7 @@ connection_flags_changed (NMSettings *settings, NM_SETTINGS_CONNECTION_INT_FLAGS_VOLATILE)) return; - if (active_connection_find_first (self, connection, NULL, NM_ACTIVE_CONNECTION_STATE_DEACTIVATED)) { + if (active_connection_find (self, connection, NULL, NM_ACTIVE_CONNECTION_STATE_DEACTIVATED, NULL)) { /* the connection still have an active-connection. It will be purged * when the active connection(s) get(s) removed. */ return; @@ -2405,8 +2439,9 @@ get_existing_connection (NMManager *self, */ if ( assume_state_connection_uuid && (connection_checked = nm_settings_get_connection_by_uuid (priv->settings, assume_state_connection_uuid)) - && !active_connection_find_first (self, connection_checked, NULL, - NM_ACTIVE_CONNECTION_STATE_DEACTIVATING) + && !active_connection_find (self, connection_checked, NULL, + NM_ACTIVE_CONNECTION_STATE_DEACTIVATING, + NULL) && nm_device_check_connection_compatible (device, NM_CONNECTION (connection_checked))) { if (connection) { @@ -3428,8 +3463,9 @@ find_master (NMManager *self, if (out_master_device) *out_master_device = master_device; if (out_master_ac && master_connection) { - *out_master_ac = active_connection_find_first (self, master_connection, NULL, - NM_ACTIVE_CONNECTION_STATE_DEACTIVATING); + *out_master_ac = active_connection_find (self, master_connection, NULL, + NM_ACTIVE_CONNECTION_STATE_DEACTIVATING, + NULL); } if (master_device || master_connection) @@ -4079,7 +4115,7 @@ _internal_activate_device (NMManager *self, NMActiveConnection *active, GError * autoconnect_slaves (self, connection, device, nm_active_connection_get_subject (active)); /* Disconnect the connection if connected or queued on another device */ - existing_ac = active_connection_find_first (self, connection, NULL, NM_ACTIVE_CONNECTION_STATE_DEACTIVATING); + existing_ac = active_connection_find (self, connection, NULL, NM_ACTIVE_CONNECTION_STATE_DEACTIVATING, NULL); if (existing_ac) { existing = nm_active_connection_get_device (existing_ac); if (existing) |