diff options
Diffstat (limited to 'src/nmcli/connections.c')
-rw-r--r-- | src/nmcli/connections.c | 118 |
1 files changed, 72 insertions, 46 deletions
diff --git a/src/nmcli/connections.c b/src/nmcli/connections.c index c4f70bd1b2..3b97da76a4 100644 --- a/src/nmcli/connections.c +++ b/src/nmcli/connections.c @@ -291,65 +291,91 @@ connection_type_to_display(const char *type, NMMetaAccessorGetType get_type) static int active_connection_get_state_ord(NMActiveConnection *active) { + static const NMActiveConnectionState ordered_states[] = { + NM_ACTIVE_CONNECTION_STATE_UNKNOWN, + NM_ACTIVE_CONNECTION_STATE_DEACTIVATED, + NM_ACTIVE_CONNECTION_STATE_DEACTIVATING, + NM_ACTIVE_CONNECTION_STATE_ACTIVATING, + NM_ACTIVE_CONNECTION_STATE_ACTIVATED, + }; + NMActiveConnectionState state; + int i; + gboolean is_external; + /* returns an integer related to @active's state, that can be used for sorting * active connections based on their activation state. */ + if (!active) - return -2; + return -10; - switch (nm_active_connection_get_state(active)) { - case NM_ACTIVE_CONNECTION_STATE_UNKNOWN: - return 0; - case NM_ACTIVE_CONNECTION_STATE_DEACTIVATED: - return 1; - case NM_ACTIVE_CONNECTION_STATE_DEACTIVATING: - return 2; - case NM_ACTIVE_CONNECTION_STATE_ACTIVATING: - return 3; - case NM_ACTIVE_CONNECTION_STATE_ACTIVATED: - return 4; + state = nm_active_connection_get_state(active); + is_external = NM_FLAGS_HAS(nm_active_connection_get_state_flags(active), + NM_ACTIVATION_STATE_FLAG_EXTERNAL); + + for (i = 0; i < (int) G_N_ELEMENTS(ordered_states); i++) { + if (state == ordered_states[i]) { + if (!is_external) + i += G_N_ELEMENTS(ordered_states); + return i; + } } - return -1; + + return is_external ? -2 : -1; } int nmc_active_connection_cmp(NMActiveConnection *ac_a, NMActiveConnection *ac_b) { - NMSettingIPConfig *s_ip; - NMRemoteConnection *conn; + NMSettingIPConfig *s_ip4_a; + NMSettingIPConfig *s_ip4_b; + NMSettingIPConfig *s_ip6_a; + NMSettingIPConfig *s_ip6_b; + NMRemoteConnection *conn_a; + NMRemoteConnection *conn_b; NMIPConfig *da_ip; NMIPConfig *db_ip; - int da_num_addrs; - int db_num_addrs; - int cmp = 0; + gint64 da_num_addrs; + gint64 db_num_addrs; + gboolean bool_a; + gboolean bool_b; + + /* nmc_active_connection_cmp() sorts more-important ACs later. That means, + * - NULL comes first + * - then sorting by state (active_connection_get_state_ord()), with "activated" sorted last. + * - various properties of the AC. + * + * This is basically the inverse order of `nmcli connection`. + */ - /* Non-active sort last. */ + /* Non-active (and NULL) sort first! */ NM_CMP_SELF(ac_a, ac_b); - NM_CMP_DIRECT(active_connection_get_state_ord(ac_b), active_connection_get_state_ord(ac_a)); + NM_CMP_DIRECT(active_connection_get_state_ord(ac_a), active_connection_get_state_ord(ac_b)); + + conn_a = nm_active_connection_get_connection(ac_a); + conn_b = nm_active_connection_get_connection(ac_b); + + s_ip6_a = conn_a ? nm_connection_get_setting_ip6_config(NM_CONNECTION(conn_a)) : NULL; + s_ip6_b = conn_b ? nm_connection_get_setting_ip6_config(NM_CONNECTION(conn_b)) : NULL; /* Shared connections (likely hotspots) go on the top if possible */ - conn = nm_active_connection_get_connection(ac_a); - s_ip = conn ? nm_connection_get_setting_ip6_config(NM_CONNECTION(conn)) : NULL; - if (s_ip - && nm_streq(nm_setting_ip_config_get_method(s_ip), NM_SETTING_IP6_CONFIG_METHOD_SHARED)) - cmp++; - conn = nm_active_connection_get_connection(ac_b); - s_ip = conn ? nm_connection_get_setting_ip6_config(NM_CONNECTION(conn)) : NULL; - if (s_ip - && nm_streq(nm_setting_ip_config_get_method(s_ip), NM_SETTING_IP6_CONFIG_METHOD_SHARED)) - cmp--; - NM_CMP_RETURN(cmp); - - conn = nm_active_connection_get_connection(ac_a); - s_ip = conn ? nm_connection_get_setting_ip4_config(NM_CONNECTION(conn)) : NULL; - if (s_ip - && nm_streq(nm_setting_ip_config_get_method(s_ip), NM_SETTING_IP4_CONFIG_METHOD_SHARED)) - cmp++; - conn = nm_active_connection_get_connection(ac_b); - s_ip = conn ? nm_connection_get_setting_ip4_config(NM_CONNECTION(conn)) : NULL; - if (s_ip - && nm_streq(nm_setting_ip_config_get_method(s_ip), NM_SETTING_IP4_CONFIG_METHOD_SHARED)) - cmp--; - NM_CMP_RETURN(cmp); + bool_a = (s_ip6_a + && nm_streq(nm_setting_ip_config_get_method(s_ip6_a), + NM_SETTING_IP6_CONFIG_METHOD_SHARED)); + bool_b = (s_ip6_b + && nm_streq(nm_setting_ip_config_get_method(s_ip6_b), + NM_SETTING_IP6_CONFIG_METHOD_SHARED)); + NM_CMP_DIRECT(bool_a, bool_b); + + s_ip4_a = conn_a ? nm_connection_get_setting_ip4_config(NM_CONNECTION(conn_a)) : NULL; + s_ip4_b = conn_b ? nm_connection_get_setting_ip4_config(NM_CONNECTION(conn_b)) : NULL; + + bool_a = (s_ip4_a + && nm_streq(nm_setting_ip_config_get_method(s_ip4_a), + NM_SETTING_IP4_CONFIG_METHOD_SHARED)); + bool_b = (s_ip4_b + && nm_streq(nm_setting_ip_config_get_method(s_ip4_b), + NM_SETTING_IP4_CONFIG_METHOD_SHARED)); + NM_CMP_DIRECT(bool_a, bool_b); /* VPNs go next */ NM_CMP_DIRECT(!!nm_active_connection_get_vpn(ac_a), !!nm_active_connection_get_vpn(ac_b)); @@ -367,9 +393,9 @@ nmc_active_connection_cmp(NMActiveConnection *ac_a, NMActiveConnection *ac_b) db_num_addrs = db_ip ? nm_ip_config_get_addresses(db_ip)->len : 0; da_ip = nm_active_connection_get_ip6_config(ac_a); - da_num_addrs += da_ip ? nm_ip_config_get_addresses(da_ip)->len : 0; + da_num_addrs += (gint64) (da_ip ? nm_ip_config_get_addresses(da_ip)->len : 0u); db_ip = nm_active_connection_get_ip6_config(ac_b); - db_num_addrs += db_ip ? nm_ip_config_get_addresses(db_ip)->len : 0; + db_num_addrs += (gint64) (db_ip ? nm_ip_config_get_addresses(db_ip)->len : 0u); NM_CMP_DIRECT(da_num_addrs, db_num_addrs); @@ -1447,7 +1473,7 @@ get_ac_for_connection_cmp(gconstpointer pa, gconstpointer pb) NMActiveConnection *ac_a = *((NMActiveConnection *const *) pa); NMActiveConnection *ac_b = *((NMActiveConnection *const *) pb); - NM_CMP_RETURN(nmc_active_connection_cmp(ac_a, ac_b)); + NM_CMP_RETURN(nmc_active_connection_cmp(ac_b, ac_a)); NM_CMP_DIRECT_STRCMP0(nm_active_connection_get_id(ac_a), nm_active_connection_get_id(ac_b)); NM_CMP_DIRECT_STRCMP0(nm_active_connection_get_connection_type(ac_a), nm_active_connection_get_connection_type(ac_b)); |