summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Winship <danw@gnome.org>2014-07-29 15:37:27 -0400
committerDan Winship <danw@gnome.org>2014-08-14 10:59:04 -0400
commit992b10794db49c4c32f900e9ea21e43ff6924d08 (patch)
tree84a348354e076717a9efffba9d1f43bf7655f684
parentbcdd1bfb5cd26498a4dac8da0ed077ff3020edb5 (diff)
downloadNetworkManager-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.c53
-rw-r--r--libnm-core/nm-setting-bond.c13
-rw-r--r--libnm-core/nm-setting-bridge.c13
-rw-r--r--libnm-core/nm-setting-connection.c29
-rw-r--r--libnm-core/nm-setting-private.h7
-rw-r--r--libnm-core/nm-setting-team.c13
-rw-r--r--libnm-core/nm-setting-vlan.c14
-rw-r--r--libnm-core/nm-setting.c22
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