diff options
author | Dan Winship <danw@gnome.org> | 2014-10-21 22:30:31 -0400 |
---|---|---|
committer | Dan Winship <danw@gnome.org> | 2014-10-28 17:17:17 -0400 |
commit | 9e5c7d915b837e79a2f6d64a7d89bf2a2dec2f50 (patch) | |
tree | 5a57c561a0a6f84df7630b4fa599fb6695f448d9 | |
parent | b108790833e4829586cf42a60a60a783fe535608 (diff) | |
download | NetworkManager-9e5c7d915b837e79a2f6d64a7d89bf2a2dec2f50.tar.gz |
libnm-core: make nm_setting_verify() take an NMConnection
nm_setting_verify() took a GSList of other NMSettings, but really it
would just be simpler all around to pass the NMConnection instead...
This means that several formerly NMSetting-branded functions that
operated on lists-of-settings now get replaced with
NMConnection-branded functions instead.
33 files changed, 216 insertions, 246 deletions
diff --git a/libnm-core/Makefile.libnm-core b/libnm-core/Makefile.libnm-core index a6f70133c8..481fc806ac 100644 --- a/libnm-core/Makefile.libnm-core +++ b/libnm-core/Makefile.libnm-core @@ -45,6 +45,7 @@ libnm_core_headers = \ libnm_core_private_headers = \ $(core)/crypto.h \ + $(core)/nm-connection-private.h \ $(core)/nm-core-internal.h \ $(core)/nm-property-compare.h \ $(core)/nm-setting-private.h \ diff --git a/libnm-core/nm-connection-private.h b/libnm-core/nm-connection-private.h new file mode 100644 index 0000000000..620e6a81ec --- /dev/null +++ b/libnm-core/nm-connection-private.h @@ -0,0 +1,35 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ +/* + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + * Copyright 2014 Red Hat, Inc. + */ + +#ifndef __NM_CONNECTION_PRIVATE_H__ +#define __NM_CONNECTION_PRIVATE_H__ + +#include "nm-setting.h" +#include "nm-connection.h" + +NMSetting *_nm_connection_find_base_type_setting (NMConnection *connection); + +const char *_nm_connection_detect_slave_type (NMConnection *connection, + NMSetting **out_s_port); + +gboolean _nm_connection_verify_required_interface_name (NMConnection *connection, + GError **error); + +#endif /* __NM_CONNECTION_PRIVATE_H__ */ diff --git a/libnm-core/nm-connection.c b/libnm-core/nm-connection.c index 6340a0fa02..a6789b3195 100644 --- a/libnm-core/nm-connection.c +++ b/libnm-core/nm-connection.c @@ -24,6 +24,7 @@ #include <glib/gi18n.h> #include <string.h> #include "nm-connection.h" +#include "nm-connection-private.h" #include "nm-utils.h" #include "nm-setting-private.h" #include "nm-core-internal.h" @@ -500,13 +501,35 @@ nm_connection_diff (NMConnection *a, return *out_settings ? FALSE : TRUE; } +NMSetting * +_nm_connection_find_base_type_setting (NMConnection *connection) +{ + NMConnectionPrivate *priv = NM_CONNECTION_GET_PRIVATE (connection); + GHashTableIter iter; + NMSetting *setting = NULL, *s_iter; + + g_hash_table_iter_init (&iter, priv->settings); + while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &s_iter)) { + if (!_nm_setting_is_base_type (s_iter)) + continue; + + if (setting) { + /* FIXME: currently, if there is more than one matching base type, + * we cannot detect the base setting. + * See: https://bugzilla.gnome.org/show_bug.cgi?id=696936#c8 */ + return NULL; + } + setting = s_iter; + } + return setting; +} + static gboolean _normalize_connection_type (NMConnection *self) { NMSettingConnection *s_con = nm_connection_get_setting_connection (self); NMSetting *s_base = NULL; const char *type; - GSList *all_settings; type = nm_setting_connection_get_connection_type (s_con); @@ -521,26 +544,57 @@ _normalize_connection_type (NMConnection *self) return TRUE; } } else { - all_settings = _nm_utils_hash_values_to_slist (NM_CONNECTION_GET_PRIVATE (self)->settings); - - s_base = _nm_setting_find_in_list_base_type (all_settings); + s_base = _nm_connection_find_base_type_setting (self); g_return_val_if_fail (s_base, FALSE); type = nm_setting_get_name (s_base); g_object_set (s_con, NM_SETTING_CONNECTION_TYPE, type, NULL); - g_slist_free (all_settings); return TRUE; } return FALSE; } +const char * +_nm_connection_detect_slave_type (NMConnection *connection, NMSetting **out_s_port) +{ + NMConnectionPrivate *priv = NM_CONNECTION_GET_PRIVATE (connection); + GHashTableIter iter; + const char *slave_type = NULL; + NMSetting *s_port = NULL, *s_iter; + + g_hash_table_iter_init (&iter, priv->settings); + while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &s_iter)) { + const char *name = nm_setting_get_name (s_iter); + const char *i_slave_type = NULL; + + if (!strcmp (name, NM_SETTING_BRIDGE_PORT_SETTING_NAME)) + i_slave_type = NM_SETTING_BRIDGE_SETTING_NAME; + else if (!strcmp (name, NM_SETTING_TEAM_PORT_SETTING_NAME)) + i_slave_type = NM_SETTING_TEAM_SETTING_NAME; + else + continue; + + if (slave_type) { + /* there are more then one matching port types, cannot detect the slave type. */ + slave_type = NULL; + s_port = NULL; + break; + } + slave_type = i_slave_type; + s_port = s_iter; + } + + if (out_s_port) + *out_s_port = s_port; + return slave_type; +} + static gboolean _normalize_connection_slave_type (NMConnection *self) { NMSettingConnection *s_con = nm_connection_get_setting_connection (self); const char *slave_type, *port_type; - GSList *all_settings; if (!s_con) return FALSE; @@ -563,14 +617,10 @@ _normalize_connection_slave_type (NMConnection *self) } } } else { - all_settings = _nm_utils_hash_values_to_slist (NM_CONNECTION_GET_PRIVATE (self)->settings); - - if ((slave_type = _nm_setting_slave_type_detect_from_settings (all_settings, NULL))) { + if ((slave_type = _nm_connection_detect_slave_type (self, NULL))) { g_object_set (s_con, NM_SETTING_CONNECTION_SLAVE_TYPE, slave_type, NULL); - g_slist_free (all_settings); return TRUE; } - g_slist_free (all_settings); } return FALSE; } @@ -721,8 +771,7 @@ _nm_connection_verify (NMConnection *connection, GError **error) /* Order NMSettingConnection so that it will be verified first. * The reason is, that errors in this setting might be more fundamental * and should be checked and reported with higher priority. - * Another reason is, that some settings look especially at the - * NMSettingConnection, so they find it first in the all_settings list. */ + */ if (value == s_con) all_settings = g_slist_append (all_settings, value); else @@ -742,7 +791,7 @@ _nm_connection_verify (NMConnection *connection, GError **error) * @NM_SETTING_VERIFY_NORMALIZABLE, so, if we encounter such an error type, * we remember it instead (to return it as output). **/ - verify_result = _nm_setting_verify (NM_SETTING (setting_i->data), all_settings, &verify_error); + verify_result = _nm_setting_verify (NM_SETTING (setting_i->data), connection, &verify_error); if (verify_result == NM_SETTING_VERIFY_NORMALIZABLE || verify_result == NM_SETTING_VERIFY_NORMALIZABLE_ERROR) { if ( verify_result == NM_SETTING_VERIFY_NORMALIZABLE_ERROR @@ -1334,6 +1383,24 @@ nm_connection_get_interface_name (NMConnection *connection) return s_con ? nm_setting_connection_get_interface_name (s_con) : NULL; } +gboolean +_nm_connection_verify_required_interface_name (NMConnection *connection, + GError **error) +{ + const char *interface_name; + + interface_name = nm_connection_get_interface_name (connection); + if (interface_name) + return TRUE; + + g_set_error_literal (error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_MISSING_PROPERTY, + _("property is missing")); + g_prefix_error (error, "%s.%s: ", NM_SETTING_CONNECTION_SETTING_NAME, NM_SETTING_CONNECTION_INTERFACE_NAME); + return FALSE; +} + /** * nm_connection_get_uuid: * @connection: the #NMConnection diff --git a/libnm-core/nm-setting-8021x.c b/libnm-core/nm-setting-8021x.c index fc1b46fb67..a1019060d1 100644 --- a/libnm-core/nm-setting-8021x.c +++ b/libnm-core/nm-setting-8021x.c @@ -2601,7 +2601,7 @@ verify_cert (GBytes *bytes, const char *prop_name, GError **error) } static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) +verify (NMSetting *setting, NMConnection *connection, GError **error) { NMSetting8021x *self = NM_SETTING_802_1X (setting); NMSetting8021xPrivate *priv = NM_SETTING_802_1X_GET_PRIVATE (self); diff --git a/libnm-core/nm-setting-adsl.c b/libnm-core/nm-setting-adsl.c index 3ba569231f..dfd1e0107c 100644 --- a/libnm-core/nm-setting-adsl.c +++ b/libnm-core/nm-setting-adsl.c @@ -177,7 +177,7 @@ nm_setting_adsl_get_vci (NMSettingAdsl *setting) } static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) +verify (NMSetting *setting, NMConnection *connection, GError **error) { NMSettingAdslPrivate *priv = NM_SETTING_ADSL_GET_PRIVATE (setting); diff --git a/libnm-core/nm-setting-bluetooth.c b/libnm-core/nm-setting-bluetooth.c index 4bc7e156a8..952dd61b51 100644 --- a/libnm-core/nm-setting-bluetooth.c +++ b/libnm-core/nm-setting-bluetooth.c @@ -107,7 +107,7 @@ nm_setting_bluetooth_get_bdaddr (NMSettingBluetooth *setting) } static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) +verify (NMSetting *setting, NMConnection *connection, GError **error) { NMSettingBluetoothPrivate *priv = NM_SETTING_BLUETOOTH_GET_PRIVATE (setting); @@ -148,12 +148,12 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) } /* Make sure the corresponding 'type' setting is present */ - if ( all_settings + if ( connection && !strcmp (priv->type, NM_SETTING_BLUETOOTH_TYPE_DUN)) { gboolean gsm = FALSE, cdma = FALSE; - gsm = !!nm_setting_find_in_list (all_settings, NM_SETTING_GSM_SETTING_NAME); - cdma = !!nm_setting_find_in_list (all_settings, NM_SETTING_CDMA_SETTING_NAME); + gsm = !!nm_connection_get_setting_gsm (connection); + cdma = !!nm_connection_get_setting_cdma (connection); if (!gsm && !cdma) { /* We can't return MISSING_SETTING here, because we don't know diff --git a/libnm-core/nm-setting-bond.c b/libnm-core/nm-setting-bond.c index fb65c1f998..ab026aac78 100644 --- a/libnm-core/nm-setting-bond.c +++ b/libnm-core/nm-setting-bond.c @@ -29,7 +29,7 @@ #include "nm-setting-bond.h" #include "nm-utils.h" #include "nm-utils-private.h" -#include "nm-setting-private.h" +#include "nm-connection-private.h" #include "nm-setting-infiniband.h" /** @@ -432,7 +432,7 @@ nm_setting_bond_get_option_default (NMSettingBond *setting, const char *name) } static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) +verify (NMSetting *setting, NMConnection *connection, GError **error) { NMSettingBondPrivate *priv = NM_SETTING_BOND_GET_PRIVATE (setting); GHashTableIter iter; @@ -539,7 +539,7 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) } } - if (nm_setting_find_in_list (all_settings, NM_SETTING_INFINIBAND_SETTING_NAME)) { + if (nm_connection_get_setting_infiniband (connection)) { if (strcmp (value, "active-backup") != 0) { g_set_error (error, NM_CONNECTION_ERROR, @@ -642,7 +642,7 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) return FALSE; } - return _nm_setting_verify_required_virtual_interface_name (all_settings, error); + return _nm_connection_verify_required_interface_name (connection, error); } static void diff --git a/libnm-core/nm-setting-bridge-port.c b/libnm-core/nm-setting-bridge-port.c index 6f215951ad..d1ffdca3d3 100644 --- a/libnm-core/nm-setting-bridge-port.c +++ b/libnm-core/nm-setting-bridge-port.c @@ -27,7 +27,7 @@ #include "nm-setting-bridge-port.h" #include "nm-utils.h" #include "nm-utils-private.h" -#include "nm-setting-private.h" +#include "nm-connection-private.h" #include "nm-setting-connection.h" #include "nm-setting-bridge.h" @@ -112,7 +112,7 @@ nm_setting_bridge_port_get_hairpin_mode (NMSettingBridgePort *setting) #define BR_MAX_PATH_COST 65535 static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) +verify (NMSetting *setting, NMConnection *connection, GError **error) { NMSettingBridgePortPrivate *priv = NM_SETTING_BRIDGE_PORT_GET_PRIVATE (setting); @@ -141,15 +141,19 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) } - if (all_settings) { + if (connection) { NMSettingConnection *s_con; const char *slave_type; - s_con = NM_SETTING_CONNECTION (_nm_setting_find_in_list_required (all_settings, - NM_SETTING_CONNECTION_SETTING_NAME, - error)); - if (!s_con) - return FALSE; + s_con = nm_connection_get_setting_connection (connection); + if (!s_con) { + g_set_error (error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_MISSING_SETTING, + _("missing setting")); + g_prefix_error (error, "%s: ", NM_SETTING_CONNECTION_SETTING_NAME); + return FALSE; + } slave_type = nm_setting_connection_get_slave_type (s_con); if ( slave_type diff --git a/libnm-core/nm-setting-bridge.c b/libnm-core/nm-setting-bridge.c index 1c43208847..100804a017 100644 --- a/libnm-core/nm-setting-bridge.c +++ b/libnm-core/nm-setting-bridge.c @@ -25,7 +25,7 @@ #include <glib/gi18n.h> #include "nm-setting-bridge.h" -#include "nm-setting-private.h" +#include "nm-connection-private.h" #include "nm-utils.h" #include "nm-utils-private.h" @@ -210,7 +210,7 @@ check_range (guint32 val, } static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) +verify (NMSetting *setting, NMConnection *connection, GError **error) { NMSettingBridgePrivate *priv = NM_SETTING_BRIDGE_GET_PRIVATE (setting); @@ -251,7 +251,7 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) error)) return FALSE; - return _nm_setting_verify_required_virtual_interface_name (all_settings, error); + return _nm_connection_verify_required_interface_name (connection, error); } static void diff --git a/libnm-core/nm-setting-cdma.c b/libnm-core/nm-setting-cdma.c index 02e7e28928..f611cc601c 100644 --- a/libnm-core/nm-setting-cdma.c +++ b/libnm-core/nm-setting-cdma.c @@ -129,7 +129,7 @@ nm_setting_cdma_get_password_flags (NMSettingCdma *setting) } static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) +verify (NMSetting *setting, NMConnection *connection, GError **error) { NMSettingCdmaPrivate *priv = NM_SETTING_CDMA_GET_PRIVATE (setting); diff --git a/libnm-core/nm-setting-connection.c b/libnm-core/nm-setting-connection.c index 45819cc4c6..e7f8518d43 100644 --- a/libnm-core/nm-setting-connection.c +++ b/libnm-core/nm-setting-connection.c @@ -26,7 +26,7 @@ #include "nm-utils.h" #include "nm-utils-private.h" #include "nm-setting-connection.h" -#include "nm-setting-private.h" +#include "nm-connection-private.h" #include "nm-setting-bond.h" #include "nm-setting-bridge.h" #include "nm-setting-team.h" @@ -748,7 +748,7 @@ _set_error_missing_base_setting (GError **error, const char *type) } static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) +verify (NMSetting *setting, NMConnection *connection, GError **error) { NMSettingConnectionPrivate *priv = NM_SETTING_CONNECTION_GET_PRIVATE (setting); gboolean is_slave; @@ -805,7 +805,7 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) } if (!priv->type) { - if (!(normerr_base_type = _nm_setting_find_in_list_base_type (all_settings))) { + if (!connection || !(normerr_base_type = _nm_connection_find_base_type_setting (connection))) { g_set_error_literal (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_MISSING_PROPERTY, @@ -837,18 +837,18 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) } /* Make sure the corresponding 'type' item is present */ - if ( all_settings - && !nm_setting_find_in_list (all_settings, priv->type)) { + if ( connection + && !nm_connection_get_setting_by_name (connection, priv->type)) { NMSetting *s_base; - GSList *all_settings2; + NMConnection *connection2; s_base = g_object_new (base_type, NULL); - all_settings2 = g_slist_prepend (all_settings, s_base); + connection2 = nm_simple_connection_new_clone (connection); + nm_connection_add_setting (connection2, s_base); - normerr_base_setting = nm_setting_verify (s_base, all_settings2, NULL); + normerr_base_setting = nm_setting_verify (s_base, connection2, NULL); - g_slist_free_1 (all_settings2); - g_object_unref (s_base); + g_object_unref (connection2); if (!normerr_base_setting) { _set_error_missing_base_setting (error, priv->type); @@ -880,16 +880,16 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) return FALSE; } if ( slave_setting_type - && all_settings /* only check for an existing slave-setting when having @all_settings */ - && !nm_setting_find_in_list (all_settings, slave_setting_type)) + && connection + && !nm_connection_get_setting_by_name (connection, slave_setting_type)) normerr_slave_setting_type = slave_setting_type; } else { if (priv->master) { const char *slave_type; NMSetting *s_port; - if ( all_settings - && (slave_type = _nm_setting_slave_type_detect_from_settings (all_settings, &s_port))) { + if ( connection + && (slave_type = _nm_connection_detect_slave_type (connection, &s_port))) { normerr_missing_slave_type = slave_type; normerr_missing_slave_type_port = nm_setting_get_name (s_port); } else { diff --git a/libnm-core/nm-setting-dcb.c b/libnm-core/nm-setting-dcb.c index e68be5e108..8a99ec07bb 100644 --- a/libnm-core/nm-setting-dcb.c +++ b/libnm-core/nm-setting-dcb.c @@ -619,7 +619,7 @@ check_priority (gint val, } static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) +verify (NMSetting *setting, NMConnection *connection, GError **error) { NMSettingDcbPrivate *priv = NM_SETTING_DCB_GET_PRIVATE (setting); diff --git a/libnm-core/nm-setting-gsm.c b/libnm-core/nm-setting-gsm.c index 7661db6557..d537376db5 100644 --- a/libnm-core/nm-setting-gsm.c +++ b/libnm-core/nm-setting-gsm.c @@ -213,7 +213,7 @@ nm_setting_gsm_get_home_only (NMSettingGsm *setting) } static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) +verify (NMSetting *setting, NMConnection *connection, GError **error) { NMSettingGsmPrivate *priv = NM_SETTING_GSM_GET_PRIVATE (setting); diff --git a/libnm-core/nm-setting-infiniband.c b/libnm-core/nm-setting-infiniband.c index 61e532e357..ed80a13609 100644 --- a/libnm-core/nm-setting-infiniband.c +++ b/libnm-core/nm-setting-infiniband.c @@ -178,7 +178,7 @@ nm_setting_infiniband_get_virtual_interface_name (NMSettingInfiniband *setting) } static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) +verify (NMSetting *setting, NMConnection *connection, GError **error) { NMSettingConnection *s_con; NMSettingInfinibandPrivate *priv = NM_SETTING_INFINIBAND_GET_PRIVATE (setting); @@ -237,7 +237,7 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) } } - s_con = NM_SETTING_CONNECTION (nm_setting_find_in_list (all_settings, NM_SETTING_CONNECTION_SETTING_NAME)); + s_con = nm_connection_get_setting_connection (connection); if (s_con) { const char *interface_name = nm_setting_connection_get_interface_name (s_con); diff --git a/libnm-core/nm-setting-ip4-config.c b/libnm-core/nm-setting-ip4-config.c index 80e1f38caf..00f2df502e 100644 --- a/libnm-core/nm-setting-ip4-config.c +++ b/libnm-core/nm-setting-ip4-config.c @@ -868,7 +868,7 @@ verify_label (const char *label) } static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) +verify (NMSetting *setting, NMConnection *connection, GError **error) { NMSettingIP4ConfigPrivate *priv = NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting); GSList *iter, *l_iter; diff --git a/libnm-core/nm-setting-ip6-config.c b/libnm-core/nm-setting-ip6-config.c index ca08ad8bb9..cbc5e2c8be 100644 --- a/libnm-core/nm-setting-ip6-config.c +++ b/libnm-core/nm-setting-ip6-config.c @@ -786,7 +786,7 @@ nm_setting_ip6_config_get_ip6_privacy (NMSettingIP6Config *setting) } static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) +verify (NMSetting *setting, NMConnection *connection, GError **error) { NMSettingIP6ConfigPrivate *priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); GSList *iter; diff --git a/libnm-core/nm-setting-olpc-mesh.c b/libnm-core/nm-setting-olpc-mesh.c index 92d1045792..968be898bb 100644 --- a/libnm-core/nm-setting-olpc-mesh.c +++ b/libnm-core/nm-setting-olpc-mesh.c @@ -94,7 +94,7 @@ nm_setting_olpc_mesh_get_dhcp_anycast_address (NMSettingOlpcMesh *setting) } static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) +verify (NMSetting *setting, NMConnection *connection, GError **error) { NMSettingOlpcMeshPrivate *priv = NM_SETTING_OLPC_MESH_GET_PRIVATE (setting); gsize length; diff --git a/libnm-core/nm-setting-ppp.c b/libnm-core/nm-setting-ppp.c index d150fe7783..c3511fb896 100644 --- a/libnm-core/nm-setting-ppp.c +++ b/libnm-core/nm-setting-ppp.c @@ -352,7 +352,7 @@ nm_setting_ppp_get_lcp_echo_interval (NMSettingPpp *setting) } static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) +verify (NMSetting *setting, NMConnection *connection, GError **error) { NMSettingPppPrivate *priv = NM_SETTING_PPP_GET_PRIVATE (setting); diff --git a/libnm-core/nm-setting-pppoe.c b/libnm-core/nm-setting-pppoe.c index 488e4ba404..403560221a 100644 --- a/libnm-core/nm-setting-pppoe.c +++ b/libnm-core/nm-setting-pppoe.c @@ -130,7 +130,7 @@ nm_setting_pppoe_get_password_flags (NMSettingPppoe *setting) } static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) +verify (NMSetting *setting, NMConnection *connection, GError **error) { NMSettingPppoePrivate *priv = NM_SETTING_PPPOE_GET_PRIVATE (setting); diff --git a/libnm-core/nm-setting-private.h b/libnm-core/nm-setting-private.h index 7940a161e2..56c4f46c48 100644 --- a/libnm-core/nm-setting-private.h +++ b/libnm-core/nm-setting-private.h @@ -91,26 +91,15 @@ gboolean _nm_setting_clear_secrets_with_flags (NMSetting *setting, static void __attribute__((constructor)) register_setting (void) \ { g_type_init (); g_type_ensure (x); } -NMSetting *nm_setting_find_in_list (GSList *settings_list, const char *setting_name); - -NMSetting * _nm_setting_find_in_list_required (GSList *all_settings, - const char *setting_name, - GError **error); - -NMSettingVerifyResult _nm_setting_verify_required_virtual_interface_name (GSList *all_settings, - GError **error); - GVariant *_nm_setting_get_deprecated_virtual_interface_name (NMSetting *setting, NMConnection *connection, const char *property); NMSettingVerifyResult _nm_setting_verify (NMSetting *setting, - GSList *all_settings, - GError **error); + NMConnection *connection, + GError **error); -NMSetting *_nm_setting_find_in_list_base_type (GSList *all_settings); gboolean _nm_setting_slave_type_is_valid (const char *slave_type, const char **out_port_type); -const char * _nm_setting_slave_type_detect_from_settings (GSList *all_settings, NMSetting **out_s_port); GVariant *_nm_setting_to_dbus (NMSetting *setting, NMConnection *connection, diff --git a/libnm-core/nm-setting-serial.c b/libnm-core/nm-setting-serial.c index 23a37fe86a..8676cb4e6a 100644 --- a/libnm-core/nm-setting-serial.c +++ b/libnm-core/nm-setting-serial.c @@ -146,7 +146,7 @@ nm_setting_serial_get_send_delay (NMSettingSerial *setting) } static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) +verify (NMSetting *setting, NMConnection *connection, GError **error) { return TRUE; } diff --git a/libnm-core/nm-setting-team-port.c b/libnm-core/nm-setting-team-port.c index 66443633b9..cbdae158e1 100644 --- a/libnm-core/nm-setting-team-port.c +++ b/libnm-core/nm-setting-team-port.c @@ -26,7 +26,7 @@ #include "nm-setting-team-port.h" #include "nm-utils.h" #include "nm-utils-private.h" -#include "nm-setting-private.h" +#include "nm-connection-private.h" #include "nm-setting-connection.h" #include "nm-setting-team.h" @@ -82,17 +82,21 @@ nm_setting_team_port_get_config (NMSettingTeamPort *setting) } static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) +verify (NMSetting *setting, NMConnection *connection, GError **error) { - if (all_settings) { + if (connection) { NMSettingConnection *s_con; const char *slave_type; - s_con = NM_SETTING_CONNECTION (_nm_setting_find_in_list_required (all_settings, - NM_SETTING_CONNECTION_SETTING_NAME, - error)); - if (!s_con) + s_con = nm_connection_get_setting_connection (connection); + if (!s_con) { + g_set_error (error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_MISSING_SETTING, + _("missing setting")); + g_prefix_error (error, "%s: ", NM_SETTING_CONNECTION_SETTING_NAME); return FALSE; + } slave_type = nm_setting_connection_get_slave_type (s_con); if ( slave_type diff --git a/libnm-core/nm-setting-team.c b/libnm-core/nm-setting-team.c index ab2d65eb60..91d80b178b 100644 --- a/libnm-core/nm-setting-team.c +++ b/libnm-core/nm-setting-team.c @@ -25,7 +25,7 @@ #include "nm-setting-team.h" #include "nm-utils.h" #include "nm-utils-private.h" -#include "nm-setting-private.h" +#include "nm-connection-private.h" /** * SECTION:nm-setting-team @@ -79,9 +79,9 @@ nm_setting_team_get_config (NMSettingTeam *setting) } static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) +verify (NMSetting *setting, NMConnection *connection, GError **error) { - return _nm_setting_verify_required_virtual_interface_name (all_settings, error); + return _nm_connection_verify_required_interface_name (connection, error); } static void diff --git a/libnm-core/nm-setting-vlan.c b/libnm-core/nm-setting-vlan.c index 00fca606cc..b0d19c7520 100644 --- a/libnm-core/nm-setting-vlan.c +++ b/libnm-core/nm-setting-vlan.c @@ -28,6 +28,7 @@ #include "nm-setting-connection.h" #include "nm-setting-private.h" #include "nm-setting-wired.h" +#include "nm-connection-private.h" /** * SECTION:nm-setting-vlan @@ -479,18 +480,18 @@ nm_setting_vlan_init (NMSettingVlan *setting) } static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) +verify (NMSetting *setting, NMConnection *connection, GError **error) { NMSettingVlanPrivate *priv = NM_SETTING_VLAN_GET_PRIVATE (setting); - NMSettingConnection *s_con = NULL; - NMSettingWired *s_wired = NULL; - GSList *iter; + NMSettingConnection *s_con; + NMSettingWired *s_wired; - for (iter = all_settings; iter; iter = iter->next) { - if (NM_IS_SETTING_CONNECTION (iter->data)) - s_con = iter->data; - else if (NM_IS_SETTING_WIRED (iter->data)) - s_wired = iter->data; + if (connection) { + s_con = nm_connection_get_setting_connection (connection); + s_wired = nm_connection_get_setting_wired (connection); + } else { + s_con = NULL; + s_wired = NULL; } if (priv->parent) { @@ -529,7 +530,7 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) /* If parent is NULL, the parent must be specified via * NMSettingWired:mac-address. */ - if ( all_settings + if ( connection && (!s_wired || !nm_setting_wired_get_mac_address (s_wired))) { g_set_error (error, NM_CONNECTION_ERROR, diff --git a/libnm-core/nm-setting-vpn.c b/libnm-core/nm-setting-vpn.c index 07f815716e..2e68ac9a67 100644 --- a/libnm-core/nm-setting-vpn.c +++ b/libnm-core/nm-setting-vpn.c @@ -367,7 +367,7 @@ nm_setting_vpn_foreach_secret (NMSettingVpn *setting, } static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) +verify (NMSetting *setting, NMConnection *connection, GError **error) { NMSettingVpnPrivate *priv = NM_SETTING_VPN_GET_PRIVATE (setting); diff --git a/libnm-core/nm-setting-wimax.c b/libnm-core/nm-setting-wimax.c index 9de966f3fd..ccc46fe4ef 100644 --- a/libnm-core/nm-setting-wimax.c +++ b/libnm-core/nm-setting-wimax.c @@ -104,7 +104,7 @@ nm_setting_wimax_get_mac_address (NMSettingWimax *setting) } static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) +verify (NMSetting *setting, NMConnection *connection, GError **error) { NMSettingWimaxPrivate *priv = NM_SETTING_WIMAX_GET_PRIVATE (setting); diff --git a/libnm-core/nm-setting-wired.c b/libnm-core/nm-setting-wired.c index 45c0827d6b..7bf1ae2f26 100644 --- a/libnm-core/nm-setting-wired.c +++ b/libnm-core/nm-setting-wired.c @@ -555,7 +555,7 @@ nm_setting_wired_get_valid_s390_options (NMSettingWired *setting) } static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) +verify (NMSetting *setting, NMConnection *connection, GError **error) { NMSettingWiredPrivate *priv = NM_SETTING_WIRED_GET_PRIVATE (setting); const char *valid_ports[] = { "tp", "aui", "bnc", "mii", NULL }; diff --git a/libnm-core/nm-setting-wireless-security.c b/libnm-core/nm-setting-wireless-security.c index f66722b270..35ef2fdcbe 100644 --- a/libnm-core/nm-setting-wireless-security.c +++ b/libnm-core/nm-setting-wireless-security.c @@ -844,7 +844,7 @@ no_secrets: } static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) +verify (NMSetting *setting, NMConnection *connection, GError **error) { NMSettingWirelessSecurity *self = NM_SETTING_WIRELESS_SECURITY (setting); NMSettingWirelessSecurityPrivate *priv = NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE (self); @@ -904,7 +904,7 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) if ( (strcmp (priv->key_mgmt, "ieee8021x") == 0) || (strcmp (priv->key_mgmt, "wpa-eap") == 0)) { /* Need an 802.1x setting too */ - if (!nm_setting_find_in_list (all_settings, NM_SETTING_802_1X_SETTING_NAME)) { + if (connection && !nm_connection_get_setting_802_1x (connection)) { g_set_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_MISSING_SETTING, diff --git a/libnm-core/nm-setting-wireless.c b/libnm-core/nm-setting-wireless.c index 5ca1169116..d374d91b7c 100644 --- a/libnm-core/nm-setting-wireless.c +++ b/libnm-core/nm-setting-wireless.c @@ -676,7 +676,7 @@ nm_setting_wireless_get_seen_bssid (NMSettingWireless *setting, } static gboolean -verify (NMSetting *setting, GSList *all_settings, GError **error) +verify (NMSetting *setting, NMConnection *connection, GError **error) { NMSettingWirelessPrivate *priv = NM_SETTING_WIRELESS_GET_PRIVATE (setting); const char *valid_modes[] = { NM_SETTING_WIRELESS_MODE_INFRA, NM_SETTING_WIRELESS_MODE_ADHOC, NM_SETTING_WIRELESS_MODE_AP, NULL }; diff --git a/libnm-core/nm-setting.c b/libnm-core/nm-setting.c index 81547b3f91..645d8d3a8f 100644 --- a/libnm-core/nm-setting.c +++ b/libnm-core/nm-setting.c @@ -283,64 +283,6 @@ _nm_setting_slave_type_is_valid (const char *slave_type, const char **out_port_t return found; } - -NMSetting * -_nm_setting_find_in_list_base_type (GSList *all_settings) -{ - GSList *iter; - NMSetting *setting = NULL; - - for (iter = all_settings; iter; iter = iter->next) { - NMSetting *s_iter = NM_SETTING (iter->data); - - if (!_nm_setting_is_base_type (s_iter)) - continue; - - if (setting) { - /* FIXME: currently, if there is more than one matching base type, - * we cannot detect the base setting. - * See: https://bugzilla.gnome.org/show_bug.cgi?id=696936#c8 */ - return NULL; - } - setting = s_iter; - } - return setting; -} - -const char * -_nm_setting_slave_type_detect_from_settings (GSList *all_settings, NMSetting **out_s_port) -{ - GSList *iter; - const char *slave_type = NULL; - NMSetting *s_port = NULL; - - for (iter = all_settings; iter; iter = iter->next) { - NMSetting *s_iter = NM_SETTING (iter->data); - const char *name = nm_setting_get_name (s_iter); - const char *i_slave_type = NULL; - - if (!strcmp (name, NM_SETTING_BRIDGE_PORT_SETTING_NAME)) - i_slave_type = NM_SETTING_BRIDGE_SETTING_NAME; - else if (!strcmp (name, NM_SETTING_TEAM_PORT_SETTING_NAME)) - i_slave_type = NM_SETTING_TEAM_SETTING_NAME; - else - continue; - - if (slave_type) { - /* there are more then one matching port types, cannot detect the slave type. */ - slave_type = NULL; - s_port = NULL; - break; - } - slave_type = i_slave_type; - s_port = s_iter; - } - - if (out_s_port) - *out_s_port = s_port; - return slave_type; -} - /*************************************************************/ typedef struct { @@ -900,28 +842,6 @@ nm_setting_duplicate (NMSetting *setting) return NM_SETTING (dup); } -static gint -find_setting_by_name (gconstpointer a, gconstpointer b) -{ - NMSetting *setting = NM_SETTING (a); - const char *str = (const char *) b; - - return strcmp (nm_setting_get_name (setting), str); -} - -NMSetting * -nm_setting_find_in_list (GSList *settings_list, - const char *setting_name) -{ - GSList *found; - - found = g_slist_find_custom (settings_list, setting_name, find_setting_by_name); - if (found) - return found->data; - else - return NULL; -} - /** * nm_setting_get_name: * @setting: the #NMSetting @@ -945,21 +865,21 @@ nm_setting_get_name (NMSetting *setting) /** * nm_setting_verify: * @setting: the #NMSetting to verify - * @all_settings: (element-type NMSetting): a #GSList of all settings - * in the connection from which @setting came + * @connection: (allow-none): the #NMConnection that @setting came from, or + * %NULL if @setting is being verified in isolation. * @error: location to store error, or %NULL * * Validates the setting. Each setting's properties have allowed values, and - * some are dependent on other values (hence the need for @all_settings). The + * some are dependent on other values (hence the need for @connection). The * returned #GError contains information about which property of the setting * failed validation, and in what way that property failed validation. * * Returns: %TRUE if the setting is valid, %FALSE if it is not **/ gboolean -nm_setting_verify (NMSetting *setting, GSList *all_settings, GError **error) +nm_setting_verify (NMSetting *setting, NMConnection *connection, GError **error) { - NMSettingVerifyResult result = _nm_setting_verify (setting, all_settings, error); + NMSettingVerifyResult result = _nm_setting_verify (setting, connection, error); if (result == NM_SETTING_VERIFY_NORMALIZABLE) g_clear_error (error); @@ -968,13 +888,14 @@ nm_setting_verify (NMSetting *setting, GSList *all_settings, GError **error) } NMSettingVerifyResult -_nm_setting_verify (NMSetting *setting, GSList *all_settings, GError **error) +_nm_setting_verify (NMSetting *setting, NMConnection *connection, GError **error) { g_return_val_if_fail (NM_IS_SETTING (setting), NM_SETTING_VERIFY_ERROR); + g_return_val_if_fail (!connection || NM_IS_CONNECTION (connection), NM_SETTING_VERIFY_ERROR); g_return_val_if_fail (!error || *error == NULL, NM_SETTING_VERIFY_ERROR); if (NM_SETTING_GET_CLASS (setting)->verify) - return NM_SETTING_GET_CLASS (setting)->verify (setting, all_settings, error); + return NM_SETTING_GET_CLASS (setting)->verify (setting, connection, error); return NM_SETTING_VERIFY_SUCCESS; } @@ -1734,49 +1655,6 @@ nm_setting_to_string (NMSetting *setting) return g_string_free (string, FALSE); } -NMSetting * -_nm_setting_find_in_list_required (GSList *all_settings, - const char *setting_name, - GError **error) -{ - NMSetting *setting; - - g_return_val_if_fail (!error || !*error, NULL); - g_return_val_if_fail (all_settings, NULL); - g_return_val_if_fail (setting_name, NULL); - - setting = nm_setting_find_in_list (all_settings, setting_name); - if (!setting) { - g_set_error_literal (error, - NM_CONNECTION_ERROR, - NM_CONNECTION_ERROR_MISSING_SETTING, - _("missing setting")); - g_prefix_error (error, "%s: ", setting_name); - } - return setting; -} - -NMSettingVerifyResult -_nm_setting_verify_required_virtual_interface_name (GSList *all_settings, - GError **error) -{ - NMSettingConnection *s_con; - const char *interface_name; - - s_con = NM_SETTING_CONNECTION (nm_setting_find_in_list (all_settings, NM_SETTING_CONNECTION_SETTING_NAME)); - interface_name = s_con ? nm_setting_connection_get_interface_name (s_con) : NULL; - if (!interface_name) { - g_set_error_literal (error, - NM_CONNECTION_ERROR, - NM_CONNECTION_ERROR_MISSING_PROPERTY, - _("property is missing")); - g_prefix_error (error, "%s.%s: ", NM_SETTING_CONNECTION_SETTING_NAME, NM_SETTING_CONNECTION_INTERFACE_NAME); - return NM_SETTING_VERIFY_ERROR; - } - - return NM_SETTING_VERIFY_SUCCESS; -} - GVariant * _nm_setting_get_deprecated_virtual_interface_name (NMSetting *setting, NMConnection *connection, diff --git a/libnm-core/nm-setting.h b/libnm-core/nm-setting.h index 8f845b203e..30a2c577d9 100644 --- a/libnm-core/nm-setting.h +++ b/libnm-core/nm-setting.h @@ -158,9 +158,9 @@ typedef struct { GObjectClass parent; /* Virtual functions */ - gint (*verify) (NMSetting *setting, - GSList *all_settings, - GError **error); + gint (*verify) (NMSetting *setting, + NMConnection *connection, + GError **error); GPtrArray *(*need_secrets) (NMSetting *setting); @@ -220,9 +220,9 @@ NMSetting *nm_setting_duplicate (NMSetting *setting); const char *nm_setting_get_name (NMSetting *setting); -gboolean nm_setting_verify (NMSetting *setting, - GSList *all_settings, - GError **error); +gboolean nm_setting_verify (NMSetting *setting, + NMConnection *connection, + GError **error); gboolean nm_setting_compare (NMSetting *a, NMSetting *b, diff --git a/libnm-core/tests/test-setting-dcb.c b/libnm-core/tests/test-setting-dcb.c index 1b83a48d1d..8d861a0390 100644 --- a/libnm-core/tests/test-setting-dcb.c +++ b/libnm-core/tests/test-setting-dcb.c @@ -25,6 +25,7 @@ #include <nm-glib-compat.h> #include "nm-setting-dcb.h" #include "nm-connection.h" +#include "nm-errors.h" #define DCB_FLAGS_ALL (NM_SETTING_DCB_FLAG_ENABLE | \ NM_SETTING_DCB_FLAG_ADVERTISE | \ diff --git a/src/devices/wifi/nm-device-wifi.c b/src/devices/wifi/nm-device-wifi.c index 094b78ca01..51cc8c0358 100644 --- a/src/devices/wifi/nm-device-wifi.c +++ b/src/devices/wifi/nm-device-wifi.c @@ -1013,17 +1013,7 @@ complete_connection (NMDevice *device, * if the network isn't broadcasting the SSID for example. */ if (!ap) { - GSList *settings = NULL; - gboolean valid; - - settings = g_slist_prepend (settings, s_wifi); - if (s_wsec) - settings = g_slist_prepend (settings, s_wsec); - if (s_8021x) - settings = g_slist_prepend (settings, s_8021x); - valid = nm_setting_verify (NM_SETTING (s_wifi), settings, error); - g_slist_free (settings); - if (!valid) + if (!nm_setting_verify (NM_SETTING (s_wifi), connection, error)) return FALSE; hidden = TRUE; |