diff options
author | Dan Winship <danw@gnome.org> | 2014-07-29 15:37:27 -0400 |
---|---|---|
committer | Dan Winship <danw@gnome.org> | 2014-08-14 10:59:04 -0400 |
commit | 992b10794db49c4c32f900e9ea21e43ff6924d08 (patch) | |
tree | 84a348354e076717a9efffba9d1f43bf7655f684 | |
parent | bcdd1bfb5cd26498a4dac8da0ed077ff3020edb5 (diff) | |
download | NetworkManager-danw/wip/normalize.tar.gz |
libnm-core: Use _nm_setting_normalize() for interface-name normalizationdanw/wip/normalize
Rather than handling this as a special case in
nm_connection_normalize(), let NMSettingConnection and each of the
virtual device setting types handle this normalization themselves.
-rw-r--r-- | libnm-core/nm-connection.c | 53 | ||||
-rw-r--r-- | libnm-core/nm-setting-bond.c | 13 | ||||
-rw-r--r-- | libnm-core/nm-setting-bridge.c | 13 | ||||
-rw-r--r-- | libnm-core/nm-setting-connection.c | 29 | ||||
-rw-r--r-- | libnm-core/nm-setting-private.h | 7 | ||||
-rw-r--r-- | libnm-core/nm-setting-team.c | 13 | ||||
-rw-r--r-- | libnm-core/nm-setting-vlan.c | 14 | ||||
-rw-r--r-- | libnm-core/nm-setting.c | 22 |
8 files changed, 111 insertions, 53 deletions
diff --git a/libnm-core/nm-connection.c b/libnm-core/nm-connection.c index 75405c4939..8b189078cf 100644 --- a/libnm-core/nm-connection.c +++ b/libnm-core/nm-connection.c @@ -574,58 +574,6 @@ nm_connection_diff (NMConnection *a, } static gboolean -_normalize_virtual_iface_name (NMConnection *self) -{ - NMConnectionPrivate *priv = NM_CONNECTION_GET_PRIVATE (self); - GHashTableIter h_iter; - NMSetting *setting; - NMSettingConnection *s_con; - const char *interface_name; - char *virtual_iface_name = NULL; - gboolean was_modified = FALSE; - const char *prop_name = NULL; - - /* search for settings that might need normalization of the interface name. */ - g_hash_table_iter_init (&h_iter, priv->settings); - while ( !prop_name - && g_hash_table_iter_next (&h_iter, NULL, (void **) &setting)) { - if (NM_IS_SETTING_BOND (setting)) - prop_name = NM_SETTING_BOND_INTERFACE_NAME; - else if (NM_IS_SETTING_BRIDGE (setting)) - prop_name = NM_SETTING_BRIDGE_INTERFACE_NAME; - else if (NM_IS_SETTING_TEAM (setting)) - prop_name = NM_SETTING_TEAM_INTERFACE_NAME; - else if (NM_IS_SETTING_VLAN (setting)) - prop_name = NM_SETTING_VLAN_INTERFACE_NAME; - } - if (!prop_name) - return FALSE; - - s_con = nm_connection_get_setting_connection (self); - g_return_val_if_fail (s_con, FALSE); - - interface_name = nm_setting_connection_get_interface_name (s_con); - - /* read the potential virtual_iface_name from the setting. */ - g_object_get (setting, prop_name, &virtual_iface_name, NULL); - - if (g_strcmp0 (interface_name, virtual_iface_name) != 0) { - if (interface_name) { - /* interface_name is set and overwrites the virtual_iface_name. */ - g_object_set (setting, prop_name, interface_name, NULL); - } else { - /* interface in NMSettingConnection must be set. */ - g_object_set (s_con, NM_SETTING_CONNECTION_INTERFACE_NAME, virtual_iface_name, NULL); - } - was_modified = TRUE; - } - - g_free (virtual_iface_name); - - return was_modified; -} - -static gboolean _normalize_ip_config (NMConnection *self, GHashTable *parameters) { NMSettingConnection *s_con = nm_connection_get_setting_connection (self); @@ -933,7 +881,6 @@ nm_connection_normalize (NMConnection *connection, was_modified |= _nm_setting_normalize (iter->data, parameters, all_settings); g_slist_free (all_settings); - was_modified |= _normalize_virtual_iface_name (connection); was_modified |= _normalize_ip_config (connection, parameters); /* Verify anew. */ diff --git a/libnm-core/nm-setting-bond.c b/libnm-core/nm-setting-bond.c index 38e1c46847..d3250ab0c7 100644 --- a/libnm-core/nm-setting-bond.c +++ b/libnm-core/nm-setting-bond.c @@ -674,6 +674,17 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) all_settings, error); } +static gboolean +normalize (NMSetting *setting, + GHashTable *parameters, + GSList *all_settings) +{ + NMSettingBondPrivate *priv = NM_SETTING_BOND_GET_PRIVATE (setting); + + return _nm_setting_normalize_deprecated_virtual_iface_name ( + &priv->interface_name, all_settings); +} + static const char * get_virtual_iface_name (NMSetting *setting) { @@ -767,7 +778,9 @@ nm_setting_bond_class_init (NMSettingBondClass *setting_class) object_class->set_property = set_property; object_class->get_property = get_property; object_class->finalize = finalize; + parent_class->verify = verify; + parent_class->normalize = normalize; parent_class->get_virtual_iface_name = get_virtual_iface_name; /* Properties */ diff --git a/libnm-core/nm-setting-bridge.c b/libnm-core/nm-setting-bridge.c index 430c1d8c76..e66dbbb9b7 100644 --- a/libnm-core/nm-setting-bridge.c +++ b/libnm-core/nm-setting-bridge.c @@ -300,6 +300,17 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) all_settings, error); } +static gboolean +normalize (NMSetting *setting, + GHashTable *parameters, + GSList *all_settings) +{ + NMSettingBridgePrivate *priv = NM_SETTING_BRIDGE_GET_PRIVATE (setting); + + return _nm_setting_normalize_deprecated_virtual_iface_name ( + &priv->interface_name, all_settings); +} + static const char * get_virtual_iface_name (NMSetting *setting) { @@ -416,7 +427,9 @@ nm_setting_bridge_class_init (NMSettingBridgeClass *setting_class) object_class->set_property = set_property; object_class->get_property = get_property; object_class->finalize = finalize; + parent_class->verify = verify; + parent_class->normalize = normalize; parent_class->get_virtual_iface_name = get_virtual_iface_name; /* Properties */ diff --git a/libnm-core/nm-setting-connection.c b/libnm-core/nm-setting-connection.c index aba48a76e5..8ad7ace152 100644 --- a/libnm-core/nm-setting-connection.c +++ b/libnm-core/nm-setting-connection.c @@ -852,6 +852,33 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) } static gboolean +normalize (NMSetting *setting, + GHashTable *parameters, + GSList *all_settings) +{ + NMSettingConnectionPrivate *priv = NM_SETTING_CONNECTION_GET_PRIVATE (setting); + const char *virtual_iface_name = NULL; + GSList *iter; + + /* If :interface-name is already set, we do nothing; verify() will deal with + * erroring out if there is a mismatch. + */ + if (priv->interface_name) + return FALSE; + + for (iter = all_settings; iter; iter = iter->next) { + virtual_iface_name = nm_setting_get_virtual_iface_name (iter->data); + if (virtual_iface_name) { + priv->interface_name = g_strdup (virtual_iface_name); + g_object_notify (G_OBJECT (setting), NM_SETTING_CONNECTION_INTERFACE_NAME); + break; + } + } + + return priv->interface_name != NULL; +} + +static gboolean compare_property (NMSetting *setting, NMSetting *other, const GParamSpec *prop_spec, @@ -1041,7 +1068,9 @@ nm_setting_connection_class_init (NMSettingConnectionClass *setting_class) object_class->set_property = set_property; object_class->get_property = get_property; object_class->finalize = finalize; + parent_class->verify = verify; + parent_class->normalize = normalize; parent_class->compare_property = compare_property; /* Properties */ diff --git a/libnm-core/nm-setting-private.h b/libnm-core/nm-setting-private.h index 99590b9e14..97b464a3f6 100644 --- a/libnm-core/nm-setting-private.h +++ b/libnm-core/nm-setting-private.h @@ -122,4 +122,11 @@ NMSettingVerifyResult _nm_setting_verify (NMSetting *setting, GSList *all_settings, GError **error); +gboolean _nm_setting_normalize_deprecated_virtual_iface_name (char **virtual_iface_name, + GSList *all_settings); + +gboolean _nm_setting_normalize (NMSetting *setting, + GHashTable *parameters, + GSList *all_settings); + #endif /* NM_SETTING_PRIVATE_H */ diff --git a/libnm-core/nm-setting-team.c b/libnm-core/nm-setting-team.c index 75305b1671..6bbce82e38 100644 --- a/libnm-core/nm-setting-team.c +++ b/libnm-core/nm-setting-team.c @@ -132,6 +132,17 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) all_settings, error); } +static gboolean +normalize (NMSetting *setting, + GHashTable *parameters, + GSList *all_settings) +{ + NMSettingTeamPrivate *priv = NM_SETTING_TEAM_GET_PRIVATE (setting); + + return _nm_setting_normalize_deprecated_virtual_iface_name ( + &priv->interface_name, all_settings); +} + static const char * get_virtual_iface_name (NMSetting *setting) { @@ -208,7 +219,9 @@ nm_setting_team_class_init (NMSettingTeamClass *setting_class) object_class->set_property = set_property; object_class->get_property = get_property; object_class->finalize = finalize; + parent_class->verify = verify; + parent_class->normalize = normalize; parent_class->get_virtual_iface_name = get_virtual_iface_name; /* Properties */ diff --git a/libnm-core/nm-setting-vlan.c b/libnm-core/nm-setting-vlan.c index 0cb1374719..7450d3b25a 100644 --- a/libnm-core/nm-setting-vlan.c +++ b/libnm-core/nm-setting-vlan.c @@ -601,6 +601,18 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) all_settings, error); } + +static gboolean +normalize (NMSetting *setting, + GHashTable *parameters, + GSList *all_settings) +{ + NMSettingVlanPrivate *priv = NM_SETTING_VLAN_GET_PRIVATE (setting); + + return _nm_setting_normalize_deprecated_virtual_iface_name ( + &priv->interface_name, all_settings); +} + static const char * get_virtual_iface_name (NMSetting *setting) { @@ -731,7 +743,9 @@ nm_setting_vlan_class_init (NMSettingVlanClass *setting_class) object_class->set_property = set_property; object_class->get_property = get_property; object_class->finalize = finalize; + parent_class->verify = verify; + parent_class->normalize = normalize; parent_class->get_virtual_iface_name = get_virtual_iface_name; /* Properties */ diff --git a/libnm-core/nm-setting.c b/libnm-core/nm-setting.c index 3faaf630d3..30222530ce 100644 --- a/libnm-core/nm-setting.c +++ b/libnm-core/nm-setting.c @@ -1366,6 +1366,28 @@ _nm_setting_verify_deprecated_virtual_iface_name (const char *interface_name, return NM_SETTING_VERIFY_SUCCESS; } +gboolean +_nm_setting_normalize_deprecated_virtual_iface_name (char **virtual_iface_name, + GSList *all_settings) +{ + NMSettingConnection *s_con; + const char *interface_name; + + s_con = NM_SETTING_CONNECTION (nm_setting_find_in_list (all_settings, NM_SETTING_CONNECTION_SETTING_NAME)); + g_return_val_if_fail (s_con != NULL, FALSE); + + interface_name = nm_setting_connection_get_interface_name (s_con); + if (!interface_name) + return FALSE; + + if (g_strcmp0 (interface_name, *virtual_iface_name) != 0) { + g_free (*virtual_iface_name); + *virtual_iface_name = g_strdup (interface_name); + return TRUE; + } else + return FALSE; +} + /*****************************************************************************/ static void |