diff options
Diffstat (limited to 'libnm-core/nm-setting.c')
| -rw-r--r-- | libnm-core/nm-setting.c | 3976 |
1 files changed, 1979 insertions, 1997 deletions
diff --git a/libnm-core/nm-setting.c b/libnm-core/nm-setting.c index dfb2bed9..0f621289 100644 --- a/libnm-core/nm-setting.c +++ b/libnm-core/nm-setting.c @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: LGPL-2.1+ +/* SPDX-License-Identifier: LGPL-2.1+ */ /* * Copyright (C) 2007 - 2011 Red Hat, Inc. * Copyright (C) 2007 - 2008 Novell, Inc. @@ -29,81 +29,78 @@ /*****************************************************************************/ typedef struct { - GHashTable *hash; - const char **names; - GVariant **values; + GHashTable * hash; + const char **names; + GVariant ** values; } GenData; typedef struct { - const char *name; - GType type; - NMSettingPriority priority; + const char * name; + GType type; + NMSettingPriority priority; } SettingInfo; -NM_GOBJECT_PROPERTIES_DEFINE (NMSetting, - PROP_NAME, -); +NM_GOBJECT_PROPERTIES_DEFINE(NMSetting, PROP_NAME, ); typedef struct { - GenData *gendata; + GenData *gendata; } NMSettingPrivate; -G_DEFINE_ABSTRACT_TYPE (NMSetting, nm_setting, G_TYPE_OBJECT) +G_DEFINE_ABSTRACT_TYPE(NMSetting, nm_setting, G_TYPE_OBJECT) -#define NM_SETTING_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING, NMSettingPrivate)) +#define NM_SETTING_GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE((o), NM_TYPE_SETTING, NMSettingPrivate)) /*****************************************************************************/ -static GenData *_gendata_hash (NMSetting *setting, gboolean create_if_necessary); +static GenData *_gendata_hash(NMSetting *setting, gboolean create_if_necessary); /*****************************************************************************/ static NMSettingPriority -_get_base_type_priority (const NMMetaSettingInfo *setting_info, - GType gtype) +_get_base_type_priority(const NMMetaSettingInfo *setting_info, GType gtype) { - /* Historical oddity: PPPoE is a base-type even though it's not - * priority 1. It needs to be sorted *after* lower-level stuff like - * Wi-Fi security or 802.1x for secrets, but it's still allowed as a - * base type. - */ + /* Historical oddity: PPPoE is a base-type even though it's not + * priority 1. It needs to be sorted *after* lower-level stuff like + * Wi-Fi security or 802.1x for secrets, but it's still allowed as a + * base type. + */ - if (setting_info) { - if ( NM_IN_SET (setting_info->setting_priority, - NM_SETTING_PRIORITY_HW_BASE, - NM_SETTING_PRIORITY_HW_NON_BASE) - || gtype == NM_TYPE_SETTING_PPPOE) - return setting_info->setting_priority; - } + if (setting_info) { + if (NM_IN_SET(setting_info->setting_priority, + NM_SETTING_PRIORITY_HW_BASE, + NM_SETTING_PRIORITY_HW_NON_BASE) + || gtype == NM_TYPE_SETTING_PPPOE) + return setting_info->setting_priority; + } - return NM_SETTING_PRIORITY_INVALID; + return NM_SETTING_PRIORITY_INVALID; } NMSettingPriority -_nm_setting_get_setting_priority (NMSetting *setting) +_nm_setting_get_setting_priority(NMSetting *setting) { - const NMMetaSettingInfo *setting_info; + const NMMetaSettingInfo *setting_info; - g_return_val_if_fail (NM_IS_SETTING (setting), NM_SETTING_PRIORITY_INVALID); + g_return_val_if_fail(NM_IS_SETTING(setting), NM_SETTING_PRIORITY_INVALID); - setting_info = NM_SETTING_GET_CLASS (setting)->setting_info; - return setting_info ? setting_info->setting_priority : NM_SETTING_PRIORITY_INVALID; + setting_info = NM_SETTING_GET_CLASS(setting)->setting_info; + return setting_info ? setting_info->setting_priority : NM_SETTING_PRIORITY_INVALID; } NMSettingPriority -_nm_setting_type_get_base_type_priority (GType type) +_nm_setting_type_get_base_type_priority(GType type) { - return _get_base_type_priority (nm_meta_setting_infos_by_gtype (type), - type); + return _get_base_type_priority(nm_meta_setting_infos_by_gtype(type), type); } NMSettingPriority -_nm_setting_get_base_type_priority (NMSetting *setting) +_nm_setting_get_base_type_priority(NMSetting *setting) { - g_return_val_if_fail (NM_IS_SETTING (setting), NM_SETTING_PRIORITY_INVALID); + g_return_val_if_fail(NM_IS_SETTING(setting), NM_SETTING_PRIORITY_INVALID); - return _get_base_type_priority (NM_SETTING_GET_CLASS (setting)->setting_info, - G_OBJECT_TYPE (setting)); + return _get_base_type_priority(NM_SETTING_GET_CLASS(setting)->setting_info, + G_OBJECT_TYPE(setting)); } /** @@ -116,570 +113,583 @@ _nm_setting_get_base_type_priority (NMSetting *setting) * @name is not recognized. **/ GType -nm_setting_lookup_type (const char *name) +nm_setting_lookup_type(const char *name) { - const NMMetaSettingInfo *setting_info; + const NMMetaSettingInfo *setting_info; - g_return_val_if_fail (name, G_TYPE_INVALID); + g_return_val_if_fail(name, G_TYPE_INVALID); - setting_info = nm_meta_setting_infos_by_name (name); - return setting_info ? setting_info->get_setting_gtype () : G_TYPE_INVALID; + setting_info = nm_meta_setting_infos_by_name(name); + return setting_info ? setting_info->get_setting_gtype() : G_TYPE_INVALID; } int -_nm_setting_compare_priority (gconstpointer a, gconstpointer b) +_nm_setting_compare_priority(gconstpointer a, gconstpointer b) { - NMSettingPriority prio_a, prio_b; + NMSettingPriority prio_a, prio_b; - prio_a = _nm_setting_get_setting_priority ((NMSetting *) a); - prio_b = _nm_setting_get_setting_priority ((NMSetting *) b); + prio_a = _nm_setting_get_setting_priority((NMSetting *) a); + prio_b = _nm_setting_get_setting_priority((NMSetting *) b); - if (prio_a < prio_b) - return -1; - else if (prio_a == prio_b) - return 0; - return 1; + if (prio_a < prio_b) + return -1; + else if (prio_a == prio_b) + return 0; + return 1; } /*****************************************************************************/ gboolean -_nm_setting_slave_type_is_valid (const char *slave_type, const char **out_port_type) -{ - const char *port_type = NULL; - gboolean found = TRUE; - - if (!slave_type) - found = FALSE; - else if (NM_IN_STRSET (slave_type, - NM_SETTING_BOND_SETTING_NAME, - NM_SETTING_VRF_SETTING_NAME)) { - /* pass */ - } - else if (nm_streq (slave_type, NM_SETTING_BRIDGE_SETTING_NAME)) - port_type = NM_SETTING_BRIDGE_PORT_SETTING_NAME; - else if (nm_streq (slave_type, NM_SETTING_OVS_BRIDGE_SETTING_NAME)) - port_type = NM_SETTING_OVS_PORT_SETTING_NAME; - else if (nm_streq (slave_type, NM_SETTING_OVS_PORT_SETTING_NAME)) - port_type = NM_SETTING_OVS_INTERFACE_SETTING_NAME; - else if (nm_streq (slave_type, NM_SETTING_TEAM_SETTING_NAME)) - port_type = NM_SETTING_TEAM_PORT_SETTING_NAME; - else - found = FALSE; - - if (out_port_type) - *out_port_type = port_type; - return found; +_nm_setting_slave_type_is_valid(const char *slave_type, const char **out_port_type) +{ + const char *port_type = NULL; + gboolean found = TRUE; + + if (!slave_type) + found = FALSE; + else if (NM_IN_STRSET(slave_type, NM_SETTING_BOND_SETTING_NAME, NM_SETTING_VRF_SETTING_NAME)) { + /* pass */ + } else if (nm_streq(slave_type, NM_SETTING_BRIDGE_SETTING_NAME)) + port_type = NM_SETTING_BRIDGE_PORT_SETTING_NAME; + else if (nm_streq(slave_type, NM_SETTING_OVS_BRIDGE_SETTING_NAME)) + port_type = NM_SETTING_OVS_PORT_SETTING_NAME; + else if (nm_streq(slave_type, NM_SETTING_OVS_PORT_SETTING_NAME)) + port_type = NM_SETTING_OVS_INTERFACE_SETTING_NAME; + else if (nm_streq(slave_type, NM_SETTING_TEAM_SETTING_NAME)) + port_type = NM_SETTING_TEAM_PORT_SETTING_NAME; + else + found = FALSE; + + if (out_port_type) + *out_port_type = port_type; + return found; } /*****************************************************************************/ static const NMSettInfoProperty * -_nm_sett_info_property_find_in_array (const NMSettInfoProperty *properties, guint len, const char *name) +_nm_sett_info_property_find_in_array(const NMSettInfoProperty *properties, + guint len, + const char * name) { - guint i; + guint i; - for (i = 0; i < len; i++) { - if (nm_streq (name, properties[i].name)) - return &properties[i]; - } - return NULL; + for (i = 0; i < len; i++) { + if (nm_streq(name, properties[i].name)) + return &properties[i]; + } + return NULL; } static GVariant * -_gprop_to_dbus_fcn_bytes (const GValue *val) +_gprop_to_dbus_fcn_bytes(const GValue *val) { - nm_assert (G_VALUE_HOLDS (val, G_TYPE_BYTES)); - return nm_utils_gbytes_to_variant_ay (g_value_get_boxed (val)); + nm_assert(G_VALUE_HOLDS(val, G_TYPE_BYTES)); + return nm_utils_gbytes_to_variant_ay(g_value_get_boxed(val)); } static GVariant * -_gprop_to_dbus_fcn_enum (const GValue *val) +_gprop_to_dbus_fcn_enum(const GValue *val) { - return g_variant_new_int32 (g_value_get_enum (val)); + return g_variant_new_int32(g_value_get_enum(val)); } static GVariant * -_gprop_to_dbus_fcn_flags (const GValue *val) +_gprop_to_dbus_fcn_flags(const GValue *val) { - return g_variant_new_uint32 (g_value_get_flags (val)); + return g_variant_new_uint32(g_value_get_flags(val)); } gboolean -_nm_properties_override_assert (const NMSettInfoProperty *prop_info) +_nm_properties_override_assert(const NMSettInfoProperty *prop_info) { - nm_assert (prop_info); - nm_assert ((!!prop_info->name) != (!!prop_info->param_spec)); - nm_assert (!prop_info->param_spec || !prop_info->name || nm_streq0 (prop_info->name, prop_info->param_spec->name)); + nm_assert(prop_info); + nm_assert((!!prop_info->name) != (!!prop_info->param_spec)); + nm_assert(!prop_info->param_spec || !prop_info->name + || nm_streq0(prop_info->name, prop_info->param_spec->name)); -#define _PROPERT_EXTRA(prop_info, member) \ - ({ \ - const NMSettInfoProperty *_prop_info = (prop_info); \ - \ - (_prop_info->property_type ? _prop_info->property_type->member : 0); \ - }) +#define _PROPERT_EXTRA(prop_info, member) \ + ({ \ + const NMSettInfoProperty *_prop_info = (prop_info); \ + \ + (_prop_info->property_type ? _prop_info->property_type->member : 0); \ + }) - nm_assert (!_PROPERT_EXTRA (prop_info, gprop_from_dbus_fcn) || _PROPERT_EXTRA (prop_info, dbus_type)); - nm_assert (!_PROPERT_EXTRA (prop_info, from_dbus_fcn) || _PROPERT_EXTRA (prop_info, dbus_type)); - nm_assert (!_PROPERT_EXTRA (prop_info, to_dbus_fcn) || _PROPERT_EXTRA (prop_info, dbus_type)); + nm_assert(!_PROPERT_EXTRA(prop_info, gprop_from_dbus_fcn) + || _PROPERT_EXTRA(prop_info, dbus_type)); + nm_assert(!_PROPERT_EXTRA(prop_info, from_dbus_fcn) || _PROPERT_EXTRA(prop_info, dbus_type)); + nm_assert(!_PROPERT_EXTRA(prop_info, to_dbus_fcn) || _PROPERT_EXTRA(prop_info, dbus_type)); - nm_assert (!_PROPERT_EXTRA (prop_info, to_dbus_fcn) || !_PROPERT_EXTRA (prop_info, gprop_to_dbus_fcn)); - nm_assert (!_PROPERT_EXTRA (prop_info, from_dbus_fcn) || !_PROPERT_EXTRA (prop_info, gprop_from_dbus_fcn)); + nm_assert(!_PROPERT_EXTRA(prop_info, to_dbus_fcn) + || !_PROPERT_EXTRA(prop_info, gprop_to_dbus_fcn)); + nm_assert(!_PROPERT_EXTRA(prop_info, from_dbus_fcn) + || !_PROPERT_EXTRA(prop_info, gprop_from_dbus_fcn)); - nm_assert (!_PROPERT_EXTRA (prop_info, gprop_to_dbus_fcn) || prop_info->param_spec); - nm_assert (!_PROPERT_EXTRA (prop_info, gprop_from_dbus_fcn) || prop_info->param_spec); + nm_assert(!_PROPERT_EXTRA(prop_info, gprop_to_dbus_fcn) || prop_info->param_spec); + nm_assert(!_PROPERT_EXTRA(prop_info, gprop_from_dbus_fcn) || prop_info->param_spec); #undef _PROPERT_EXTRA - return TRUE; + return TRUE; } static NMSettInfoSetting _sett_info_settings[_NM_META_SETTING_TYPE_NUM]; const NMSettInfoSetting * -nmtst_sett_info_settings (void) +nmtst_sett_info_settings(void) { - return _sett_info_settings; + return _sett_info_settings; } static int -_property_infos_sort_cmp_setting_connection (gconstpointer p_a, - gconstpointer p_b, - gpointer user_data) -{ - const NMSettInfoProperty *a = *((const NMSettInfoProperty *const*) p_a); - const NMSettInfoProperty *b = *((const NMSettInfoProperty *const*) p_b); - int c_name; - - c_name = strcmp (a->name, b->name); - nm_assert (c_name != 0); - -#define CMP_AND_RETURN(n_a, n_b, name) \ - G_STMT_START { \ - gboolean _is = nm_streq (n_a, ""name); \ - \ - if ( _is \ - || nm_streq (n_b, ""name)) \ - return _is ? -1 : 1; \ - } G_STMT_END - - /* for [connection], report first id, uuid, type in that order. */ - if (c_name != 0) { - CMP_AND_RETURN (a->name, b->name, NM_SETTING_CONNECTION_ID); - CMP_AND_RETURN (a->name, b->name, NM_SETTING_CONNECTION_UUID); - CMP_AND_RETURN (a->name, b->name, NM_SETTING_CONNECTION_TYPE); - } +_property_infos_sort_cmp_setting_connection(gconstpointer p_a, + gconstpointer p_b, + gpointer user_data) +{ + const NMSettInfoProperty *a = *((const NMSettInfoProperty *const *) p_a); + const NMSettInfoProperty *b = *((const NMSettInfoProperty *const *) p_b); + int c_name; + + c_name = strcmp(a->name, b->name); + nm_assert(c_name != 0); + +#define CMP_AND_RETURN(n_a, n_b, name) \ + G_STMT_START \ + { \ + gboolean _is = nm_streq(n_a, "" name); \ + \ + if (_is || nm_streq(n_b, "" name)) \ + return _is ? -1 : 1; \ + } \ + G_STMT_END + + /* for [connection], report first id, uuid, type in that order. */ + if (c_name != 0) { + CMP_AND_RETURN(a->name, b->name, NM_SETTING_CONNECTION_ID); + CMP_AND_RETURN(a->name, b->name, NM_SETTING_CONNECTION_UUID); + CMP_AND_RETURN(a->name, b->name, NM_SETTING_CONNECTION_TYPE); + } #undef CMP_AND_RETURN - return c_name; + return c_name; } -static const NMSettInfoProperty *const* -_property_infos_sort (const NMSettInfoProperty *property_infos, - guint property_infos_len, - NMSettingClass *setting_class) +static const NMSettInfoProperty *const * +_property_infos_sort(const NMSettInfoProperty *property_infos, + guint property_infos_len, + NMSettingClass * setting_class) { - const NMSettInfoProperty **arr; - guint i; + const NMSettInfoProperty **arr; + guint i; #if NM_MORE_ASSERTS > 5 - /* assert that the property names are all unique and sorted. */ - for (i = 0; i < property_infos_len; i++) { - if (property_infos[i].param_spec) - nm_assert (nm_streq (property_infos[i].name, property_infos[i].param_spec->name)); - if (i > 0) - nm_assert (strcmp (property_infos[i - 1].name, property_infos[i].name) < 0); - } + /* assert that the property names are all unique and sorted. */ + for (i = 0; i < property_infos_len; i++) { + if (property_infos[i].param_spec) + nm_assert(nm_streq(property_infos[i].name, property_infos[i].param_spec->name)); + if (i > 0) + nm_assert(strcmp(property_infos[i - 1].name, property_infos[i].name) < 0); + } #endif - if (property_infos_len <= 1) - return NULL; - if (G_TYPE_FROM_CLASS (setting_class) != NM_TYPE_SETTING_CONNECTION) { - /* we only do something special for certain setting types. This one, - * has just alphabetical sorting. */ - return NULL; - } + if (property_infos_len <= 1) + return NULL; + if (G_TYPE_FROM_CLASS(setting_class) != NM_TYPE_SETTING_CONNECTION) { + /* we only do something special for certain setting types. This one, + * has just alphabetical sorting. */ + return NULL; + } - arr = g_new (const NMSettInfoProperty *, property_infos_len); - for (i = 0; i < property_infos_len; i++) - arr[i] = &property_infos[i]; + arr = g_new(const NMSettInfoProperty *, property_infos_len); + for (i = 0; i < property_infos_len; i++) + arr[i] = &property_infos[i]; - g_qsort_with_data (arr, - property_infos_len, - sizeof (const NMSettInfoProperty *), - _property_infos_sort_cmp_setting_connection, - NULL); - return arr; + g_qsort_with_data(arr, + property_infos_len, + sizeof(const NMSettInfoProperty *), + _property_infos_sort_cmp_setting_connection, + NULL); + return arr; } void -_nm_setting_class_commit_full (NMSettingClass *setting_class, - NMMetaSettingType meta_type, - const NMSettInfoSettDetail *detail, - GArray *properties_override) +_nm_setting_class_commit_full(NMSettingClass * setting_class, + NMMetaSettingType meta_type, + const NMSettInfoSettDetail *detail, + GArray * properties_override) { - NMSettInfoSetting *sett_info; - gs_free GParamSpec **property_specs = NULL; - guint i, n_property_specs, override_len; + NMSettInfoSetting *sett_info; + gs_free GParamSpec **property_specs = NULL; + guint i, n_property_specs, override_len; - nm_assert (NM_IS_SETTING_CLASS (setting_class)); - nm_assert (!setting_class->setting_info); + nm_assert(NM_IS_SETTING_CLASS(setting_class)); + nm_assert(!setting_class->setting_info); - nm_assert (meta_type < G_N_ELEMENTS (_sett_info_settings)); + nm_assert(meta_type < G_N_ELEMENTS(_sett_info_settings)); - sett_info = &_sett_info_settings[meta_type]; + sett_info = &_sett_info_settings[meta_type]; - nm_assert (!sett_info->setting_class); - nm_assert (!sett_info->property_infos_len); - nm_assert (!sett_info->property_infos); + nm_assert(!sett_info->setting_class); + nm_assert(!sett_info->property_infos_len); + nm_assert(!sett_info->property_infos); - if (!properties_override) { - override_len = 0; - properties_override = _nm_sett_info_property_override_create_array (); - } else - override_len = properties_override->len; + if (!properties_override) { + override_len = 0; + properties_override = _nm_sett_info_property_override_create_array(); + } else + override_len = properties_override->len; - property_specs = g_object_class_list_properties (G_OBJECT_CLASS (setting_class), - &n_property_specs); + property_specs = + g_object_class_list_properties(G_OBJECT_CLASS(setting_class), &n_property_specs); - for (i = 0; i < properties_override->len; i++) { - NMSettInfoProperty *p = &g_array_index (properties_override, NMSettInfoProperty, i); + for (i = 0; i < properties_override->len; i++) { + NMSettInfoProperty *p = &g_array_index(properties_override, NMSettInfoProperty, i); - nm_assert ((!!p->name) != (!!p->param_spec)); + nm_assert((!!p->name) != (!!p->param_spec)); - if (!p->name) { - nm_assert (p->param_spec); - p->name = p->param_spec->name; - } else - nm_assert (!p->param_spec); - } + if (!p->name) { + nm_assert(p->param_spec); + p->name = p->param_spec->name; + } else + nm_assert(!p->param_spec); + } #if NM_MORE_ASSERTS > 10 - /* assert that properties_override is constructed consistently. */ - for (i = 0; i < override_len; i++) { - const NMSettInfoProperty *p = &g_array_index (properties_override, NMSettInfoProperty, i); - gboolean found = FALSE; - guint j; - - nm_assert (!_nm_sett_info_property_find_in_array ((NMSettInfoProperty *) properties_override->data, - i, - p->name)); - for (j = 0; j < n_property_specs; j++) { - if (!nm_streq (property_specs[j]->name, p->name)) - continue; - nm_assert (!found); - found = TRUE; - nm_assert (p->param_spec == property_specs[j]); - } - nm_assert (found == (p->param_spec != NULL)); - } + /* assert that properties_override is constructed consistently. */ + for (i = 0; i < override_len; i++) { + const NMSettInfoProperty *p = &g_array_index(properties_override, NMSettInfoProperty, i); + gboolean found = FALSE; + guint j; + + nm_assert( + !_nm_sett_info_property_find_in_array((NMSettInfoProperty *) properties_override->data, + i, + p->name)); + for (j = 0; j < n_property_specs; j++) { + if (!nm_streq(property_specs[j]->name, p->name)) + continue; + nm_assert(!found); + found = TRUE; + nm_assert(p->param_spec == property_specs[j]); + } + nm_assert(found == (p->param_spec != NULL)); + } #endif - for (i = 0; i < n_property_specs; i++) { - const char *name = property_specs[i]->name; - NMSettInfoProperty *p; - - if (_nm_sett_info_property_find_in_array ((NMSettInfoProperty *) properties_override->data, - override_len, - name)) - continue; - - g_array_set_size (properties_override, properties_override->len + 1); - p = &g_array_index (properties_override, NMSettInfoProperty, properties_override->len - 1); - memset (p, 0, sizeof (*p)); - p->name = name; - p->param_spec = property_specs[i]; - } - - for (i = 0; i < properties_override->len; i++) { - NMSettInfoProperty *p = &g_array_index (properties_override, NMSettInfoProperty, i); - GType vtype; - - if (p->property_type) - goto has_property_type; - - nm_assert (p->param_spec); - - vtype = p->param_spec->value_type; - if (vtype == G_TYPE_BOOLEAN) - p->property_type = NM_SETT_INFO_PROPERT_TYPE (.dbus_type = G_VARIANT_TYPE_BOOLEAN); - else if (vtype == G_TYPE_UCHAR) - p->property_type = NM_SETT_INFO_PROPERT_TYPE (.dbus_type = G_VARIANT_TYPE_BYTE); - else if (vtype == G_TYPE_INT) - p->property_type = &nm_sett_info_propert_type_plain_i; - else if (vtype == G_TYPE_UINT) - p->property_type = &nm_sett_info_propert_type_plain_u; - else if (vtype == G_TYPE_INT64) - p->property_type = NM_SETT_INFO_PROPERT_TYPE (.dbus_type = G_VARIANT_TYPE_INT64); - else if (vtype == G_TYPE_UINT64) - p->property_type = NM_SETT_INFO_PROPERT_TYPE (.dbus_type = G_VARIANT_TYPE_UINT64); - else if (vtype == G_TYPE_STRING) - p->property_type = NM_SETT_INFO_PROPERT_TYPE (.dbus_type = G_VARIANT_TYPE_STRING); - else if (vtype == G_TYPE_DOUBLE) - p->property_type = NM_SETT_INFO_PROPERT_TYPE (.dbus_type = G_VARIANT_TYPE_DOUBLE); - else if (vtype == G_TYPE_STRV) - p->property_type = NM_SETT_INFO_PROPERT_TYPE (.dbus_type = G_VARIANT_TYPE_STRING_ARRAY); - else if (vtype == G_TYPE_BYTES) { - p->property_type = NM_SETT_INFO_PROPERT_TYPE (.dbus_type = G_VARIANT_TYPE_BYTESTRING, - .gprop_to_dbus_fcn = _gprop_to_dbus_fcn_bytes); - } else if (g_type_is_a (vtype, G_TYPE_ENUM)) { - p->property_type = NM_SETT_INFO_PROPERT_TYPE (.dbus_type = G_VARIANT_TYPE_INT32, - .gprop_to_dbus_fcn = _gprop_to_dbus_fcn_enum); - } else if (g_type_is_a (vtype, G_TYPE_FLAGS)) { - p->property_type = NM_SETT_INFO_PROPERT_TYPE (.dbus_type = G_VARIANT_TYPE_UINT32, - .gprop_to_dbus_fcn = _gprop_to_dbus_fcn_flags); - } else - nm_assert_not_reached (); + for (i = 0; i < n_property_specs; i++) { + const char * name = property_specs[i]->name; + NMSettInfoProperty *p; + + if (_nm_sett_info_property_find_in_array((NMSettInfoProperty *) properties_override->data, + override_len, + name)) + continue; + + g_array_set_size(properties_override, properties_override->len + 1); + p = &g_array_index(properties_override, NMSettInfoProperty, properties_override->len - 1); + memset(p, 0, sizeof(*p)); + p->name = name; + p->param_spec = property_specs[i]; + } + + for (i = 0; i < properties_override->len; i++) { + NMSettInfoProperty *p = &g_array_index(properties_override, NMSettInfoProperty, i); + GType vtype; + + if (p->property_type) + goto has_property_type; + + nm_assert(p->param_spec); + + vtype = p->param_spec->value_type; + if (vtype == G_TYPE_BOOLEAN) + p->property_type = NM_SETT_INFO_PROPERT_TYPE(.dbus_type = G_VARIANT_TYPE_BOOLEAN); + else if (vtype == G_TYPE_UCHAR) + p->property_type = NM_SETT_INFO_PROPERT_TYPE(.dbus_type = G_VARIANT_TYPE_BYTE); + else if (vtype == G_TYPE_INT) + p->property_type = &nm_sett_info_propert_type_plain_i; + else if (vtype == G_TYPE_UINT) + p->property_type = &nm_sett_info_propert_type_plain_u; + else if (vtype == G_TYPE_INT64) + p->property_type = NM_SETT_INFO_PROPERT_TYPE(.dbus_type = G_VARIANT_TYPE_INT64); + else if (vtype == G_TYPE_UINT64) + p->property_type = NM_SETT_INFO_PROPERT_TYPE(.dbus_type = G_VARIANT_TYPE_UINT64); + else if (vtype == G_TYPE_STRING) + p->property_type = NM_SETT_INFO_PROPERT_TYPE(.dbus_type = G_VARIANT_TYPE_STRING); + else if (vtype == G_TYPE_DOUBLE) + p->property_type = NM_SETT_INFO_PROPERT_TYPE(.dbus_type = G_VARIANT_TYPE_DOUBLE); + else if (vtype == G_TYPE_STRV) + p->property_type = NM_SETT_INFO_PROPERT_TYPE(.dbus_type = G_VARIANT_TYPE_STRING_ARRAY); + else if (vtype == G_TYPE_BYTES) { + p->property_type = + NM_SETT_INFO_PROPERT_TYPE(.dbus_type = G_VARIANT_TYPE_BYTESTRING, + .gprop_to_dbus_fcn = _gprop_to_dbus_fcn_bytes); + } else if (g_type_is_a(vtype, G_TYPE_ENUM)) { + p->property_type = + NM_SETT_INFO_PROPERT_TYPE(.dbus_type = G_VARIANT_TYPE_INT32, + .gprop_to_dbus_fcn = _gprop_to_dbus_fcn_enum); + } else if (g_type_is_a(vtype, G_TYPE_FLAGS)) { + p->property_type = + NM_SETT_INFO_PROPERT_TYPE(.dbus_type = G_VARIANT_TYPE_UINT32, + .gprop_to_dbus_fcn = _gprop_to_dbus_fcn_flags); + } else + nm_assert_not_reached(); has_property_type: - nm_assert (p->property_type); - nm_assert (p->property_type->dbus_type); - nm_assert (g_variant_type_string_is_valid ((const char *) p->property_type->dbus_type)); - } + nm_assert(p->property_type); + nm_assert(p->property_type->dbus_type); + nm_assert(g_variant_type_string_is_valid((const char *) p->property_type->dbus_type)); + } - G_STATIC_ASSERT_EXPR (G_STRUCT_OFFSET (NMSettInfoProperty, name) == 0); - g_array_sort (properties_override, nm_strcmp_p); + G_STATIC_ASSERT_EXPR(G_STRUCT_OFFSET(NMSettInfoProperty, name) == 0); + g_array_sort(properties_override, nm_strcmp_p); - setting_class->setting_info = &nm_meta_setting_infos[meta_type]; - sett_info->setting_class = setting_class; - if (detail) - sett_info->detail = *detail; - nm_assert (properties_override->len > 0); - sett_info->property_infos_len = properties_override->len; - sett_info->property_infos = nm_memdup (properties_override->data, sizeof (NMSettInfoProperty) * properties_override->len); + setting_class->setting_info = &nm_meta_setting_infos[meta_type]; + sett_info->setting_class = setting_class; + if (detail) + sett_info->detail = *detail; + nm_assert(properties_override->len > 0); + sett_info->property_infos_len = properties_override->len; + sett_info->property_infos = + nm_memdup(properties_override->data, sizeof(NMSettInfoProperty) * properties_override->len); - sett_info->property_infos_sorted = _property_infos_sort (sett_info->property_infos, - sett_info->property_infos_len, - setting_class); + sett_info->property_infos_sorted = _property_infos_sort(sett_info->property_infos, + sett_info->property_infos_len, + setting_class); - g_array_free (properties_override, TRUE); + g_array_free(properties_override, TRUE); } const NMSettInfoProperty * -_nm_sett_info_setting_get_property_info (const NMSettInfoSetting *sett_info, - const char *property_name) +_nm_sett_info_setting_get_property_info(const NMSettInfoSetting *sett_info, + const char * property_name) { - const NMSettInfoProperty *property; - gssize idx; + const NMSettInfoProperty *property; + gssize idx; - nm_assert (property_name); + nm_assert(property_name); - if (!sett_info) - return NULL; + if (!sett_info) + return NULL; - G_STATIC_ASSERT_EXPR (G_STRUCT_OFFSET (NMSettInfoProperty, name) == 0); - idx = nm_utils_array_find_binary_search (sett_info->property_infos, - sizeof (NMSettInfoProperty), - sett_info->property_infos_len, - &property_name, - nm_strcmp_p_with_data, - NULL); + G_STATIC_ASSERT_EXPR(G_STRUCT_OFFSET(NMSettInfoProperty, name) == 0); + idx = nm_utils_array_find_binary_search(sett_info->property_infos, + sizeof(NMSettInfoProperty), + sett_info->property_infos_len, + &property_name, + nm_strcmp_p_with_data, + NULL); - if (idx < 0) - return NULL; + if (idx < 0) + return NULL; - property = &sett_info->property_infos[idx]; + property = &sett_info->property_infos[idx]; - nm_assert (idx == 0 || strcmp (property[-1].name, property[0].name) < 0); - nm_assert (idx == sett_info->property_infos_len - 1 || strcmp (property[0].name, property[1].name) < 0); + nm_assert(idx == 0 || strcmp(property[-1].name, property[0].name) < 0); + nm_assert(idx == sett_info->property_infos_len - 1 + || strcmp(property[0].name, property[1].name) < 0); - return property; + return property; } const NMSettInfoSetting * -_nm_setting_class_get_sett_info (NMSettingClass *setting_class) +_nm_setting_class_get_sett_info(NMSettingClass *setting_class) { - const NMSettInfoSetting *sett_info; + const NMSettInfoSetting *sett_info; - if ( !NM_IS_SETTING_CLASS (setting_class) - || !setting_class->setting_info) - return NULL; + if (!NM_IS_SETTING_CLASS(setting_class) || !setting_class->setting_info) + return NULL; - nm_assert (setting_class->setting_info->meta_type < G_N_ELEMENTS (_sett_info_settings)); - sett_info = &_sett_info_settings[setting_class->setting_info->meta_type]; - nm_assert (sett_info->setting_class == setting_class); - return sett_info; + nm_assert(setting_class->setting_info->meta_type < G_N_ELEMENTS(_sett_info_settings)); + sett_info = &_sett_info_settings[setting_class->setting_info->meta_type]; + nm_assert(sett_info->setting_class == setting_class); + return sett_info; } /*****************************************************************************/ void -_nm_setting_emit_property_changed (NMSetting *setting) -{ - /* Some settings have "properties" that are not implemented as GObject properties. - * - * For example: - * - * - gendata-base settings like NMSettingEthtool. Here properties are just - * GVariant values in the gendata hash. - * - * - NMSettingWireGuard's peers are not backed by a GObject property. Instead - * there is C-API to access/modify peers. - * - * We still want to emit property-changed notifications for such properties, - * in particular because NMConnection registers to such signals to re-emit - * it as NM_CONNECTION_CHANGED signal. In fact, there are unlikely any other - * uses of such a property-changed signal, because generally it doesn't make - * too much sense. - * - * So, instead of adding yet another (artificial) signal "setting-changed", - * hijack the "notify" signal and just notify about changes of the "name". - * Of course, the "name" doesn't really ever change, because it's tied to - * the GObject's type. - */ - _notify (setting, PROP_NAME); +_nm_setting_emit_property_changed(NMSetting *setting) +{ + /* Some settings have "properties" that are not implemented as GObject properties. + * + * For example: + * + * - gendata-base settings like NMSettingEthtool. Here properties are just + * GVariant values in the gendata hash. + * + * - NMSettingWireGuard's peers are not backed by a GObject property. Instead + * there is C-API to access/modify peers. + * + * We still want to emit property-changed notifications for such properties, + * in particular because NMConnection registers to such signals to re-emit + * it as NM_CONNECTION_CHANGED signal. In fact, there are unlikely any other + * uses of such a property-changed signal, because generally it doesn't make + * too much sense. + * + * So, instead of adding yet another (artificial) signal "setting-changed", + * hijack the "notify" signal and just notify about changes of the "name". + * Of course, the "name" doesn't really ever change, because it's tied to + * the GObject's type. + */ + _notify(setting, PROP_NAME); } /*****************************************************************************/ gboolean -_nm_setting_use_legacy_property (NMSetting *setting, - GVariant *connection_dict, - const char *legacy_property, - const char *new_property) -{ - GVariant *setting_dict, *value; - - setting_dict = g_variant_lookup_value (connection_dict, nm_setting_get_name (NM_SETTING (setting)), NM_VARIANT_TYPE_SETTING); - g_return_val_if_fail (setting_dict != NULL, FALSE); - - /* If the new property isn't set, we have to use the legacy property. */ - value = g_variant_lookup_value (setting_dict, new_property, NULL); - if (!value) { - g_variant_unref (setting_dict); - return TRUE; - } - g_variant_unref (value); - - /* Otherwise, clients always prefer new properties sent from the daemon. */ - if (!_nm_utils_is_manager_process) { - g_variant_unref (setting_dict); - return FALSE; - } - - /* The daemon prefers the legacy property if it exists. */ - value = g_variant_lookup_value (setting_dict, legacy_property, NULL); - g_variant_unref (setting_dict); - - if (value) { - g_variant_unref (value); - return TRUE; - } else - return FALSE; +_nm_setting_use_legacy_property(NMSetting * setting, + GVariant * connection_dict, + const char *legacy_property, + const char *new_property) +{ + GVariant *setting_dict, *value; + + setting_dict = g_variant_lookup_value(connection_dict, + nm_setting_get_name(NM_SETTING(setting)), + NM_VARIANT_TYPE_SETTING); + g_return_val_if_fail(setting_dict != NULL, FALSE); + + /* If the new property isn't set, we have to use the legacy property. */ + value = g_variant_lookup_value(setting_dict, new_property, NULL); + if (!value) { + g_variant_unref(setting_dict); + return TRUE; + } + g_variant_unref(value); + + /* Otherwise, clients always prefer new properties sent from the daemon. */ + if (!_nm_utils_is_manager_process) { + g_variant_unref(setting_dict); + return FALSE; + } + + /* The daemon prefers the legacy property if it exists. */ + value = g_variant_lookup_value(setting_dict, legacy_property, NULL); + g_variant_unref(setting_dict); + + if (value) { + g_variant_unref(value); + return TRUE; + } else + return FALSE; } /*****************************************************************************/ static GVariant * -property_to_dbus (const NMSettInfoSetting *sett_info, - guint property_idx, - NMConnection *connection, - NMSetting *setting, - NMConnectionSerializationFlags flags, - const NMConnectionSerializationOptions *options, - gboolean ignore_flags, - gboolean ignore_default) -{ - const NMSettInfoProperty *property = &sett_info->property_infos[property_idx]; - GVariant *variant; - - nm_assert (property->property_type->dbus_type); - - if (!property->param_spec) { - if (!property->property_type->to_dbus_fcn) - return NULL; - } else if ( !ignore_flags - && !NM_FLAGS_HAS (property->param_spec->flags, NM_SETTING_PARAM_TO_DBUS_IGNORE_FLAGS)) { - if (!NM_FLAGS_HAS (property->param_spec->flags, G_PARAM_WRITABLE)) - return NULL; - - if ( NM_FLAGS_HAS (property->param_spec->flags, NM_SETTING_PARAM_LEGACY) - && !_nm_utils_is_manager_process) - return NULL; - - if (NM_FLAGS_HAS (property->param_spec->flags, NM_SETTING_PARAM_SECRET)) { - if (NM_FLAGS_HAS (flags, NM_CONNECTION_SERIALIZE_NO_SECRETS)) - return NULL; - - if (NM_FLAGS_HAS (flags, NM_CONNECTION_SERIALIZE_WITH_SECRETS_AGENT_OWNED)) { - NMSettingSecretFlags f; - - /* see also _nm_connection_serialize_secrets() */ - if (!nm_setting_get_secret_flags (setting, property->param_spec->name, &f, NULL)) - return NULL; - if (!NM_FLAGS_HAS (f, NM_SETTING_SECRET_FLAG_AGENT_OWNED)) - return NULL; - } - } else { - if (NM_FLAGS_HAS (flags, NM_CONNECTION_SERIALIZE_ONLY_SECRETS)) - return NULL; - } - } - - if (property->property_type->to_dbus_fcn) { - variant = property->property_type->to_dbus_fcn (sett_info, property_idx, connection, setting, flags, options); - nm_g_variant_take_ref (variant); - } else { - nm_auto_unset_gvalue GValue prop_value = { 0, }; - - nm_assert (property->param_spec); - - g_value_init (&prop_value, property->param_spec->value_type); - - g_object_get_property (G_OBJECT (setting), property->param_spec->name, &prop_value); - - if ( ignore_default - && g_param_value_defaults (property->param_spec, &prop_value)) - return NULL; - - if (property->property_type->gprop_to_dbus_fcn) { - variant = property->property_type->gprop_to_dbus_fcn (&prop_value); - nm_g_variant_take_ref (variant); - } else - variant = g_dbus_gvalue_to_gvariant (&prop_value, property->property_type->dbus_type); - } - - nm_assert (!variant || !g_variant_is_floating (variant)); - nm_assert (!variant || g_variant_is_of_type (variant, property->property_type->dbus_type)); - - return variant; +property_to_dbus(const NMSettInfoSetting * sett_info, + guint property_idx, + NMConnection * connection, + NMSetting * setting, + NMConnectionSerializationFlags flags, + const NMConnectionSerializationOptions *options, + gboolean ignore_flags, + gboolean ignore_default) +{ + const NMSettInfoProperty *property = &sett_info->property_infos[property_idx]; + GVariant * variant; + + nm_assert(property->property_type->dbus_type); + + if (!property->param_spec) { + if (!property->property_type->to_dbus_fcn) + return NULL; + } else if (!ignore_flags + && !NM_FLAGS_HAS(property->param_spec->flags, + NM_SETTING_PARAM_TO_DBUS_IGNORE_FLAGS)) { + if (!NM_FLAGS_HAS(property->param_spec->flags, G_PARAM_WRITABLE)) + return NULL; + + if (NM_FLAGS_HAS(property->param_spec->flags, NM_SETTING_PARAM_LEGACY) + && !_nm_utils_is_manager_process) + return NULL; + + if (NM_FLAGS_HAS(property->param_spec->flags, NM_SETTING_PARAM_SECRET)) { + if (NM_FLAGS_HAS(flags, NM_CONNECTION_SERIALIZE_NO_SECRETS)) + return NULL; + + if (NM_FLAGS_HAS(flags, NM_CONNECTION_SERIALIZE_WITH_SECRETS_AGENT_OWNED)) { + NMSettingSecretFlags f; + + /* see also _nm_connection_serialize_secrets() */ + if (!nm_setting_get_secret_flags(setting, property->param_spec->name, &f, NULL)) + return NULL; + if (!NM_FLAGS_HAS(f, NM_SETTING_SECRET_FLAG_AGENT_OWNED)) + return NULL; + } + } else { + if (NM_FLAGS_HAS(flags, NM_CONNECTION_SERIALIZE_ONLY_SECRETS)) + return NULL; + } + } + + if (property->property_type->to_dbus_fcn) { + variant = property->property_type + ->to_dbus_fcn(sett_info, property_idx, connection, setting, flags, options); + nm_g_variant_take_ref(variant); + } else { + nm_auto_unset_gvalue GValue prop_value = { + 0, + }; + + nm_assert(property->param_spec); + + g_value_init(&prop_value, property->param_spec->value_type); + + g_object_get_property(G_OBJECT(setting), property->param_spec->name, &prop_value); + + if (ignore_default && g_param_value_defaults(property->param_spec, &prop_value)) + return NULL; + + if (property->property_type->gprop_to_dbus_fcn) { + variant = property->property_type->gprop_to_dbus_fcn(&prop_value); + nm_g_variant_take_ref(variant); + } else + variant = g_dbus_gvalue_to_gvariant(&prop_value, property->property_type->dbus_type); + } + + nm_assert(!variant || !g_variant_is_floating(variant)); + nm_assert(!variant || g_variant_is_of_type(variant, property->property_type->dbus_type)); + + return variant; } static gboolean -set_property_from_dbus (const NMSettInfoProperty *property, - GVariant *src_value, - GValue *dst_value) +set_property_from_dbus(const NMSettInfoProperty *property, GVariant *src_value, GValue *dst_value) { - nm_assert (property->param_spec); - nm_assert (property->property_type->dbus_type); + nm_assert(property->param_spec); + nm_assert(property->property_type->dbus_type); - if (property->property_type->gprop_from_dbus_fcn) { - if (!g_variant_type_equal (g_variant_get_type (src_value), property->property_type->dbus_type)) - return FALSE; - property->property_type->gprop_from_dbus_fcn (src_value, dst_value); - } else if (dst_value->g_type == G_TYPE_BYTES) { - if (!g_variant_is_of_type (src_value, G_VARIANT_TYPE_BYTESTRING)) - return FALSE; + if (property->property_type->gprop_from_dbus_fcn) { + if (!g_variant_type_equal(g_variant_get_type(src_value), + property->property_type->dbus_type)) + return FALSE; + property->property_type->gprop_from_dbus_fcn(src_value, dst_value); + } else if (dst_value->g_type == G_TYPE_BYTES) { + if (!g_variant_is_of_type(src_value, G_VARIANT_TYPE_BYTESTRING)) + return FALSE; - _nm_utils_bytes_from_dbus (src_value, dst_value); - } else { - GValue tmp = G_VALUE_INIT; + _nm_utils_bytes_from_dbus(src_value, dst_value); + } else { + GValue tmp = G_VALUE_INIT; - g_dbus_gvariant_to_gvalue (src_value, &tmp); - if (G_VALUE_TYPE (&tmp) == G_VALUE_TYPE (dst_value)) - *dst_value = tmp; - else { - gboolean success; + g_dbus_gvariant_to_gvalue(src_value, &tmp); + if (G_VALUE_TYPE(&tmp) == G_VALUE_TYPE(dst_value)) + *dst_value = tmp; + else { + gboolean success; - success = g_value_transform (&tmp, dst_value); - g_value_unset (&tmp); - if (!success) - return FALSE; - } - } + success = g_value_transform(&tmp, dst_value); + g_value_unset(&tmp); + if (!success) + return FALSE; + } + } - return TRUE; + return TRUE; } /** @@ -698,45 +708,43 @@ set_property_from_dbus (const NMSettInfoProperty *property, * properties **/ GVariant * -_nm_setting_to_dbus (NMSetting *setting, - NMConnection *connection, - NMConnectionSerializationFlags flags, - const NMConnectionSerializationOptions *options) +_nm_setting_to_dbus(NMSetting * setting, + NMConnection * connection, + NMConnectionSerializationFlags flags, + const NMConnectionSerializationOptions *options) { - NMSettingPrivate *priv; - GVariantBuilder builder; - const NMSettInfoSetting *sett_info; - guint n_properties, i; - const char *const*gendata_keys; + NMSettingPrivate * priv; + GVariantBuilder builder; + const NMSettInfoSetting *sett_info; + guint n_properties, i; + const char *const * gendata_keys; - g_return_val_if_fail (NM_IS_SETTING (setting), NULL); + g_return_val_if_fail(NM_IS_SETTING(setting), NULL); - priv = NM_SETTING_GET_PRIVATE (setting); + priv = NM_SETTING_GET_PRIVATE(setting); - g_variant_builder_init (&builder, NM_VARIANT_TYPE_SETTING); + g_variant_builder_init(&builder, NM_VARIANT_TYPE_SETTING); - n_properties = _nm_setting_option_get_all (setting, &gendata_keys, NULL); - for (i = 0; i < n_properties; i++) { - g_variant_builder_add (&builder, - "{sv}", - gendata_keys[i], - g_hash_table_lookup (priv->gendata->hash, gendata_keys[i])); - } + n_properties = _nm_setting_option_get_all(setting, &gendata_keys, NULL); + for (i = 0; i < n_properties; i++) { + g_variant_builder_add(&builder, + "{sv}", + gendata_keys[i], + g_hash_table_lookup(priv->gendata->hash, gendata_keys[i])); + } - sett_info = _nm_setting_class_get_sett_info (NM_SETTING_GET_CLASS (setting)); - for (i = 0; i < sett_info->property_infos_len; i++) { - gs_unref_variant GVariant *dbus_value = NULL; + sett_info = _nm_setting_class_get_sett_info(NM_SETTING_GET_CLASS(setting)); + for (i = 0; i < sett_info->property_infos_len; i++) { + gs_unref_variant GVariant *dbus_value = NULL; - dbus_value = property_to_dbus (sett_info, i, connection, setting, flags, options, FALSE, TRUE); - if (dbus_value) { - g_variant_builder_add (&builder, - "{sv}", - sett_info->property_infos[i].name, - dbus_value); - } - } + dbus_value = + property_to_dbus(sett_info, i, connection, setting, flags, options, FALSE, TRUE); + if (dbus_value) { + g_variant_builder_add(&builder, "{sv}", sett_info->property_infos[i].name, dbus_value); + } + } - return g_variant_builder_end (&builder); + return g_variant_builder_end(&builder); } /** @@ -760,230 +768,240 @@ _nm_setting_to_dbus (NMSetting *setting, * hash table, or %NULL if @setting_hash could not be deserialized. **/ NMSetting * -_nm_setting_new_from_dbus (GType setting_type, - GVariant *setting_dict, - GVariant *connection_dict, - NMSettingParseFlags parse_flags, - GError **error) -{ - gs_unref_ptrarray GPtrArray *keys_keep_variant = NULL; - gs_unref_object NMSetting *setting = NULL; - gs_unref_hashtable GHashTable *keys = NULL; - - g_return_val_if_fail (G_TYPE_IS_INSTANTIATABLE (setting_type), NULL); - g_return_val_if_fail (g_variant_is_of_type (setting_dict, NM_VARIANT_TYPE_SETTING), NULL); - - nm_assert (!NM_FLAGS_ANY (parse_flags, ~NM_SETTING_PARSE_FLAGS_ALL)); - nm_assert (!NM_FLAGS_ALL (parse_flags, NM_SETTING_PARSE_FLAGS_STRICT | NM_SETTING_PARSE_FLAGS_BEST_EFFORT)); - - /* connection_dict is not technically optional, but some tests in test-general - * don't bother with it in cases where they know it's not needed. - */ - if (connection_dict) - g_return_val_if_fail (g_variant_is_of_type (connection_dict, NM_VARIANT_TYPE_CONNECTION), NULL); - - /* Build the setting object from the properties we know about; we assume - * that any propreties in @setting_dict that we don't know about can - * either be ignored or else has a backward-compatibility equivalent - * that we do know about. - */ - setting = (NMSetting *) g_object_new (setting_type, NULL); - - if (NM_FLAGS_HAS (parse_flags, NM_SETTING_PARSE_FLAGS_STRICT)) { - GVariantIter iter; - GVariant *entry, *entry_key; - const char *key; - - keys_keep_variant = g_ptr_array_new_with_free_func ((GDestroyNotify) g_variant_unref); - keys = g_hash_table_new (nm_str_hash, g_str_equal); - - g_variant_iter_init (&iter, setting_dict); - while ((entry = g_variant_iter_next_value (&iter))) { - entry_key = g_variant_get_child_value (entry, 0); - g_ptr_array_add (keys_keep_variant, entry_key); - g_variant_unref (entry); - - key = g_variant_get_string (entry_key, NULL); - if (!g_hash_table_add (keys, (char *) key)) { - g_set_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_SETTING, - _("duplicate property")); - g_prefix_error (error, "%s.%s: ", nm_setting_get_name (setting), key); - return NULL; - } - } - } - - if (!NM_SETTING_GET_CLASS (setting)->init_from_dbus (setting, - keys, - setting_dict, - connection_dict, - parse_flags, - error)) - return NULL; - - if ( NM_FLAGS_HAS (parse_flags, NM_SETTING_PARSE_FLAGS_STRICT) - && g_hash_table_size (keys) > 0) { - GHashTableIter iter; - const char *key; - - g_hash_table_iter_init (&iter, keys); - if (g_hash_table_iter_next (&iter, (gpointer *) &key, NULL)) { - g_set_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, - _("unknown property")); - g_prefix_error (error, "%s.%s: ", nm_setting_get_name (setting), key); - return NULL; - } - } - - return g_steal_pointer (&setting); +_nm_setting_new_from_dbus(GType setting_type, + GVariant * setting_dict, + GVariant * connection_dict, + NMSettingParseFlags parse_flags, + GError ** error) +{ + gs_unref_ptrarray GPtrArray *keys_keep_variant = NULL; + gs_unref_object NMSetting *setting = NULL; + gs_unref_hashtable GHashTable *keys = NULL; + + g_return_val_if_fail(G_TYPE_IS_INSTANTIATABLE(setting_type), NULL); + g_return_val_if_fail(g_variant_is_of_type(setting_dict, NM_VARIANT_TYPE_SETTING), NULL); + + nm_assert(!NM_FLAGS_ANY(parse_flags, ~NM_SETTING_PARSE_FLAGS_ALL)); + nm_assert(!NM_FLAGS_ALL(parse_flags, + NM_SETTING_PARSE_FLAGS_STRICT | NM_SETTING_PARSE_FLAGS_BEST_EFFORT)); + + /* connection_dict is not technically optional, but some tests in test-general + * don't bother with it in cases where they know it's not needed. + */ + if (connection_dict) + g_return_val_if_fail(g_variant_is_of_type(connection_dict, NM_VARIANT_TYPE_CONNECTION), + NULL); + + /* Build the setting object from the properties we know about; we assume + * that any propreties in @setting_dict that we don't know about can + * either be ignored or else has a backward-compatibility equivalent + * that we do know about. + */ + setting = (NMSetting *) g_object_new(setting_type, NULL); + + if (NM_FLAGS_HAS(parse_flags, NM_SETTING_PARSE_FLAGS_STRICT)) { + GVariantIter iter; + GVariant * entry, *entry_key; + const char * key; + + keys_keep_variant = g_ptr_array_new_with_free_func((GDestroyNotify) g_variant_unref); + keys = g_hash_table_new(nm_str_hash, g_str_equal); + + g_variant_iter_init(&iter, setting_dict); + while ((entry = g_variant_iter_next_value(&iter))) { + entry_key = g_variant_get_child_value(entry, 0); + g_ptr_array_add(keys_keep_variant, entry_key); + g_variant_unref(entry); + + key = g_variant_get_string(entry_key, NULL); + if (!g_hash_table_add(keys, (char *) key)) { + g_set_error(error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_INVALID_SETTING, + _("duplicate property")); + g_prefix_error(error, "%s.%s: ", nm_setting_get_name(setting), key); + return NULL; + } + } + } + + if (!NM_SETTING_GET_CLASS(setting) + ->init_from_dbus(setting, keys, setting_dict, connection_dict, parse_flags, error)) + return NULL; + + if (NM_FLAGS_HAS(parse_flags, NM_SETTING_PARSE_FLAGS_STRICT) && g_hash_table_size(keys) > 0) { + GHashTableIter iter; + const char * key; + + g_hash_table_iter_init(&iter, keys); + if (g_hash_table_iter_next(&iter, (gpointer *) &key, NULL)) { + g_set_error(error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("unknown property")); + g_prefix_error(error, "%s.%s: ", nm_setting_get_name(setting), key); + return NULL; + } + } + + return g_steal_pointer(&setting); } static gboolean -init_from_dbus (NMSetting *setting, - GHashTable *keys, - GVariant *setting_dict, - GVariant *connection_dict, - guint /* NMSettingParseFlags */ parse_flags, - GError **error) -{ - const NMSettInfoSetting *sett_info; - - guint i; - - nm_assert (NM_IS_SETTING (setting)); - nm_assert (!NM_FLAGS_ANY (parse_flags, ~NM_SETTING_PARSE_FLAGS_ALL)); - nm_assert (!NM_FLAGS_ALL (parse_flags, NM_SETTING_PARSE_FLAGS_STRICT | NM_SETTING_PARSE_FLAGS_BEST_EFFORT)); - - sett_info = _nm_setting_class_get_sett_info (NM_SETTING_GET_CLASS (setting)); - - if (sett_info->detail.gendata_info) { - GHashTable *hash; - GVariantIter iter; - char *key; - GVariant *val; - - hash = _gendata_hash (setting, TRUE)->hash; - - g_variant_iter_init (&iter, setting_dict); - while (g_variant_iter_next (&iter, "{sv}", &key, &val)) { - g_hash_table_insert (hash, - key, - val); - if (keys) - g_hash_table_remove (keys, key); - } - - _nm_setting_option_notify (setting, TRUE); - - /* Currently, only NMSettingEthtool supports gendata based options, and - * that one has no other properties (except "name"). That means, we - * consumed all options above. - * - * In the future it may be interesting to have settings that are both - * based on gendata and regular properties. In that case, we would need - * to handle this case differently. */ - nm_assert (nm_streq (G_OBJECT_TYPE_NAME (setting), "NMSettingEthtool")); - nm_assert (sett_info->property_infos_len == 1); - - return TRUE; - } - - for (i = 0; i < sett_info->property_infos_len; i++) { - const NMSettInfoProperty *property_info = &sett_info->property_infos[i]; - gs_unref_variant GVariant *value = NULL; - gs_free_error GError *local = NULL; - - if ( property_info->param_spec - && !(property_info->param_spec->flags & G_PARAM_WRITABLE)) - continue; - - value = g_variant_lookup_value (setting_dict, property_info->name, NULL); - - if ( value - && keys) - g_hash_table_remove (keys, property_info->name); - - if ( value - && property_info->property_type->from_dbus_fcn) { - - if (!g_variant_type_equal (g_variant_get_type (value), property_info->property_type->dbus_type)) { - /* for backward behavior, fail unless best-effort is chosen. */ - if (NM_FLAGS_HAS (parse_flags, NM_SETTING_PARSE_FLAGS_BEST_EFFORT)) - continue; - g_set_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, - _("can't set property of type '%s' from value of type '%s'"), - property_info->property_type->dbus_type ? - g_variant_type_peek_string (property_info->property_type->dbus_type) : - property_info->param_spec ? - g_type_name (property_info->param_spec->value_type) : "(unknown)", - g_variant_get_type_string (value)); - g_prefix_error (error, "%s.%s: ", nm_setting_get_name (setting), property_info->name); - return FALSE; - } - - if (!property_info->property_type->from_dbus_fcn (setting, - connection_dict, - property_info->name, - value, - parse_flags, - &local)) { - if (!NM_FLAGS_HAS (parse_flags, NM_SETTING_PARSE_FLAGS_STRICT)) - continue; - g_set_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, - _("failed to set property: %s"), - local->message); - g_prefix_error (error, "%s.%s: ", nm_setting_get_name (setting), property_info->name); - return FALSE; - } - } else if ( !value - && property_info->property_type->missing_from_dbus_fcn) { - if (!property_info->property_type->missing_from_dbus_fcn (setting, - connection_dict, - property_info->name, - parse_flags, - &local)) { - if (!NM_FLAGS_HAS (parse_flags, NM_SETTING_PARSE_FLAGS_STRICT)) - continue; - g_set_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, - _("failed to set property: %s"), - local->message); - g_prefix_error (error, "%s.%s: ", nm_setting_get_name (setting), property_info->name); - return FALSE; - } - } else if ( value - && property_info->param_spec) { - nm_auto_unset_gvalue GValue object_value = G_VALUE_INIT; - - g_value_init (&object_value, property_info->param_spec->value_type); - if (!set_property_from_dbus (property_info, value, &object_value)) { - /* for backward behavior, fail unless best-effort is chosen. */ - if (NM_FLAGS_HAS (parse_flags, NM_SETTING_PARSE_FLAGS_BEST_EFFORT)) - continue; - g_set_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, - _("can't set property of type '%s' from value of type '%s'"), - property_info->property_type->dbus_type - ? g_variant_type_peek_string (property_info->property_type->dbus_type) - : ( property_info->param_spec - ? g_type_name (property_info->param_spec->value_type) - : "(unknown)"), - g_variant_get_type_string (value)); - g_prefix_error (error, "%s.%s: ", nm_setting_get_name (setting), property_info->name); - return FALSE; - } - - if (!nm_g_object_set_property (G_OBJECT (setting), property_info->param_spec->name, &object_value, &local)) { - if (!NM_FLAGS_HAS (parse_flags, NM_SETTING_PARSE_FLAGS_STRICT)) - continue; - g_set_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, - _("can not set property: %s"), - local->message); - g_prefix_error (error, "%s.%s: ", nm_setting_get_name (setting), property_info->name); - return FALSE; - } - } - } - - return TRUE; +init_from_dbus(NMSetting * setting, + GHashTable * keys, + GVariant * setting_dict, + GVariant * connection_dict, + guint /* NMSettingParseFlags */ parse_flags, + GError ** error) +{ + const NMSettInfoSetting *sett_info; + + guint i; + + nm_assert(NM_IS_SETTING(setting)); + nm_assert(!NM_FLAGS_ANY(parse_flags, ~NM_SETTING_PARSE_FLAGS_ALL)); + nm_assert(!NM_FLAGS_ALL(parse_flags, + NM_SETTING_PARSE_FLAGS_STRICT | NM_SETTING_PARSE_FLAGS_BEST_EFFORT)); + + sett_info = _nm_setting_class_get_sett_info(NM_SETTING_GET_CLASS(setting)); + + if (sett_info->detail.gendata_info) { + GHashTable * hash; + GVariantIter iter; + char * key; + GVariant * val; + + hash = _gendata_hash(setting, TRUE)->hash; + + g_variant_iter_init(&iter, setting_dict); + while (g_variant_iter_next(&iter, "{sv}", &key, &val)) { + g_hash_table_insert(hash, key, val); + if (keys) + g_hash_table_remove(keys, key); + } + + _nm_setting_option_notify(setting, TRUE); + + /* Currently, only NMSettingEthtool supports gendata based options, and + * that one has no other properties (except "name"). That means, we + * consumed all options above. + * + * In the future it may be interesting to have settings that are both + * based on gendata and regular properties. In that case, we would need + * to handle this case differently. */ + nm_assert(nm_streq(G_OBJECT_TYPE_NAME(setting), "NMSettingEthtool")); + nm_assert(sett_info->property_infos_len == 1); + + return TRUE; + } + + for (i = 0; i < sett_info->property_infos_len; i++) { + const NMSettInfoProperty *property_info = &sett_info->property_infos[i]; + gs_unref_variant GVariant *value = NULL; + gs_free_error GError *local = NULL; + + if (property_info->param_spec && !(property_info->param_spec->flags & G_PARAM_WRITABLE)) + continue; + + value = g_variant_lookup_value(setting_dict, property_info->name, NULL); + + if (value && keys) + g_hash_table_remove(keys, property_info->name); + + if (value && property_info->property_type->from_dbus_fcn) { + if (!g_variant_type_equal(g_variant_get_type(value), + property_info->property_type->dbus_type)) { + /* for backward behavior, fail unless best-effort is chosen. */ + if (NM_FLAGS_HAS(parse_flags, NM_SETTING_PARSE_FLAGS_BEST_EFFORT)) + continue; + g_set_error( + error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("can't set property of type '%s' from value of type '%s'"), + property_info->property_type->dbus_type + ? g_variant_type_peek_string(property_info->property_type->dbus_type) + : property_info->param_spec ? g_type_name(property_info->param_spec->value_type) + : "(unknown)", + g_variant_get_type_string(value)); + g_prefix_error(error, "%s.%s: ", nm_setting_get_name(setting), property_info->name); + return FALSE; + } + + if (!property_info->property_type->from_dbus_fcn(setting, + connection_dict, + property_info->name, + value, + parse_flags, + &local)) { + if (!NM_FLAGS_HAS(parse_flags, NM_SETTING_PARSE_FLAGS_STRICT)) + continue; + g_set_error(error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("failed to set property: %s"), + local->message); + g_prefix_error(error, "%s.%s: ", nm_setting_get_name(setting), property_info->name); + return FALSE; + } + } else if (!value && property_info->property_type->missing_from_dbus_fcn) { + if (!property_info->property_type->missing_from_dbus_fcn(setting, + connection_dict, + property_info->name, + parse_flags, + &local)) { + if (!NM_FLAGS_HAS(parse_flags, NM_SETTING_PARSE_FLAGS_STRICT)) + continue; + g_set_error(error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("failed to set property: %s"), + local->message); + g_prefix_error(error, "%s.%s: ", nm_setting_get_name(setting), property_info->name); + return FALSE; + } + } else if (value && property_info->param_spec) { + nm_auto_unset_gvalue GValue object_value = G_VALUE_INIT; + + g_value_init(&object_value, property_info->param_spec->value_type); + if (!set_property_from_dbus(property_info, value, &object_value)) { + /* for backward behavior, fail unless best-effort is chosen. */ + if (NM_FLAGS_HAS(parse_flags, NM_SETTING_PARSE_FLAGS_BEST_EFFORT)) + continue; + g_set_error( + error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("can't set property of type '%s' from value of type '%s'"), + property_info->property_type->dbus_type + ? g_variant_type_peek_string(property_info->property_type->dbus_type) + : (property_info->param_spec + ? g_type_name(property_info->param_spec->value_type) + : "(unknown)"), + g_variant_get_type_string(value)); + g_prefix_error(error, "%s.%s: ", nm_setting_get_name(setting), property_info->name); + return FALSE; + } + + if (!nm_g_object_set_property(G_OBJECT(setting), + property_info->param_spec->name, + &object_value, + &local)) { + if (!NM_FLAGS_HAS(parse_flags, NM_SETTING_PARSE_FLAGS_STRICT)) + continue; + g_set_error(error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("can not set property: %s"), + local->message); + g_prefix_error(error, "%s.%s: ", nm_setting_get_name(setting), property_info->name); + return FALSE; + } + } + } + + return TRUE; } /** @@ -997,132 +1015,123 @@ init_from_dbus (NMSetting *setting, * Returns: the D-Bus marshalling type of @property on @setting. */ const GVariantType * -nm_setting_get_dbus_property_type (NMSetting *setting, - const char *property_name) +nm_setting_get_dbus_property_type(NMSetting *setting, const char *property_name) { - const NMSettInfoProperty *property; + const NMSettInfoProperty *property; - g_return_val_if_fail (NM_IS_SETTING (setting), NULL); - g_return_val_if_fail (property_name != NULL, NULL); + g_return_val_if_fail(NM_IS_SETTING(setting), NULL); + g_return_val_if_fail(property_name != NULL, NULL); - property = _nm_setting_class_get_property_info (NM_SETTING_GET_CLASS (setting), property_name); + property = _nm_setting_class_get_property_info(NM_SETTING_GET_CLASS(setting), property_name); - g_return_val_if_fail (property != NULL, NULL); + g_return_val_if_fail(property != NULL, NULL); - nm_assert (property->property_type); - nm_assert (g_variant_type_string_is_valid ((const char *) property->property_type->dbus_type)); + nm_assert(property->property_type); + nm_assert(g_variant_type_string_is_valid((const char *) property->property_type->dbus_type)); - return property->property_type->dbus_type; + return property->property_type->dbus_type; } gboolean -_nm_setting_get_property (NMSetting *setting, const char *property_name, GValue *value) +_nm_setting_get_property(NMSetting *setting, const char *property_name, GValue *value) { - const NMSettInfoSetting *sett_info; - const NMSettInfoProperty *property_info; + const NMSettInfoSetting * sett_info; + const NMSettInfoProperty *property_info; - g_return_val_if_fail (NM_IS_SETTING (setting), FALSE); - g_return_val_if_fail (property_name, FALSE); - g_return_val_if_fail (value, FALSE); + g_return_val_if_fail(NM_IS_SETTING(setting), FALSE); + g_return_val_if_fail(property_name, FALSE); + g_return_val_if_fail(value, FALSE); - sett_info = _nm_setting_class_get_sett_info (NM_SETTING_GET_CLASS (setting)); + sett_info = _nm_setting_class_get_sett_info(NM_SETTING_GET_CLASS(setting)); - if (sett_info->detail.gendata_info) { - GVariant *variant; - GenData *gendata = _gendata_hash (setting, FALSE); + if (sett_info->detail.gendata_info) { + GVariant *variant; + GenData * gendata = _gendata_hash(setting, FALSE); - variant = gendata ? g_hash_table_lookup (gendata->hash, property_name) : NULL; + variant = gendata ? g_hash_table_lookup(gendata->hash, property_name) : NULL; - if (!variant) { - g_value_unset (value); - return FALSE; - } + if (!variant) { + g_value_unset(value); + return FALSE; + } - g_value_init (value, G_TYPE_VARIANT); - g_value_set_variant (value, variant); - return TRUE; - } + g_value_init(value, G_TYPE_VARIANT); + g_value_set_variant(value, variant); + return TRUE; + } - property_info = _nm_sett_info_setting_get_property_info (sett_info, property_name); - if ( !property_info - || !property_info->param_spec) { - g_value_unset (value); - return FALSE; - } + property_info = _nm_sett_info_setting_get_property_info(sett_info, property_name); + if (!property_info || !property_info->param_spec) { + g_value_unset(value); + return FALSE; + } - g_value_init (value, property_info->param_spec->value_type); - g_object_get_property (G_OBJECT (setting), property_name, value); - return TRUE; + g_value_init(value, property_info->param_spec->value_type); + g_object_get_property(G_OBJECT(setting), property_name, value); + return TRUE; } static void -_gobject_copy_property (GObject *src, - GObject *dst, - const char *property_name, - GType gtype) +_gobject_copy_property(GObject *src, GObject *dst, const char *property_name, GType gtype) { - nm_auto_unset_gvalue GValue value = G_VALUE_INIT; + nm_auto_unset_gvalue GValue value = G_VALUE_INIT; - nm_assert (G_IS_OBJECT (src)); - nm_assert (G_IS_OBJECT (dst)); + nm_assert(G_IS_OBJECT(src)); + nm_assert(G_IS_OBJECT(dst)); - g_value_init (&value, gtype); - g_object_get_property (src, property_name, &value); - g_object_set_property (dst, property_name, &value); + g_value_init(&value, gtype); + g_object_get_property(src, property_name, &value); + g_object_set_property(dst, property_name, &value); } static void -duplicate_copy_properties (const NMSettInfoSetting *sett_info, - NMSetting *src, - NMSetting *dst) -{ - if (sett_info->detail.gendata_info) { - GenData *gendata = _gendata_hash (src, FALSE); - - nm_assert (!_gendata_hash (dst, FALSE)); - - if ( gendata - && g_hash_table_size (gendata->hash) > 0) { - GHashTableIter iter; - GHashTable *h = _gendata_hash (dst, TRUE)->hash; - const char *key; - GVariant *val; - - g_hash_table_iter_init (&iter, gendata->hash); - while (g_hash_table_iter_next (&iter, (gpointer *) &key, (gpointer *) &val)) { - g_hash_table_insert (h, - g_strdup (key), - g_variant_ref (val)); - } - } - } - - if (sett_info->property_infos_len > 0) { - gboolean frozen = FALSE; - guint i; - - for (i = 0; i < sett_info->property_infos_len; i++) { - const NMSettInfoProperty *property_info = &sett_info->property_infos[i]; - - if (property_info->param_spec) { - if ((property_info->param_spec->flags & (G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)) != G_PARAM_WRITABLE) - continue; - - if (!frozen) { - g_object_freeze_notify (G_OBJECT (dst)); - frozen = TRUE; - } - _gobject_copy_property (G_OBJECT (src), - G_OBJECT (dst), - property_info->param_spec->name, - G_PARAM_SPEC_VALUE_TYPE (property_info->param_spec)); - continue; - } - } - - if (frozen) - g_object_thaw_notify (G_OBJECT (dst)); - } +duplicate_copy_properties(const NMSettInfoSetting *sett_info, NMSetting *src, NMSetting *dst) +{ + if (sett_info->detail.gendata_info) { + GenData *gendata = _gendata_hash(src, FALSE); + + nm_assert(!_gendata_hash(dst, FALSE)); + + if (gendata && g_hash_table_size(gendata->hash) > 0) { + GHashTableIter iter; + GHashTable * h = _gendata_hash(dst, TRUE)->hash; + const char * key; + GVariant * val; + + g_hash_table_iter_init(&iter, gendata->hash); + while (g_hash_table_iter_next(&iter, (gpointer *) &key, (gpointer *) &val)) { + g_hash_table_insert(h, g_strdup(key), g_variant_ref(val)); + } + } + } + + if (sett_info->property_infos_len > 0) { + gboolean frozen = FALSE; + guint i; + + for (i = 0; i < sett_info->property_infos_len; i++) { + const NMSettInfoProperty *property_info = &sett_info->property_infos[i]; + + if (property_info->param_spec) { + if ((property_info->param_spec->flags & (G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)) + != G_PARAM_WRITABLE) + continue; + + if (!frozen) { + g_object_freeze_notify(G_OBJECT(dst)); + frozen = TRUE; + } + _gobject_copy_property(G_OBJECT(src), + G_OBJECT(dst), + property_info->param_spec->name, + G_PARAM_SPEC_VALUE_TYPE(property_info->param_spec)); + continue; + } + } + + if (frozen) + g_object_thaw_notify(G_OBJECT(dst)); + } } /** @@ -1135,25 +1144,25 @@ duplicate_copy_properties (const NMSettInfoSetting *sett_info, * source #NMSetting **/ NMSetting * -nm_setting_duplicate (NMSetting *setting) +nm_setting_duplicate(NMSetting *setting) { - const NMSettInfoSetting *sett_info; - NMSettingClass *klass; - NMSetting *dst; + const NMSettInfoSetting *sett_info; + NMSettingClass * klass; + NMSetting * dst; - g_return_val_if_fail (NM_IS_SETTING (setting), NULL); + g_return_val_if_fail(NM_IS_SETTING(setting), NULL); - klass = NM_SETTING_GET_CLASS (setting); - nm_assert (NM_IS_SETTING_CLASS (klass)); - nm_assert (klass->duplicate_copy_properties); + klass = NM_SETTING_GET_CLASS(setting); + nm_assert(NM_IS_SETTING_CLASS(klass)); + nm_assert(klass->duplicate_copy_properties); - dst = g_object_new (G_TYPE_FROM_CLASS (klass), NULL); + dst = g_object_new(G_TYPE_FROM_CLASS(klass), NULL); - sett_info = _nm_setting_class_get_sett_info (klass); - nm_assert (sett_info); + sett_info = _nm_setting_class_get_sett_info(klass); + nm_assert(sett_info); - klass->duplicate_copy_properties (sett_info, setting, dst); - return dst; + klass->duplicate_copy_properties(sett_info, setting, dst); + return dst; } /** @@ -1166,14 +1175,14 @@ nm_setting_duplicate (NMSetting *setting) * like 'ppp' or 'wireless' or 'wired'. **/ const char * -nm_setting_get_name (NMSetting *setting) +nm_setting_get_name(NMSetting *setting) { - const NMMetaSettingInfo *setting_info; + const NMMetaSettingInfo *setting_info; - g_return_val_if_fail (NM_IS_SETTING (setting), NULL); + g_return_val_if_fail(NM_IS_SETTING(setting), NULL); - setting_info = NM_SETTING_GET_CLASS (setting)->setting_info; - return setting_info ? setting_info->setting_name : NULL; + setting_info = NM_SETTING_GET_CLASS(setting)->setting_info; + return setting_info ? setting_info->setting_name : NULL; } /** @@ -1191,27 +1200,27 @@ nm_setting_get_name (NMSetting *setting) * Returns: %TRUE if the setting is valid, %FALSE if it is not **/ gboolean -nm_setting_verify (NMSetting *setting, NMConnection *connection, GError **error) +nm_setting_verify(NMSetting *setting, NMConnection *connection, GError **error) { - NMSettingVerifyResult result = _nm_setting_verify (setting, connection, error); + NMSettingVerifyResult result = _nm_setting_verify(setting, connection, error); - if (result == NM_SETTING_VERIFY_NORMALIZABLE) - g_clear_error (error); + if (result == NM_SETTING_VERIFY_NORMALIZABLE) + g_clear_error(error); - return result == NM_SETTING_VERIFY_SUCCESS || result == NM_SETTING_VERIFY_NORMALIZABLE; + return result == NM_SETTING_VERIFY_SUCCESS || result == NM_SETTING_VERIFY_NORMALIZABLE; } NMSettingVerifyResult -_nm_setting_verify (NMSetting *setting, NMConnection *connection, 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); + 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, connection, error); + if (NM_SETTING_GET_CLASS(setting)->verify) + return NM_SETTING_GET_CLASS(setting)->verify(setting, connection, error); - return NM_SETTING_VERIFY_SUCCESS; + return NM_SETTING_VERIFY_SUCCESS; } /** @@ -1232,194 +1241,200 @@ _nm_setting_verify (NMSetting *setting, NMConnection *connection, GError **error * Since: 1.2 **/ gboolean -nm_setting_verify_secrets (NMSetting *setting, NMConnection *connection, GError **error) +nm_setting_verify_secrets(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); + 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_secrets) - return NM_SETTING_GET_CLASS (setting)->verify_secrets (setting, connection, error); + if (NM_SETTING_GET_CLASS(setting)->verify_secrets) + return NM_SETTING_GET_CLASS(setting)->verify_secrets(setting, connection, error); - return NM_SETTING_VERIFY_SUCCESS; + return NM_SETTING_VERIFY_SUCCESS; } gboolean -_nm_setting_verify_secret_string (const char *str, - const char *setting_name, - const char *property, - GError **error) -{ - if (str && !*str) { - g_set_error_literal (error, - NM_CONNECTION_ERROR, - NM_CONNECTION_ERROR_INVALID_PROPERTY, - _("property is empty")); - g_prefix_error (error, "%s.%s: ", setting_name, property); - return FALSE; - } - return TRUE; +_nm_setting_verify_secret_string(const char *str, + const char *setting_name, + const char *property, + GError ** error) +{ + if (str && !*str) { + g_set_error_literal(error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("property is empty")); + g_prefix_error(error, "%s.%s: ", setting_name, property); + return FALSE; + } + return TRUE; } gboolean -_nm_setting_should_compare_secret_property (NMSetting *setting, - NMSetting *other, - const char *secret_name, - NMSettingCompareFlags flags) -{ - NMSettingSecretFlags a_secret_flags = NM_SETTING_SECRET_FLAG_NONE; - NMSettingSecretFlags b_secret_flags = NM_SETTING_SECRET_FLAG_NONE; - - nm_assert (NM_IS_SETTING (setting)); - nm_assert (!other || G_OBJECT_TYPE (setting) == G_OBJECT_TYPE (other)); - - /* secret_name must be a valid secret for @setting. */ - nm_assert (nm_setting_get_secret_flags (setting, secret_name, NULL, NULL)); - - if (!NM_FLAGS_ANY (flags, NM_SETTING_COMPARE_FLAG_IGNORE_AGENT_OWNED_SECRETS - | NM_SETTING_COMPARE_FLAG_IGNORE_NOT_SAVED_SECRETS)) - return TRUE; - - nm_setting_get_secret_flags (setting, secret_name, &a_secret_flags, NULL); - if (other) { - if (!nm_setting_get_secret_flags (other, secret_name, &b_secret_flags, NULL)) { - /* secret-name may not be a valid secret for @other. That is fine, we ignore that - * and treat @b_secret_flags as NM_SETTING_SECRET_FLAG_NONE. - * - * This can happen with VPN secrets, where the caller knows that @secret_name - * is a secret for setting, but it may not be a secret for @other. Accept that. - * - * Mark @other as missing. */ - other = NULL; - } - } - - /* when @setting has the secret-flags that should be ignored, - * we skip the comparison if: - * - * - @other is not present, - * - @other does not have a secret named @secret_name - * - @other also has the secret flat to be ignored. - * - * This makes the check symmetric (aside the fact that @setting must - * have the secret while @other may not -- which is asymmetric). */ - if ( NM_FLAGS_HAS (flags, NM_SETTING_COMPARE_FLAG_IGNORE_AGENT_OWNED_SECRETS) - && NM_FLAGS_HAS (a_secret_flags, NM_SETTING_SECRET_FLAG_AGENT_OWNED) - && ( !other - || NM_FLAGS_HAS (b_secret_flags, NM_SETTING_SECRET_FLAG_AGENT_OWNED))) - return FALSE; - - if ( NM_FLAGS_HAS (flags, NM_SETTING_COMPARE_FLAG_IGNORE_NOT_SAVED_SECRETS) - && NM_FLAGS_HAS (a_secret_flags, NM_SETTING_SECRET_FLAG_NOT_SAVED) - && ( !other - || NM_FLAGS_HAS (b_secret_flags, NM_SETTING_SECRET_FLAG_NOT_SAVED))) - return FALSE; - - return TRUE; +_nm_setting_should_compare_secret_property(NMSetting * setting, + NMSetting * other, + const char * secret_name, + NMSettingCompareFlags flags) +{ + NMSettingSecretFlags a_secret_flags = NM_SETTING_SECRET_FLAG_NONE; + NMSettingSecretFlags b_secret_flags = NM_SETTING_SECRET_FLAG_NONE; + + nm_assert(NM_IS_SETTING(setting)); + nm_assert(!other || G_OBJECT_TYPE(setting) == G_OBJECT_TYPE(other)); + + /* secret_name must be a valid secret for @setting. */ + nm_assert(nm_setting_get_secret_flags(setting, secret_name, NULL, NULL)); + + if (!NM_FLAGS_ANY(flags, + NM_SETTING_COMPARE_FLAG_IGNORE_AGENT_OWNED_SECRETS + | NM_SETTING_COMPARE_FLAG_IGNORE_NOT_SAVED_SECRETS)) + return TRUE; + + nm_setting_get_secret_flags(setting, secret_name, &a_secret_flags, NULL); + if (other) { + if (!nm_setting_get_secret_flags(other, secret_name, &b_secret_flags, NULL)) { + /* secret-name may not be a valid secret for @other. That is fine, we ignore that + * and treat @b_secret_flags as NM_SETTING_SECRET_FLAG_NONE. + * + * This can happen with VPN secrets, where the caller knows that @secret_name + * is a secret for setting, but it may not be a secret for @other. Accept that. + * + * Mark @other as missing. */ + other = NULL; + } + } + + /* when @setting has the secret-flags that should be ignored, + * we skip the comparison if: + * + * - @other is not present, + * - @other does not have a secret named @secret_name + * - @other also has the secret flat to be ignored. + * + * This makes the check symmetric (aside the fact that @setting must + * have the secret while @other may not -- which is asymmetric). */ + if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_IGNORE_AGENT_OWNED_SECRETS) + && NM_FLAGS_HAS(a_secret_flags, NM_SETTING_SECRET_FLAG_AGENT_OWNED) + && (!other || NM_FLAGS_HAS(b_secret_flags, NM_SETTING_SECRET_FLAG_AGENT_OWNED))) + return FALSE; + + if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_IGNORE_NOT_SAVED_SECRETS) + && NM_FLAGS_HAS(a_secret_flags, NM_SETTING_SECRET_FLAG_NOT_SAVED) + && (!other || NM_FLAGS_HAS(b_secret_flags, NM_SETTING_SECRET_FLAG_NOT_SAVED))) + return FALSE; + + return TRUE; } static NMTernary -compare_property (const NMSettInfoSetting *sett_info, - guint property_idx, - NMConnection *con_a, - NMSetting *set_a, - NMConnection *con_b, - NMSetting *set_b, - NMSettingCompareFlags flags) -{ - const NMSettInfoProperty *property_info = &sett_info->property_infos[property_idx]; - const GParamSpec *param_spec = property_info->param_spec; - - if (!param_spec) - return NM_TERNARY_DEFAULT; - - if ( NM_FLAGS_HAS (flags, NM_SETTING_COMPARE_FLAG_FUZZY) - && NM_FLAGS_ANY (param_spec->flags, NM_SETTING_PARAM_FUZZY_IGNORE | NM_SETTING_PARAM_SECRET)) - return NM_TERNARY_DEFAULT; - - if ( NM_FLAGS_HAS (flags, NM_SETTING_COMPARE_FLAG_INFERRABLE) - && !NM_FLAGS_HAS (param_spec->flags, NM_SETTING_PARAM_INFERRABLE)) - return NM_TERNARY_DEFAULT; - - if ( NM_FLAGS_HAS (flags, NM_SETTING_COMPARE_FLAG_IGNORE_REAPPLY_IMMEDIATELY) - && NM_FLAGS_HAS (param_spec->flags, NM_SETTING_PARAM_REAPPLY_IMMEDIATELY)) - return NM_TERNARY_DEFAULT; - - if ( NM_FLAGS_HAS (flags, NM_SETTING_COMPARE_FLAG_IGNORE_SECRETS) - && NM_FLAGS_HAS (param_spec->flags, NM_SETTING_PARAM_SECRET)) - return NM_TERNARY_DEFAULT; - - if (nm_streq (param_spec->name, NM_SETTING_NAME)) - return NM_TERNARY_DEFAULT; - - if ( NM_FLAGS_HAS (param_spec->flags, NM_SETTING_PARAM_SECRET) - && !_nm_setting_should_compare_secret_property (set_a, - set_b, - param_spec->name, - flags)) - return NM_TERNARY_DEFAULT; - - if (set_b) { - gs_unref_variant GVariant *value1 = NULL; - gs_unref_variant GVariant *value2 = NULL; - - value1 = property_to_dbus (sett_info, property_idx, con_a, set_a, NM_CONNECTION_SERIALIZE_ALL, NULL, TRUE, TRUE); - value2 = property_to_dbus (sett_info, property_idx, con_b, set_b, NM_CONNECTION_SERIALIZE_ALL, NULL, TRUE, TRUE); - if (nm_property_compare (value1, value2) != 0) - return NM_TERNARY_FALSE; - } - - return NM_TERNARY_TRUE; +compare_property(const NMSettInfoSetting *sett_info, + guint property_idx, + NMConnection * con_a, + NMSetting * set_a, + NMConnection * con_b, + NMSetting * set_b, + NMSettingCompareFlags flags) +{ + const NMSettInfoProperty *property_info = &sett_info->property_infos[property_idx]; + const GParamSpec * param_spec = property_info->param_spec; + + if (!param_spec) + return NM_TERNARY_DEFAULT; + + if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_FUZZY) + && NM_FLAGS_ANY(param_spec->flags, NM_SETTING_PARAM_FUZZY_IGNORE | NM_SETTING_PARAM_SECRET)) + return NM_TERNARY_DEFAULT; + + if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_INFERRABLE) + && !NM_FLAGS_HAS(param_spec->flags, NM_SETTING_PARAM_INFERRABLE)) + return NM_TERNARY_DEFAULT; + + if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_IGNORE_REAPPLY_IMMEDIATELY) + && NM_FLAGS_HAS(param_spec->flags, NM_SETTING_PARAM_REAPPLY_IMMEDIATELY)) + return NM_TERNARY_DEFAULT; + + if (NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_IGNORE_SECRETS) + && NM_FLAGS_HAS(param_spec->flags, NM_SETTING_PARAM_SECRET)) + return NM_TERNARY_DEFAULT; + + if (nm_streq(param_spec->name, NM_SETTING_NAME)) + return NM_TERNARY_DEFAULT; + + if (NM_FLAGS_HAS(param_spec->flags, NM_SETTING_PARAM_SECRET) + && !_nm_setting_should_compare_secret_property(set_a, set_b, param_spec->name, flags)) + return NM_TERNARY_DEFAULT; + + if (set_b) { + gs_unref_variant GVariant *value1 = NULL; + gs_unref_variant GVariant *value2 = NULL; + + value1 = property_to_dbus(sett_info, + property_idx, + con_a, + set_a, + NM_CONNECTION_SERIALIZE_ALL, + NULL, + TRUE, + TRUE); + value2 = property_to_dbus(sett_info, + property_idx, + con_b, + set_b, + NM_CONNECTION_SERIALIZE_ALL, + NULL, + TRUE, + TRUE); + if (nm_property_compare(value1, value2) != 0) + return NM_TERNARY_FALSE; + } + + return NM_TERNARY_TRUE; } static NMTernary -_compare_property (const NMSettInfoSetting *sett_info, - guint property_idx, - NMConnection *con_a, - NMSetting *set_a, - NMConnection *con_b, - NMSetting *set_b, - NMSettingCompareFlags flags) -{ - NMTernary compare_result; - - nm_assert (sett_info); - nm_assert (NM_IS_SETTING_CLASS (sett_info->setting_class)); - nm_assert (property_idx < sett_info->property_infos_len); - nm_assert (NM_SETTING_GET_CLASS (set_a) == sett_info->setting_class); - nm_assert (!set_b || NM_SETTING_GET_CLASS (set_b) == sett_info->setting_class); - - compare_result = NM_SETTING_GET_CLASS (set_a)->compare_property (sett_info, - property_idx, - con_a, - set_a, - con_b, - set_b, - flags); - - nm_assert (NM_IN_SET (compare_result, NM_TERNARY_DEFAULT, - NM_TERNARY_FALSE, - NM_TERNARY_TRUE)); - - /* check that the inferable flag and the GObject property flag corresponds. */ - nm_assert ( !NM_FLAGS_HAS (flags, NM_SETTING_COMPARE_FLAG_INFERRABLE) - || !sett_info->property_infos[property_idx].param_spec - || NM_FLAGS_HAS (sett_info->property_infos[property_idx].param_spec->flags, NM_SETTING_PARAM_INFERRABLE) - || compare_result == NM_TERNARY_DEFAULT); +_compare_property(const NMSettInfoSetting *sett_info, + guint property_idx, + NMConnection * con_a, + NMSetting * set_a, + NMConnection * con_b, + NMSetting * set_b, + NMSettingCompareFlags flags) +{ + NMTernary compare_result; + + nm_assert(sett_info); + nm_assert(NM_IS_SETTING_CLASS(sett_info->setting_class)); + nm_assert(property_idx < sett_info->property_infos_len); + nm_assert(NM_SETTING_GET_CLASS(set_a) == sett_info->setting_class); + nm_assert(!set_b || NM_SETTING_GET_CLASS(set_b) == sett_info->setting_class); + + compare_result = + NM_SETTING_GET_CLASS(set_a) + ->compare_property(sett_info, property_idx, con_a, set_a, con_b, set_b, flags); + + nm_assert(NM_IN_SET(compare_result, NM_TERNARY_DEFAULT, NM_TERNARY_FALSE, NM_TERNARY_TRUE)); + + /* check that the inferable flag and the GObject property flag corresponds. */ + nm_assert(!NM_FLAGS_HAS(flags, NM_SETTING_COMPARE_FLAG_INFERRABLE) + || !sett_info->property_infos[property_idx].param_spec + || NM_FLAGS_HAS(sett_info->property_infos[property_idx].param_spec->flags, + NM_SETTING_PARAM_INFERRABLE) + || compare_result == NM_TERNARY_DEFAULT); #if NM_MORE_ASSERTS > 10 - /* assert that compare_property() is symeric. */ - nm_assert ( !set_b - || compare_result == NM_SETTING_GET_CLASS (set_a)->compare_property (sett_info, - property_idx, - con_b, - set_b, - con_a, - set_a, - flags)); + /* assert that compare_property() is symeric. */ + nm_assert(!set_b + || compare_result + == NM_SETTING_GET_CLASS(set_a)->compare_property(sett_info, + property_idx, + con_b, + set_b, + con_a, + set_a, + flags)); #endif - return compare_result; + return compare_result; } /** @@ -1435,66 +1450,66 @@ _compare_property (const NMSettInfoSetting *sett_info, * Returns: %TRUE if the comparison succeeds, %FALSE if it does not **/ gboolean -nm_setting_compare (NMSetting *a, - NMSetting *b, - NMSettingCompareFlags flags) +nm_setting_compare(NMSetting *a, NMSetting *b, NMSettingCompareFlags flags) { - return _nm_setting_compare (NULL, a, NULL, b, flags); + return _nm_setting_compare(NULL, a, NULL, b, flags); } gboolean -_nm_setting_compare (NMConnection *con_a, - NMSetting *a, - NMConnection *con_b, - NMSetting *b, - NMSettingCompareFlags flags) +_nm_setting_compare(NMConnection * con_a, + NMSetting * a, + NMConnection * con_b, + NMSetting * b, + NMSettingCompareFlags flags) { - const NMSettInfoSetting *sett_info; - guint i; + const NMSettInfoSetting *sett_info; + guint i; - g_return_val_if_fail (NM_IS_SETTING (a), FALSE); - g_return_val_if_fail (NM_IS_SETTING (b), FALSE); + g_return_val_if_fail(NM_IS_SETTING(a), FALSE); + g_return_val_if_fail(NM_IS_SETTING(b), FALSE); - nm_assert (!con_a || NM_IS_CONNECTION (con_a)); - nm_assert (!con_b || NM_IS_CONNECTION (con_b)); + nm_assert(!con_a || NM_IS_CONNECTION(con_a)); + nm_assert(!con_b || NM_IS_CONNECTION(con_b)); - /* First check that both have the same type */ - if (G_OBJECT_TYPE (a) != G_OBJECT_TYPE (b)) - return FALSE; + /* First check that both have the same type */ + if (G_OBJECT_TYPE(a) != G_OBJECT_TYPE(b)) + return FALSE; - sett_info = _nm_setting_class_get_sett_info (NM_SETTING_GET_CLASS (a)); + sett_info = _nm_setting_class_get_sett_info(NM_SETTING_GET_CLASS(a)); - if (sett_info->detail.gendata_info) { - GenData *a_gendata = _gendata_hash (a, FALSE); - GenData *b_gendata = _gendata_hash (b, FALSE); + if (sett_info->detail.gendata_info) { + GenData *a_gendata = _gendata_hash(a, FALSE); + GenData *b_gendata = _gendata_hash(b, FALSE); - return nm_utils_hash_table_equal (a_gendata ? a_gendata->hash : NULL, - b_gendata ? b_gendata->hash : NULL, - TRUE, - g_variant_equal); - } + return nm_utils_hash_table_equal(a_gendata ? a_gendata->hash : NULL, + b_gendata ? b_gendata->hash : NULL, + TRUE, + g_variant_equal); + } - for (i = 0; i < sett_info->property_infos_len; i++) { - if (_compare_property (sett_info, i, con_a, a, con_b, b, flags) == NM_TERNARY_FALSE) - return FALSE; - } + for (i = 0; i < sett_info->property_infos_len; i++) { + if (_compare_property(sett_info, i, con_a, a, con_b, b, flags) == NM_TERNARY_FALSE) + return FALSE; + } - return TRUE; + return TRUE; } static void -_setting_diff_add_result (GHashTable *results, const char *prop_name, NMSettingDiffResult r) +_setting_diff_add_result(GHashTable *results, const char *prop_name, NMSettingDiffResult r) { - void *p; + void *p; - if (r == NM_SETTING_DIFF_RESULT_UNKNOWN) - return; + if (r == NM_SETTING_DIFF_RESULT_UNKNOWN) + return; - if (g_hash_table_lookup_extended (results, prop_name, NULL, &p)) { - if (!NM_FLAGS_ALL ((guint) r, GPOINTER_TO_UINT (p))) - g_hash_table_insert (results, g_strdup (prop_name), GUINT_TO_POINTER (((guint) r) | GPOINTER_TO_UINT (p))); - } else - g_hash_table_insert (results, g_strdup (prop_name), GUINT_TO_POINTER (r)); + if (g_hash_table_lookup_extended(results, prop_name, NULL, &p)) { + if (!NM_FLAGS_ALL((guint) r, GPOINTER_TO_UINT(p))) + g_hash_table_insert(results, + g_strdup(prop_name), + GUINT_TO_POINTER(((guint) r) | GPOINTER_TO_UINT(p))); + } else + g_hash_table_insert(results, g_strdup(prop_name), GUINT_TO_POINTER(r)); } /** @@ -1519,248 +1534,254 @@ _setting_diff_add_result (GHashTable *results, const char *prop_name, NMSettingD * Returns: %TRUE if the settings contain the same values, %FALSE if they do not **/ gboolean -nm_setting_diff (NMSetting *a, - NMSetting *b, - NMSettingCompareFlags flags, - gboolean invert_results, - GHashTable **results) +nm_setting_diff(NMSetting * a, + NMSetting * b, + NMSettingCompareFlags flags, + gboolean invert_results, + GHashTable ** results) { - return _nm_setting_diff (NULL, a, NULL, b, flags, invert_results, results); + return _nm_setting_diff(NULL, a, NULL, b, flags, invert_results, results); } gboolean -_nm_setting_diff (NMConnection *con_a, - NMSetting *a, - NMConnection *con_b, - NMSetting *b, - NMSettingCompareFlags flags, - gboolean invert_results, - GHashTable **results) -{ - const NMSettInfoSetting *sett_info; - guint i; - NMSettingDiffResult a_result = NM_SETTING_DIFF_RESULT_IN_A; - NMSettingDiffResult b_result = NM_SETTING_DIFF_RESULT_IN_B; - NMSettingDiffResult a_result_default = NM_SETTING_DIFF_RESULT_IN_A_DEFAULT; - NMSettingDiffResult b_result_default = NM_SETTING_DIFF_RESULT_IN_B_DEFAULT; - gboolean results_created = FALSE; - gboolean compared_any = FALSE; - gboolean diff_found = FALSE; - - g_return_val_if_fail (results != NULL, FALSE); - g_return_val_if_fail (NM_IS_SETTING (a), FALSE); - if (b) { - g_return_val_if_fail (NM_IS_SETTING (b), FALSE); - g_return_val_if_fail (G_OBJECT_TYPE (a) == G_OBJECT_TYPE (b), FALSE); - } - - nm_assert (!con_a || NM_IS_CONNECTION (con_a)); - nm_assert (!con_b || NM_IS_CONNECTION (con_b)); - - if ((flags & (NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT | NM_SETTING_COMPARE_FLAG_DIFF_RESULT_NO_DEFAULT)) == - (NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT | NM_SETTING_COMPARE_FLAG_DIFF_RESULT_NO_DEFAULT)) { - /* conflicting flags: default to WITH_DEFAULT (clearing NO_DEFAULT). */ - flags &= ~NM_SETTING_COMPARE_FLAG_DIFF_RESULT_NO_DEFAULT; - } - - /* If the caller is calling this function in a pattern like this to get - * complete diffs: - * - * nm_setting_diff (A, B, FALSE, &results); - * nm_setting_diff (B, A, TRUE, &results); - * - * and wants us to invert the results so that the second invocation comes - * out correctly, do that here. - */ - if (invert_results) { - a_result = NM_SETTING_DIFF_RESULT_IN_B; - b_result = NM_SETTING_DIFF_RESULT_IN_A; - a_result_default = NM_SETTING_DIFF_RESULT_IN_B_DEFAULT; - b_result_default = NM_SETTING_DIFF_RESULT_IN_A_DEFAULT; - } - - if (*results == NULL) { - *results = g_hash_table_new_full (nm_str_hash, g_str_equal, g_free, NULL); - results_created = TRUE; - } - - sett_info = _nm_setting_class_get_sett_info (NM_SETTING_GET_CLASS (a)); - - if (sett_info->detail.gendata_info) { - const char *key; - GVariant *val, *val2; - GHashTableIter iter; - GenData *a_gendata = _gendata_hash (a, FALSE); - GenData *b_gendata = b ? _gendata_hash (b, FALSE) : NULL; - - if (!a_gendata || !b_gendata) { - if (a_gendata || b_gendata) { - NMSettingDiffResult one_sided_result; - - one_sided_result = a_gendata ? a_result : b_result; - g_hash_table_iter_init (&iter, a_gendata ? a_gendata->hash : b_gendata->hash); - while (g_hash_table_iter_next (&iter, (gpointer *) &key, NULL)) { - diff_found = TRUE; - _setting_diff_add_result (*results, key, one_sided_result); - } - } - } else { - g_hash_table_iter_init (&iter, a_gendata->hash); - while (g_hash_table_iter_next (&iter, (gpointer *) &key, (gpointer *) &val)) { - val2 = g_hash_table_lookup (b_gendata->hash, key); - compared_any = TRUE; - if ( !val2 - || !g_variant_equal (val, val2)) { - diff_found = TRUE; - _setting_diff_add_result (*results, key, a_result); - } - } - g_hash_table_iter_init (&iter, b_gendata->hash); - while (g_hash_table_iter_next (&iter, (gpointer *) &key, (gpointer *) &val)) { - val2 = g_hash_table_lookup (a_gendata->hash, key); - compared_any = TRUE; - if ( !val2 - || !g_variant_equal (val, val2)) { - diff_found = TRUE; - _setting_diff_add_result (*results, key, b_result); - } - } - } - } else { - for (i = 0; i < sett_info->property_infos_len; i++) { - NMSettingDiffResult r = NM_SETTING_DIFF_RESULT_UNKNOWN; - const NMSettInfoProperty *property_info; - NMTernary compare_result; - GParamSpec *prop_spec; - - compare_result = _compare_property (sett_info, i, con_a, a, con_b, b, flags); - if (compare_result == NM_TERNARY_DEFAULT) - continue; - - if ( NM_FLAGS_ANY (flags, NM_SETTING_COMPARE_FLAG_IGNORE_AGENT_OWNED_SECRETS - | NM_SETTING_COMPARE_FLAG_IGNORE_NOT_SAVED_SECRETS) - && b - && compare_result == NM_TERNARY_FALSE) { - /* we have setting @b and the property is not the same. But we also are instructed - * to ignore secrets based on the flags. - * - * Note that compare_property() called with two settings will ignore secrets - * based on the flags, but it will do so if *both* settings have the flag we - * look for. So that is symmetric behavior and good. - * - * But for the purpose of diff(), we do a asymmetric comparison because and - * we want to skip testing the property if setting @a alone indicates to do - * so. - * - * We need to double-check whether the property should be ignored by - * looking at @a alone. */ - if (_compare_property (sett_info, i, con_a, a, NULL, NULL, flags) == NM_TERNARY_DEFAULT) - continue; - } - - compared_any = TRUE; - - property_info = &sett_info->property_infos[i]; - prop_spec = property_info->param_spec; - - if (b) { - if (compare_result == NM_TERNARY_FALSE) { - if (prop_spec) { - gboolean a_is_default, b_is_default; - GValue value = G_VALUE_INIT; - - g_value_init (&value, prop_spec->value_type); - g_object_get_property (G_OBJECT (a), prop_spec->name, &value); - a_is_default = g_param_value_defaults (prop_spec, &value); - - g_value_reset (&value); - g_object_get_property (G_OBJECT (b), prop_spec->name, &value); - b_is_default = g_param_value_defaults (prop_spec, &value); - - g_value_unset (&value); - if (!NM_FLAGS_HAS (flags, NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT)) { - if (!a_is_default) - r |= a_result; - if (!b_is_default) - r |= b_result; - } else { - r |= a_result | b_result; - if (a_is_default) - r |= a_result_default; - if (b_is_default) - r |= b_result_default; - } - } else - r |= a_result | b_result; - } - } else if ((flags & (NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT | NM_SETTING_COMPARE_FLAG_DIFF_RESULT_NO_DEFAULT)) == 0) - r = a_result; /* only in A */ - else { - if (prop_spec) { - GValue value = G_VALUE_INIT; - - g_value_init (&value, prop_spec->value_type); - g_object_get_property (G_OBJECT (a), prop_spec->name, &value); - if (!g_param_value_defaults (prop_spec, &value)) - r |= a_result; - else if (flags & NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT) - r |= a_result | a_result_default; - - g_value_unset (&value); - } else - r |= a_result; - } - - if (r != NM_SETTING_DIFF_RESULT_UNKNOWN) { - diff_found = TRUE; - _setting_diff_add_result (*results, property_info->name, r); - } - } - } - - if (!compared_any && !b) { - /* special case: the setting has no properties, and the opposite - * setting @b is not given. The settings differ, and we signal that - * by returning an empty results hash. */ - diff_found = TRUE; - } - - if (diff_found) { - /* if there is a difference, we always return FALSE. It also means, we might - * have allocated a new @results hash, and return it to the caller. */ - return FALSE; - } else { - if (results_created) { - /* the allocated hash is unused. Clear it again. */ - g_hash_table_destroy (*results); - *results = NULL; - } else { - /* we found no diff, and return false. However, the input - * @result is returned unmodified. */ - } - return TRUE; - } +_nm_setting_diff(NMConnection * con_a, + NMSetting * a, + NMConnection * con_b, + NMSetting * b, + NMSettingCompareFlags flags, + gboolean invert_results, + GHashTable ** results) +{ + const NMSettInfoSetting *sett_info; + guint i; + NMSettingDiffResult a_result = NM_SETTING_DIFF_RESULT_IN_A; + NMSettingDiffResult b_result = NM_SETTING_DIFF_RESULT_IN_B; + NMSettingDiffResult a_result_default = NM_SETTING_DIFF_RESULT_IN_A_DEFAULT; + NMSettingDiffResult b_result_default = NM_SETTING_DIFF_RESULT_IN_B_DEFAULT; + gboolean results_created = FALSE; + gboolean compared_any = FALSE; + gboolean diff_found = FALSE; + + g_return_val_if_fail(results != NULL, FALSE); + g_return_val_if_fail(NM_IS_SETTING(a), FALSE); + if (b) { + g_return_val_if_fail(NM_IS_SETTING(b), FALSE); + g_return_val_if_fail(G_OBJECT_TYPE(a) == G_OBJECT_TYPE(b), FALSE); + } + + nm_assert(!con_a || NM_IS_CONNECTION(con_a)); + nm_assert(!con_b || NM_IS_CONNECTION(con_b)); + + if ((flags + & (NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT + | NM_SETTING_COMPARE_FLAG_DIFF_RESULT_NO_DEFAULT)) + == (NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT + | NM_SETTING_COMPARE_FLAG_DIFF_RESULT_NO_DEFAULT)) { + /* conflicting flags: default to WITH_DEFAULT (clearing NO_DEFAULT). */ + flags &= ~NM_SETTING_COMPARE_FLAG_DIFF_RESULT_NO_DEFAULT; + } + + /* If the caller is calling this function in a pattern like this to get + * complete diffs: + * + * nm_setting_diff (A, B, FALSE, &results); + * nm_setting_diff (B, A, TRUE, &results); + * + * and wants us to invert the results so that the second invocation comes + * out correctly, do that here. + */ + if (invert_results) { + a_result = NM_SETTING_DIFF_RESULT_IN_B; + b_result = NM_SETTING_DIFF_RESULT_IN_A; + a_result_default = NM_SETTING_DIFF_RESULT_IN_B_DEFAULT; + b_result_default = NM_SETTING_DIFF_RESULT_IN_A_DEFAULT; + } + + if (*results == NULL) { + *results = g_hash_table_new_full(nm_str_hash, g_str_equal, g_free, NULL); + results_created = TRUE; + } + + sett_info = _nm_setting_class_get_sett_info(NM_SETTING_GET_CLASS(a)); + + if (sett_info->detail.gendata_info) { + const char * key; + GVariant * val, *val2; + GHashTableIter iter; + GenData * a_gendata = _gendata_hash(a, FALSE); + GenData * b_gendata = b ? _gendata_hash(b, FALSE) : NULL; + + if (!a_gendata || !b_gendata) { + if (a_gendata || b_gendata) { + NMSettingDiffResult one_sided_result; + + one_sided_result = a_gendata ? a_result : b_result; + g_hash_table_iter_init(&iter, a_gendata ? a_gendata->hash : b_gendata->hash); + while (g_hash_table_iter_next(&iter, (gpointer *) &key, NULL)) { + diff_found = TRUE; + _setting_diff_add_result(*results, key, one_sided_result); + } + } + } else { + g_hash_table_iter_init(&iter, a_gendata->hash); + while (g_hash_table_iter_next(&iter, (gpointer *) &key, (gpointer *) &val)) { + val2 = g_hash_table_lookup(b_gendata->hash, key); + compared_any = TRUE; + if (!val2 || !g_variant_equal(val, val2)) { + diff_found = TRUE; + _setting_diff_add_result(*results, key, a_result); + } + } + g_hash_table_iter_init(&iter, b_gendata->hash); + while (g_hash_table_iter_next(&iter, (gpointer *) &key, (gpointer *) &val)) { + val2 = g_hash_table_lookup(a_gendata->hash, key); + compared_any = TRUE; + if (!val2 || !g_variant_equal(val, val2)) { + diff_found = TRUE; + _setting_diff_add_result(*results, key, b_result); + } + } + } + } else { + for (i = 0; i < sett_info->property_infos_len; i++) { + NMSettingDiffResult r = NM_SETTING_DIFF_RESULT_UNKNOWN; + const NMSettInfoProperty *property_info; + NMTernary compare_result; + GParamSpec * prop_spec; + + compare_result = _compare_property(sett_info, i, con_a, a, con_b, b, flags); + if (compare_result == NM_TERNARY_DEFAULT) + continue; + + if (NM_FLAGS_ANY(flags, + NM_SETTING_COMPARE_FLAG_IGNORE_AGENT_OWNED_SECRETS + | NM_SETTING_COMPARE_FLAG_IGNORE_NOT_SAVED_SECRETS) + && b && compare_result == NM_TERNARY_FALSE) { + /* we have setting @b and the property is not the same. But we also are instructed + * to ignore secrets based on the flags. + * + * Note that compare_property() called with two settings will ignore secrets + * based on the flags, but it will do so if *both* settings have the flag we + * look for. So that is symmetric behavior and good. + * + * But for the purpose of diff(), we do a asymmetric comparison because and + * we want to skip testing the property if setting @a alone indicates to do + * so. + * + * We need to double-check whether the property should be ignored by + * looking at @a alone. */ + if (_compare_property(sett_info, i, con_a, a, NULL, NULL, flags) + == NM_TERNARY_DEFAULT) + continue; + } + + compared_any = TRUE; + + property_info = &sett_info->property_infos[i]; + prop_spec = property_info->param_spec; + + if (b) { + if (compare_result == NM_TERNARY_FALSE) { + if (prop_spec) { + gboolean a_is_default, b_is_default; + GValue value = G_VALUE_INIT; + + g_value_init(&value, prop_spec->value_type); + g_object_get_property(G_OBJECT(a), prop_spec->name, &value); + a_is_default = g_param_value_defaults(prop_spec, &value); + + g_value_reset(&value); + g_object_get_property(G_OBJECT(b), prop_spec->name, &value); + b_is_default = g_param_value_defaults(prop_spec, &value); + + g_value_unset(&value); + if (!NM_FLAGS_HAS(flags, + NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT)) { + if (!a_is_default) + r |= a_result; + if (!b_is_default) + r |= b_result; + } else { + r |= a_result | b_result; + if (a_is_default) + r |= a_result_default; + if (b_is_default) + r |= b_result_default; + } + } else + r |= a_result | b_result; + } + } else if ((flags + & (NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT + | NM_SETTING_COMPARE_FLAG_DIFF_RESULT_NO_DEFAULT)) + == 0) + r = a_result; /* only in A */ + else { + if (prop_spec) { + GValue value = G_VALUE_INIT; + + g_value_init(&value, prop_spec->value_type); + g_object_get_property(G_OBJECT(a), prop_spec->name, &value); + if (!g_param_value_defaults(prop_spec, &value)) + r |= a_result; + else if (flags & NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT) + r |= a_result | a_result_default; + + g_value_unset(&value); + } else + r |= a_result; + } + + if (r != NM_SETTING_DIFF_RESULT_UNKNOWN) { + diff_found = TRUE; + _setting_diff_add_result(*results, property_info->name, r); + } + } + } + + if (!compared_any && !b) { + /* special case: the setting has no properties, and the opposite + * setting @b is not given. The settings differ, and we signal that + * by returning an empty results hash. */ + diff_found = TRUE; + } + + if (diff_found) { + /* if there is a difference, we always return FALSE. It also means, we might + * have allocated a new @results hash, and return it to the caller. */ + return FALSE; + } else { + if (results_created) { + /* the allocated hash is unused. Clear it again. */ + g_hash_table_destroy(*results); + *results = NULL; + } else { + /* we found no diff, and return false. However, the input + * @result is returned unmodified. */ + } + return TRUE; + } } static void -enumerate_values (const NMSettInfoProperty *property_info, - NMSetting *setting, - NMSettingValueIterFn func, - gpointer user_data) +enumerate_values(const NMSettInfoProperty *property_info, + NMSetting * setting, + NMSettingValueIterFn func, + gpointer user_data) { - GValue value = G_VALUE_INIT; + GValue value = G_VALUE_INIT; - if (!property_info->param_spec) - return; + if (!property_info->param_spec) + return; - g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (property_info->param_spec)); - g_object_get_property (G_OBJECT (setting), property_info->param_spec->name, &value); - func (setting, - property_info->param_spec->name, - &value, - property_info->param_spec->flags, - user_data); - g_value_unset (&value); + g_value_init(&value, G_PARAM_SPEC_VALUE_TYPE(property_info->param_spec)); + g_object_get_property(G_OBJECT(setting), property_info->param_spec->name, &value); + func(setting, + property_info->param_spec->name, + &value, + property_info->param_spec->flags, + user_data); + g_value_unset(&value); } /** @@ -1773,110 +1794,105 @@ enumerate_values (const NMSettInfoProperty *property_info, * user function for each property. **/ void -nm_setting_enumerate_values (NMSetting *setting, - NMSettingValueIterFn func, - gpointer user_data) -{ - const NMSettInfoSetting *sett_info; - guint i; - - g_return_if_fail (NM_IS_SETTING (setting)); - g_return_if_fail (func != NULL); - - sett_info = _nm_setting_class_get_sett_info (NM_SETTING_GET_CLASS (setting)); - - if (sett_info->detail.gendata_info) { - const char *const*names; - guint n_properties; - - /* the properties of this setting are not real GObject properties. - * Hence, this API makes little sense (or does it?). Still, call - * @func with each value. */ - n_properties = _nm_setting_option_get_all (setting, &names, NULL); - if (n_properties > 0) { - gs_strfreev char **keys = g_strdupv ((char **) names); - GHashTable *h = _gendata_hash (setting, FALSE)->hash; - - for (i = 0; i < n_properties; i++) { - GValue value = G_VALUE_INIT; - GVariant *val = g_hash_table_lookup (h, keys[i]); - - if (!val) { - /* was deleted in the meantime? Skip */ - continue; - } - - g_value_init (&value, G_TYPE_VARIANT); - g_value_set_variant (&value, val); - /* call it will GParamFlags 0. It shall indicate that this - * is not a "real" GObject property. */ - func (setting, keys[i], &value, 0, user_data); - g_value_unset (&value); - } - } - return; - } - - for (i = 0; i < sett_info->property_infos_len; i++) { - NM_SETTING_GET_CLASS (setting)->enumerate_values (_nm_sett_info_property_info_get_sorted (sett_info, i), - setting, - func, - user_data); - } +nm_setting_enumerate_values(NMSetting *setting, NMSettingValueIterFn func, gpointer user_data) +{ + const NMSettInfoSetting *sett_info; + guint i; + + g_return_if_fail(NM_IS_SETTING(setting)); + g_return_if_fail(func != NULL); + + sett_info = _nm_setting_class_get_sett_info(NM_SETTING_GET_CLASS(setting)); + + if (sett_info->detail.gendata_info) { + const char *const *names; + guint n_properties; + + /* the properties of this setting are not real GObject properties. + * Hence, this API makes little sense (or does it?). Still, call + * @func with each value. */ + n_properties = _nm_setting_option_get_all(setting, &names, NULL); + if (n_properties > 0) { + gs_strfreev char **keys = g_strdupv((char **) names); + GHashTable * h = _gendata_hash(setting, FALSE)->hash; + + for (i = 0; i < n_properties; i++) { + GValue value = G_VALUE_INIT; + GVariant *val = g_hash_table_lookup(h, keys[i]); + + if (!val) { + /* was deleted in the meantime? Skip */ + continue; + } + + g_value_init(&value, G_TYPE_VARIANT); + g_value_set_variant(&value, val); + /* call it will GParamFlags 0. It shall indicate that this + * is not a "real" GObject property. */ + func(setting, keys[i], &value, 0, user_data); + g_value_unset(&value); + } + } + return; + } + + for (i = 0; i < sett_info->property_infos_len; i++) { + NM_SETTING_GET_CLASS(setting)->enumerate_values( + _nm_sett_info_property_info_get_sorted(sett_info, i), + setting, + func, + user_data); + } } static gboolean -aggregate (NMSetting *setting, - int type_i, - gpointer arg) -{ - NMConnectionAggregateType type = type_i; - const NMSettInfoSetting *sett_info; - guint i; - - nm_assert (NM_IN_SET (type, NM_CONNECTION_AGGREGATE_ANY_SECRETS, - NM_CONNECTION_AGGREGATE_ANY_SYSTEM_SECRET_FLAGS)); - - sett_info = _nm_setting_class_get_sett_info (NM_SETTING_GET_CLASS (setting)); - for (i = 0; i < sett_info->property_infos_len; i++) { - const NMSettInfoProperty *property_info = &sett_info->property_infos[i]; - GParamSpec *prop_spec = property_info->param_spec; - nm_auto_unset_gvalue GValue value = G_VALUE_INIT; - NMSettingSecretFlags secret_flags; - - if ( !prop_spec - || !NM_FLAGS_HAS (prop_spec->flags, NM_SETTING_PARAM_SECRET)) { - nm_assert (!nm_setting_get_secret_flags (setting, property_info->name, NULL, NULL)); - continue; - } - - /* for the moment, all aggregate types only care about secrets. */ - nm_assert (nm_setting_get_secret_flags (setting, property_info->name, NULL, NULL)); - - switch (type) { - - case NM_CONNECTION_AGGREGATE_ANY_SECRETS: - g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (prop_spec)); - g_object_get_property (G_OBJECT (setting), prop_spec->name, &value); - if (!g_param_value_defaults (prop_spec, &value)) { - *((gboolean *) arg) = TRUE; - return TRUE; - } - break; - - case NM_CONNECTION_AGGREGATE_ANY_SYSTEM_SECRET_FLAGS: - if (!nm_setting_get_secret_flags (setting, prop_spec->name, &secret_flags, NULL)) - nm_assert_not_reached (); - if (secret_flags == NM_SETTING_SECRET_FLAG_NONE) { - *((gboolean *) arg) = TRUE; - return TRUE; - } - break; - - } - } - - return FALSE; +aggregate(NMSetting *setting, int type_i, gpointer arg) +{ + NMConnectionAggregateType type = type_i; + const NMSettInfoSetting * sett_info; + guint i; + + nm_assert(NM_IN_SET(type, + NM_CONNECTION_AGGREGATE_ANY_SECRETS, + NM_CONNECTION_AGGREGATE_ANY_SYSTEM_SECRET_FLAGS)); + + sett_info = _nm_setting_class_get_sett_info(NM_SETTING_GET_CLASS(setting)); + for (i = 0; i < sett_info->property_infos_len; i++) { + const NMSettInfoProperty * property_info = &sett_info->property_infos[i]; + GParamSpec * prop_spec = property_info->param_spec; + nm_auto_unset_gvalue GValue value = G_VALUE_INIT; + NMSettingSecretFlags secret_flags; + + if (!prop_spec || !NM_FLAGS_HAS(prop_spec->flags, NM_SETTING_PARAM_SECRET)) { + nm_assert(!nm_setting_get_secret_flags(setting, property_info->name, NULL, NULL)); + continue; + } + + /* for the moment, all aggregate types only care about secrets. */ + nm_assert(nm_setting_get_secret_flags(setting, property_info->name, NULL, NULL)); + + switch (type) { + case NM_CONNECTION_AGGREGATE_ANY_SECRETS: + g_value_init(&value, G_PARAM_SPEC_VALUE_TYPE(prop_spec)); + g_object_get_property(G_OBJECT(setting), prop_spec->name, &value); + if (!g_param_value_defaults(prop_spec, &value)) { + *((gboolean *) arg) = TRUE; + return TRUE; + } + break; + + case NM_CONNECTION_AGGREGATE_ANY_SYSTEM_SECRET_FLAGS: + if (!nm_setting_get_secret_flags(setting, prop_spec->name, &secret_flags, NULL)) + nm_assert_not_reached(); + if (secret_flags == NM_SETTING_SECRET_FLAG_NONE) { + *((gboolean *) arg) = TRUE; + return TRUE; + } + break; + } + } + + return FALSE; } /** @@ -1895,56 +1911,55 @@ aggregate (NMSetting *setting, * argument of _nm_connection_aggregate(), which serves a different purpose. */ gboolean -_nm_setting_aggregate (NMSetting *setting, - NMConnectionAggregateType type, - gpointer arg) +_nm_setting_aggregate(NMSetting *setting, NMConnectionAggregateType type, gpointer arg) { - g_return_val_if_fail (NM_IS_SETTING (setting), FALSE); - g_return_val_if_fail (arg, FALSE); - g_return_val_if_fail (NM_IN_SET (type, NM_CONNECTION_AGGREGATE_ANY_SECRETS, - NM_CONNECTION_AGGREGATE_ANY_SYSTEM_SECRET_FLAGS), - FALSE); + g_return_val_if_fail(NM_IS_SETTING(setting), FALSE); + g_return_val_if_fail(arg, FALSE); + g_return_val_if_fail(NM_IN_SET(type, + NM_CONNECTION_AGGREGATE_ANY_SECRETS, + NM_CONNECTION_AGGREGATE_ANY_SYSTEM_SECRET_FLAGS), + FALSE); - return NM_SETTING_GET_CLASS (setting)->aggregate (setting, type, arg); + return NM_SETTING_GET_CLASS(setting)->aggregate(setting, type, arg); } static gboolean -clear_secrets (const NMSettInfoSetting *sett_info, - guint property_idx, - NMSetting *setting, - NMSettingClearSecretsWithFlagsFn func, - gpointer user_data) +clear_secrets(const NMSettInfoSetting * sett_info, + guint property_idx, + NMSetting * setting, + NMSettingClearSecretsWithFlagsFn func, + gpointer user_data) { - NMSettingSecretFlags flags = NM_SETTING_SECRET_FLAG_NONE; - GParamSpec *param_spec = sett_info->property_infos[property_idx].param_spec; + NMSettingSecretFlags flags = NM_SETTING_SECRET_FLAG_NONE; + GParamSpec * param_spec = sett_info->property_infos[property_idx].param_spec; - if (!param_spec) - return FALSE; + if (!param_spec) + return FALSE; - if (!NM_FLAGS_HAS (param_spec->flags, NM_SETTING_PARAM_SECRET)) - return FALSE; + if (!NM_FLAGS_HAS(param_spec->flags, NM_SETTING_PARAM_SECRET)) + return FALSE; - if (func) { - if (!nm_setting_get_secret_flags (setting, param_spec->name, &flags, NULL)) - nm_assert_not_reached (); - if (!func (setting, param_spec->name, flags, user_data)) - return FALSE; - } else - nm_assert (nm_setting_get_secret_flags (setting, param_spec->name, NULL, NULL)); + if (func) { + if (!nm_setting_get_secret_flags(setting, param_spec->name, &flags, NULL)) + nm_assert_not_reached(); + if (!func(setting, param_spec->name, flags, user_data)) + return FALSE; + } else + nm_assert(nm_setting_get_secret_flags(setting, param_spec->name, NULL, NULL)); - { - nm_auto_unset_gvalue GValue value = G_VALUE_INIT; + { + nm_auto_unset_gvalue GValue value = G_VALUE_INIT; - g_value_init (&value, param_spec->value_type); - g_object_get_property (G_OBJECT (setting), param_spec->name, &value); - if (g_param_value_defaults (param_spec, &value)) - return FALSE; + g_value_init(&value, param_spec->value_type); + g_object_get_property(G_OBJECT(setting), param_spec->name, &value); + if (g_param_value_defaults(param_spec, &value)) + return FALSE; - g_param_value_set_default (param_spec, &value); - g_object_set_property (G_OBJECT (setting), param_spec->name, &value); - } + g_param_value_set_default(param_spec, &value); + g_object_set_property(G_OBJECT(setting), param_spec->name, &value); + } - return TRUE; + return TRUE; } /** @@ -1959,32 +1974,28 @@ clear_secrets (const NMSettInfoSetting *sett_info, * Returns: %TRUE if the setting changed at all **/ gboolean -_nm_setting_clear_secrets (NMSetting *setting, - NMSettingClearSecretsWithFlagsFn func, - gpointer user_data) -{ - const NMSettInfoSetting *sett_info; - gboolean changed = FALSE; - guint i; - gboolean (*my_clear_secrets) (const struct _NMSettInfoSetting *sett_info, - guint property_idx, - NMSetting *setting, - NMSettingClearSecretsWithFlagsFn func, - gpointer user_data); - - g_return_val_if_fail (NM_IS_SETTING (setting), FALSE); - - my_clear_secrets = NM_SETTING_GET_CLASS (setting)->clear_secrets; - - sett_info = _nm_setting_class_get_sett_info (NM_SETTING_GET_CLASS (setting)); - for (i = 0; i < sett_info->property_infos_len; i++) { - changed |= my_clear_secrets (sett_info, - i, - setting, - func, - user_data); - } - return changed; +_nm_setting_clear_secrets(NMSetting * setting, + NMSettingClearSecretsWithFlagsFn func, + gpointer user_data) +{ + const NMSettInfoSetting *sett_info; + gboolean changed = FALSE; + guint i; + gboolean (*my_clear_secrets)(const struct _NMSettInfoSetting *sett_info, + guint property_idx, + NMSetting * setting, + NMSettingClearSecretsWithFlagsFn func, + gpointer user_data); + + g_return_val_if_fail(NM_IS_SETTING(setting), FALSE); + + my_clear_secrets = NM_SETTING_GET_CLASS(setting)->clear_secrets; + + sett_info = _nm_setting_class_get_sett_info(NM_SETTING_GET_CLASS(setting)); + for (i = 0; i < sett_info->property_infos_len; i++) { + changed |= my_clear_secrets(sett_info, i, setting, func, user_data); + } + return changed; } /** @@ -2002,62 +2013,63 @@ _nm_setting_clear_secrets (NMSetting *setting, * free the elements. **/ GPtrArray * -_nm_setting_need_secrets (NMSetting *setting) +_nm_setting_need_secrets(NMSetting *setting) { - GPtrArray *secrets = NULL; + GPtrArray *secrets = NULL; - g_return_val_if_fail (NM_IS_SETTING (setting), NULL); + g_return_val_if_fail(NM_IS_SETTING(setting), NULL); - if (NM_SETTING_GET_CLASS (setting)->need_secrets) - secrets = NM_SETTING_GET_CLASS (setting)->need_secrets (setting); + if (NM_SETTING_GET_CLASS(setting)->need_secrets) + secrets = NM_SETTING_GET_CLASS(setting)->need_secrets(setting); - return secrets; + return secrets; } static int -update_one_secret (NMSetting *setting, const char *key, GVariant *value, GError **error) -{ - const NMSettInfoProperty *property; - GParamSpec *prop_spec; - GValue prop_value = { 0, }; - - property = _nm_setting_class_get_property_info (NM_SETTING_GET_CLASS (setting), key); - if (!property) { - g_set_error_literal (error, - NM_CONNECTION_ERROR, - NM_CONNECTION_ERROR_PROPERTY_NOT_FOUND, - _("secret not found")); - g_prefix_error (error, "%s.%s: ", nm_setting_get_name (setting), key); - return NM_SETTING_UPDATE_SECRET_ERROR; - } - - /* Silently ignore non-secrets */ - prop_spec = property->param_spec; - if (!prop_spec || !(prop_spec->flags & NM_SETTING_PARAM_SECRET)) - return NM_SETTING_UPDATE_SECRET_SUCCESS_UNCHANGED; - - if ( g_variant_is_of_type (value, G_VARIANT_TYPE_STRING) - && G_IS_PARAM_SPEC_STRING (prop_spec)) { - /* String is expected to be a common case. Handle it specially and check - * whether the value is already set. Otherwise, we just reset the - * property and assume the value got modified. - */ - char *v; - - g_object_get (G_OBJECT (setting), prop_spec->name, &v, NULL); - if (g_strcmp0 (v, g_variant_get_string (value, NULL)) == 0) { - g_free (v); - return NM_SETTING_UPDATE_SECRET_SUCCESS_UNCHANGED; - } - g_free (v); - } - - g_value_init (&prop_value, prop_spec->value_type); - set_property_from_dbus (property, value, &prop_value); - g_object_set_property (G_OBJECT (setting), prop_spec->name, &prop_value); - g_value_unset (&prop_value); - - return NM_SETTING_UPDATE_SECRET_SUCCESS_MODIFIED; +update_one_secret(NMSetting *setting, const char *key, GVariant *value, GError **error) +{ + const NMSettInfoProperty *property; + GParamSpec * prop_spec; + GValue prop_value = { + 0, + }; + + property = _nm_setting_class_get_property_info(NM_SETTING_GET_CLASS(setting), key); + if (!property) { + g_set_error_literal(error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_PROPERTY_NOT_FOUND, + _("secret not found")); + g_prefix_error(error, "%s.%s: ", nm_setting_get_name(setting), key); + return NM_SETTING_UPDATE_SECRET_ERROR; + } + + /* Silently ignore non-secrets */ + prop_spec = property->param_spec; + if (!prop_spec || !(prop_spec->flags & NM_SETTING_PARAM_SECRET)) + return NM_SETTING_UPDATE_SECRET_SUCCESS_UNCHANGED; + + if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING) && G_IS_PARAM_SPEC_STRING(prop_spec)) { + /* String is expected to be a common case. Handle it specially and check + * whether the value is already set. Otherwise, we just reset the + * property and assume the value got modified. + */ + char *v; + + g_object_get(G_OBJECT(setting), prop_spec->name, &v, NULL); + if (g_strcmp0(v, g_variant_get_string(value, NULL)) == 0) { + g_free(v); + return NM_SETTING_UPDATE_SECRET_SUCCESS_UNCHANGED; + } + g_free(v); + } + + g_value_init(&prop_value, prop_spec->value_type); + set_property_from_dbus(property, value, &prop_value); + g_object_set_property(G_OBJECT(setting), prop_spec->name, &prop_value); + g_value_unset(&prop_value); + + return NM_SETTING_UPDATE_SECRET_SUCCESS_MODIFIED; } /** @@ -2073,130 +2085,125 @@ update_one_secret (NMSetting *setting, const char *key, GVariant *value, GError * Returns: an #NMSettingUpdateSecretResult **/ NMSettingUpdateSecretResult -_nm_setting_update_secrets (NMSetting *setting, GVariant *secrets, GError **error) +_nm_setting_update_secrets(NMSetting *setting, GVariant *secrets, GError **error) { - GVariantIter iter; - const char *secret_key; - GVariant *secret_value; - GError *tmp_error = NULL; - NMSettingUpdateSecretResult result = NM_SETTING_UPDATE_SECRET_SUCCESS_UNCHANGED; + GVariantIter iter; + const char * secret_key; + GVariant * secret_value; + GError * tmp_error = NULL; + NMSettingUpdateSecretResult result = NM_SETTING_UPDATE_SECRET_SUCCESS_UNCHANGED; - g_return_val_if_fail (NM_IS_SETTING (setting), NM_SETTING_UPDATE_SECRET_ERROR); - g_return_val_if_fail (g_variant_is_of_type (secrets, NM_VARIANT_TYPE_SETTING), NM_SETTING_UPDATE_SECRET_ERROR); - if (error) - g_return_val_if_fail (*error == NULL, NM_SETTING_UPDATE_SECRET_ERROR); + g_return_val_if_fail(NM_IS_SETTING(setting), NM_SETTING_UPDATE_SECRET_ERROR); + g_return_val_if_fail(g_variant_is_of_type(secrets, NM_VARIANT_TYPE_SETTING), + NM_SETTING_UPDATE_SECRET_ERROR); + if (error) + g_return_val_if_fail(*error == NULL, NM_SETTING_UPDATE_SECRET_ERROR); - g_variant_iter_init (&iter, secrets); - while (g_variant_iter_next (&iter, "{&sv}", &secret_key, &secret_value)) { - int success; + g_variant_iter_init(&iter, secrets); + while (g_variant_iter_next(&iter, "{&sv}", &secret_key, &secret_value)) { + int success; - success = NM_SETTING_GET_CLASS (setting)->update_one_secret (setting, secret_key, secret_value, &tmp_error); - nm_assert (!((success == NM_SETTING_UPDATE_SECRET_ERROR) ^ (!!tmp_error))); + success = NM_SETTING_GET_CLASS(setting)->update_one_secret(setting, + secret_key, + secret_value, + &tmp_error); + nm_assert(!((success == NM_SETTING_UPDATE_SECRET_ERROR) ^ (!!tmp_error))); - g_variant_unref (secret_value); + g_variant_unref(secret_value); - if (success == NM_SETTING_UPDATE_SECRET_ERROR) { - g_propagate_error (error, tmp_error); - return NM_SETTING_UPDATE_SECRET_ERROR; - } + if (success == NM_SETTING_UPDATE_SECRET_ERROR) { + g_propagate_error(error, tmp_error); + return NM_SETTING_UPDATE_SECRET_ERROR; + } - if (success == NM_SETTING_UPDATE_SECRET_SUCCESS_MODIFIED) - result = NM_SETTING_UPDATE_SECRET_SUCCESS_MODIFIED; - } + if (success == NM_SETTING_UPDATE_SECRET_SUCCESS_MODIFIED) + result = NM_SETTING_UPDATE_SECRET_SUCCESS_MODIFIED; + } - return result; + return result; } static void -for_each_secret (NMSetting *setting, - const char *secret_name, - GVariant *val, - gboolean remove_non_secrets, - _NMConnectionForEachSecretFunc callback, - gpointer callback_data, - GVariantBuilder *setting_builder) +for_each_secret(NMSetting * setting, + const char * secret_name, + GVariant * val, + gboolean remove_non_secrets, + _NMConnectionForEachSecretFunc callback, + gpointer callback_data, + GVariantBuilder * setting_builder) { - NMSettingSecretFlags secret_flags = NM_SETTING_SECRET_FLAG_NONE; + NMSettingSecretFlags secret_flags = NM_SETTING_SECRET_FLAG_NONE; - if (!nm_setting_get_secret_flags (setting, secret_name, &secret_flags, NULL)) { - if (!remove_non_secrets) - g_variant_builder_add (setting_builder, "{sv}", secret_name, val); - return; - } - if (callback (secret_flags, callback_data)) - g_variant_builder_add (setting_builder, "{sv}", secret_name, val); + if (!nm_setting_get_secret_flags(setting, secret_name, &secret_flags, NULL)) { + if (!remove_non_secrets) + g_variant_builder_add(setting_builder, "{sv}", secret_name, val); + return; + } + if (callback(secret_flags, callback_data)) + g_variant_builder_add(setting_builder, "{sv}", secret_name, val); } static void -_set_error_secret_property_not_found (GError **error, - NMSetting *setting, - const char *secret_name) +_set_error_secret_property_not_found(GError **error, NMSetting *setting, const char *secret_name) { - g_set_error_literal (error, - NM_CONNECTION_ERROR, - NM_CONNECTION_ERROR_PROPERTY_NOT_FOUND, - _("not a secret property")); - g_prefix_error (error, "%s.%s: ", nm_setting_get_name (setting), secret_name); + g_set_error_literal(error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_PROPERTY_NOT_FOUND, + _("not a secret property")); + g_prefix_error(error, "%s.%s: ", nm_setting_get_name(setting), secret_name); } gboolean -_nm_setting_property_is_regular_secret (NMSetting *setting, - const char *secret_name) +_nm_setting_property_is_regular_secret(NMSetting *setting, const char *secret_name) { - const NMSettInfoProperty *property; + const NMSettInfoProperty *property; - nm_assert (NM_IS_SETTING (setting)); - nm_assert (secret_name); + nm_assert(NM_IS_SETTING(setting)); + nm_assert(secret_name); - property = _nm_setting_class_get_property_info (NM_SETTING_GET_CLASS (setting), secret_name); - return property - && property->param_spec - && NM_FLAGS_HAS (property->param_spec->flags, NM_SETTING_PARAM_SECRET); + property = _nm_setting_class_get_property_info(NM_SETTING_GET_CLASS(setting), secret_name); + return property && property->param_spec + && NM_FLAGS_HAS(property->param_spec->flags, NM_SETTING_PARAM_SECRET); } gboolean -_nm_setting_property_is_regular_secret_flags (NMSetting *setting, - const char *secret_flags_name) +_nm_setting_property_is_regular_secret_flags(NMSetting *setting, const char *secret_flags_name) { - const NMSettInfoProperty *property; + const NMSettInfoProperty *property; - nm_assert (NM_IS_SETTING (setting)); - nm_assert (secret_flags_name); + nm_assert(NM_IS_SETTING(setting)); + nm_assert(secret_flags_name); - property = _nm_setting_class_get_property_info (NM_SETTING_GET_CLASS (setting), secret_flags_name); - return property - && property->param_spec - && !NM_FLAGS_HAS (property->param_spec->flags, NM_SETTING_PARAM_SECRET) - && G_PARAM_SPEC_VALUE_TYPE (property->param_spec) == NM_TYPE_SETTING_SECRET_FLAGS; + property = + _nm_setting_class_get_property_info(NM_SETTING_GET_CLASS(setting), secret_flags_name); + return property && property->param_spec + && !NM_FLAGS_HAS(property->param_spec->flags, NM_SETTING_PARAM_SECRET) + && G_PARAM_SPEC_VALUE_TYPE(property->param_spec) == NM_TYPE_SETTING_SECRET_FLAGS; } static gboolean -get_secret_flags (NMSetting *setting, - const char *secret_name, - NMSettingSecretFlags *out_flags, - GError **error) +get_secret_flags(NMSetting * setting, + const char * secret_name, + NMSettingSecretFlags *out_flags, + GError ** error) { - gs_free char *secret_flags_name_free = NULL; - const char *secret_flags_name; - NMSettingSecretFlags flags; + gs_free char * secret_flags_name_free = NULL; + const char * secret_flags_name; + NMSettingSecretFlags flags; - if (!_nm_setting_property_is_regular_secret (setting, - secret_name)) { - _set_error_secret_property_not_found (error, setting, secret_name); - NM_SET_OUT (out_flags, NM_SETTING_SECRET_FLAG_NONE); - return FALSE; - } + if (!_nm_setting_property_is_regular_secret(setting, secret_name)) { + _set_error_secret_property_not_found(error, setting, secret_name); + NM_SET_OUT(out_flags, NM_SETTING_SECRET_FLAG_NONE); + return FALSE; + } - secret_flags_name = nm_construct_name_a ("%s-flags", secret_name, &secret_flags_name_free); + secret_flags_name = nm_construct_name_a("%s-flags", secret_name, &secret_flags_name_free); - nm_assert (_nm_setting_property_is_regular_secret_flags (setting, secret_flags_name)); + nm_assert(_nm_setting_property_is_regular_secret_flags(setting, secret_flags_name)); - g_object_get (G_OBJECT (setting), - secret_flags_name, - &flags, - NULL); - NM_SET_OUT (out_flags, flags); - return TRUE; + g_object_get(G_OBJECT(setting), secret_flags_name, &flags, NULL); + NM_SET_OUT(out_flags, flags); + return TRUE; } /** @@ -2213,43 +2220,42 @@ get_secret_flags (NMSetting *setting, * this setting, and if that property is secret), %FALSE if not **/ gboolean -nm_setting_get_secret_flags (NMSetting *setting, - const char *secret_name, - NMSettingSecretFlags *out_flags, - GError **error) +nm_setting_get_secret_flags(NMSetting * setting, + const char * secret_name, + NMSettingSecretFlags *out_flags, + GError ** error) { - g_return_val_if_fail (NM_IS_SETTING (setting), FALSE); - g_return_val_if_fail (secret_name != NULL, FALSE); + g_return_val_if_fail(NM_IS_SETTING(setting), FALSE); + g_return_val_if_fail(secret_name != NULL, FALSE); - return NM_SETTING_GET_CLASS (setting)->get_secret_flags (setting, secret_name, out_flags, error); + return NM_SETTING_GET_CLASS(setting)->get_secret_flags(setting, secret_name, out_flags, error); } static gboolean -set_secret_flags (NMSetting *setting, - const char *secret_name, - NMSettingSecretFlags flags, - GError **error) +set_secret_flags(NMSetting * setting, + const char * secret_name, + NMSettingSecretFlags flags, + GError ** error) { - gs_free char *secret_flags_name_free = NULL; - const char *secret_flags_name; + gs_free char *secret_flags_name_free = NULL; + const char * secret_flags_name; - if (!_nm_setting_property_is_regular_secret (setting, - secret_name)) { - _set_error_secret_property_not_found (error, setting, secret_name); - return FALSE; - } + if (!_nm_setting_property_is_regular_secret(setting, secret_name)) { + _set_error_secret_property_not_found(error, setting, secret_name); + return FALSE; + } - secret_flags_name = nm_construct_name_a ("%s-flags", secret_name, &secret_flags_name_free); + secret_flags_name = nm_construct_name_a("%s-flags", secret_name, &secret_flags_name_free); - nm_assert (_nm_setting_property_is_regular_secret_flags (setting, secret_flags_name)); + nm_assert(_nm_setting_property_is_regular_secret_flags(setting, secret_flags_name)); - if (!nm_g_object_set_property_flags (G_OBJECT (setting), - secret_flags_name, - NM_TYPE_SETTING_SECRET_FLAGS, - flags, - error)) - g_return_val_if_reached (FALSE); - return TRUE; + if (!nm_g_object_set_property_flags(G_OBJECT(setting), + secret_flags_name, + NM_TYPE_SETTING_SECRET_FLAGS, + flags, + error)) + g_return_val_if_reached(FALSE); + return TRUE; } /** @@ -2266,16 +2272,16 @@ set_secret_flags (NMSetting *setting, * this setting, and if that property is secret), %FALSE if not **/ gboolean -nm_setting_set_secret_flags (NMSetting *setting, - const char *secret_name, - NMSettingSecretFlags flags, - GError **error) +nm_setting_set_secret_flags(NMSetting * setting, + const char * secret_name, + NMSettingSecretFlags flags, + GError ** error) { - g_return_val_if_fail (NM_IS_SETTING (setting), FALSE); - g_return_val_if_fail (secret_name != NULL, FALSE); - g_return_val_if_fail (_nm_setting_secret_flags_valid (flags), FALSE); + g_return_val_if_fail(NM_IS_SETTING(setting), FALSE); + g_return_val_if_fail(secret_name != NULL, FALSE); + g_return_val_if_fail(_nm_setting_secret_flags_valid(flags), FALSE); - return NM_SETTING_GET_CLASS (setting)->set_secret_flags (setting, secret_name, flags, error); + return NM_SETTING_GET_CLASS(setting)->set_secret_flags(setting, secret_name, flags, error); } /** @@ -2292,193 +2298,193 @@ nm_setting_set_secret_flags (NMSetting *setting, * free with g_free() **/ char * -nm_setting_to_string (NMSetting *setting) +nm_setting_to_string(NMSetting *setting) { - GString *string; - gs_unref_variant GVariant *variant = NULL; - GVariant *child; - GVariantIter iter; + GString * string; + gs_unref_variant GVariant *variant = NULL; + GVariant * child; + GVariantIter iter; - string = g_string_new (nm_setting_get_name (setting)); - g_string_append_c (string, '\n'); + string = g_string_new(nm_setting_get_name(setting)); + g_string_append_c(string, '\n'); - variant = _nm_setting_to_dbus (setting, NULL, NM_CONNECTION_SERIALIZE_ALL, NULL); + variant = _nm_setting_to_dbus(setting, NULL, NM_CONNECTION_SERIALIZE_ALL, NULL); - g_variant_iter_init (&iter, variant); - while ((child = g_variant_iter_next_value (&iter))) { - gs_free char *name = NULL; - gs_free char *value_str = NULL; - gs_unref_variant GVariant *value = NULL; + g_variant_iter_init(&iter, variant); + while ((child = g_variant_iter_next_value(&iter))) { + gs_free char * name = NULL; + gs_free char * value_str = NULL; + gs_unref_variant GVariant *value = NULL; - g_variant_get (child, "{sv}", &name, &value); - value_str = g_variant_print (value, FALSE); + g_variant_get(child, "{sv}", &name, &value); + value_str = g_variant_print(value, FALSE); - g_string_append_printf (string, "\t%s : %s\n", name, value_str); - } + g_string_append_printf(string, "\t%s : %s\n", name, value_str); + } - return g_string_free (string, FALSE); + return g_string_free(string, FALSE); } static GVariant * -_nm_setting_get_deprecated_virtual_interface_name (const NMSettInfoSetting *sett_info, - guint property_idx, - NMConnection *connection, - NMSetting *setting, - NMConnectionSerializationFlags flags, - const NMConnectionSerializationOptions *options) +_nm_setting_get_deprecated_virtual_interface_name(const NMSettInfoSetting * sett_info, + guint property_idx, + NMConnection * connection, + NMSetting * setting, + NMConnectionSerializationFlags flags, + const NMConnectionSerializationOptions *options) { - NMSettingConnection *s_con; + NMSettingConnection *s_con; - if (!connection) - return NULL; + if (!connection) + return NULL; - s_con = nm_connection_get_setting_connection (connection); - if (!s_con) - return NULL; + s_con = nm_connection_get_setting_connection(connection); + if (!s_con) + return NULL; - if (nm_setting_connection_get_interface_name (s_con)) - return g_variant_new_string (nm_setting_connection_get_interface_name (s_con)); - else - return NULL; + if (nm_setting_connection_get_interface_name(s_con)) + return g_variant_new_string(nm_setting_connection_get_interface_name(s_con)); + else + return NULL; } const NMSettInfoPropertType nm_sett_info_propert_type_deprecated_interface_name = { - .dbus_type = G_VARIANT_TYPE_STRING, - .to_dbus_fcn = _nm_setting_get_deprecated_virtual_interface_name, + .dbus_type = G_VARIANT_TYPE_STRING, + .to_dbus_fcn = _nm_setting_get_deprecated_virtual_interface_name, }; const NMSettInfoPropertType nm_sett_info_propert_type_deprecated_ignore_i = { - .dbus_type = G_VARIANT_TYPE_INT32, - /* No functions set. This property type is to silently ignore the value on D-Bus. */ + .dbus_type = G_VARIANT_TYPE_INT32, + /* No functions set. This property type is to silently ignore the value on D-Bus. */ }; const NMSettInfoPropertType nm_sett_info_propert_type_deprecated_ignore_u = { - .dbus_type = G_VARIANT_TYPE_UINT32, - /* No functions set. This property type is to silently ignore the value on D-Bus. */ + .dbus_type = G_VARIANT_TYPE_UINT32, + /* No functions set. This property type is to silently ignore the value on D-Bus. */ }; const NMSettInfoPropertType nm_sett_info_propert_type_plain_i = { - .dbus_type = G_VARIANT_TYPE_INT32, + .dbus_type = G_VARIANT_TYPE_INT32, }; const NMSettInfoPropertType nm_sett_info_propert_type_plain_u = { - .dbus_type = G_VARIANT_TYPE_UINT32, + .dbus_type = G_VARIANT_TYPE_UINT32, }; /*****************************************************************************/ static GenData * -_gendata_hash (NMSetting *setting, gboolean create_if_necessary) +_gendata_hash(NMSetting *setting, gboolean create_if_necessary) { - NMSettingPrivate *priv; + NMSettingPrivate *priv; - nm_assert (NM_IS_SETTING (setting)); + nm_assert(NM_IS_SETTING(setting)); - priv = NM_SETTING_GET_PRIVATE (setting); + priv = NM_SETTING_GET_PRIVATE(setting); - if (G_UNLIKELY (!priv->gendata)) { - if (!create_if_necessary) - return NULL; - priv->gendata = g_slice_new (GenData); - priv->gendata->hash = g_hash_table_new_full (nm_str_hash, g_str_equal, g_free, (GDestroyNotify) g_variant_unref); - priv->gendata->names = NULL; - priv->gendata->values = NULL; - } + if (G_UNLIKELY(!priv->gendata)) { + if (!create_if_necessary) + return NULL; + priv->gendata = g_slice_new(GenData); + priv->gendata->hash = g_hash_table_new_full(nm_str_hash, + g_str_equal, + g_free, + (GDestroyNotify) g_variant_unref); + priv->gendata->names = NULL; + priv->gendata->values = NULL; + } - return priv->gendata; + return priv->gendata; } GHashTable * -_nm_setting_option_hash (NMSetting *setting, gboolean create_if_necessary) +_nm_setting_option_hash(NMSetting *setting, gboolean create_if_necessary) { - GenData *gendata; + GenData *gendata; - gendata = _gendata_hash (setting, create_if_necessary); - return gendata ? gendata->hash : NULL; + gendata = _gendata_hash(setting, create_if_necessary); + return gendata ? gendata->hash : NULL; } void -_nm_setting_option_notify (NMSetting *setting, - gboolean names_changed) -{ - GenData *gendata; - - gendata = _gendata_hash (setting, FALSE); - if (!gendata) - goto out; - - nm_clear_g_free (&gendata->values); - - if (names_changed) { - /* if only the values changed, it's sufficient to invalidate the - * values cache. Otherwise, the names cache must be invalidated too. */ - nm_clear_g_free (&gendata->names); - } - - /* Note, currently there is no way to notify the subclass when gendata changed. - * gendata is only changed in two situations: - * 1) from within NMSetting itself, for example when creating a NMSetting instance - * from keyfile or a D-Bus GVariant. - * 2) actively from the subclass itself - * For 2), we don't need the notification, because the subclass knows that something - * changed. - * For 1), we currently don't need the notification either, because all that the subclass - * currently would do, is emit a g_object_notify() signal. However, 1) only happens when - * the setting instance is newly created, at that point, nobody listens to the signal. - * - * If we ever need it, then we would need to call a virtual function to notify the subclass - * that gendata changed. */ +_nm_setting_option_notify(NMSetting *setting, gboolean names_changed) +{ + GenData *gendata; + + gendata = _gendata_hash(setting, FALSE); + if (!gendata) + goto out; + + nm_clear_g_free(&gendata->values); + + if (names_changed) { + /* if only the values changed, it's sufficient to invalidate the + * values cache. Otherwise, the names cache must be invalidated too. */ + nm_clear_g_free(&gendata->names); + } + + /* Note, currently there is no way to notify the subclass when gendata changed. + * gendata is only changed in two situations: + * 1) from within NMSetting itself, for example when creating a NMSetting instance + * from keyfile or a D-Bus GVariant. + * 2) actively from the subclass itself + * For 2), we don't need the notification, because the subclass knows that something + * changed. + * For 1), we currently don't need the notification either, because all that the subclass + * currently would do, is emit a g_object_notify() signal. However, 1) only happens when + * the setting instance is newly created, at that point, nobody listens to the signal. + * + * If we ever need it, then we would need to call a virtual function to notify the subclass + * that gendata changed. */ out: - _nm_setting_emit_property_changed (setting); + _nm_setting_emit_property_changed(setting); } guint -_nm_setting_option_get_all (NMSetting *setting, - const char *const**out_names, - GVariant *const**out_values) -{ - GenData *gendata; - GHashTable *hash; - guint i, len; - - nm_assert (NM_IS_SETTING (setting)); - - gendata = _gendata_hash (setting, FALSE); - if (!gendata) - goto out_zero; - - hash = gendata->hash; - len = g_hash_table_size (hash); - if (len == 0) - goto out_zero; - - if (!out_names && !out_values) - return len; - - if (G_UNLIKELY (!gendata->names)) { - gendata->names = nm_utils_strdict_get_keys (hash, - TRUE, - NULL); - } - - if (out_values) { - if (G_UNLIKELY (!gendata->values)) { - gendata->values = g_new (GVariant *, len + 1); - for (i = 0; i < len; i++) - gendata->values[i] = g_hash_table_lookup (hash, gendata->names[i]); - gendata->values[i] = NULL; - } - *out_values = gendata->values; - } - - NM_SET_OUT (out_names, (const char *const*) gendata->names); - return len; +_nm_setting_option_get_all(NMSetting * setting, + const char *const **out_names, + GVariant *const ** out_values) +{ + GenData * gendata; + GHashTable *hash; + guint i, len; + + nm_assert(NM_IS_SETTING(setting)); + + gendata = _gendata_hash(setting, FALSE); + if (!gendata) + goto out_zero; + + hash = gendata->hash; + len = g_hash_table_size(hash); + if (len == 0) + goto out_zero; + + if (!out_names && !out_values) + return len; + + if (G_UNLIKELY(!gendata->names)) { + gendata->names = nm_utils_strdict_get_keys(hash, TRUE, NULL); + } + + if (out_values) { + if (G_UNLIKELY(!gendata->values)) { + gendata->values = g_new(GVariant *, len + 1); + for (i = 0; i < len; i++) + gendata->values[i] = g_hash_table_lookup(hash, gendata->names[i]); + gendata->values[i] = NULL; + } + *out_values = gendata->values; + } + + NM_SET_OUT(out_names, (const char *const *) gendata->names); + return len; out_zero: - NM_SET_OUT (out_names, NULL); - NM_SET_OUT (out_values, NULL); - return 0; + NM_SET_OUT(out_names, NULL); + NM_SET_OUT(out_values, NULL); + return 0; } /** @@ -2495,34 +2501,32 @@ out_zero: * * Since: 1.26 **/ -const char *const* -nm_setting_option_get_all_names (NMSetting *setting, - guint *out_len) +const char *const * +nm_setting_option_get_all_names(NMSetting *setting, guint *out_len) { - const char *const*names; - guint len; + const char *const *names; + guint len; - g_return_val_if_fail (NM_IS_SETTING (setting), NULL); + g_return_val_if_fail(NM_IS_SETTING(setting), NULL); - len = _nm_setting_option_get_all (setting, &names, NULL); - NM_SET_OUT (out_len, len); - return names; + len = _nm_setting_option_get_all(setting, &names, NULL); + NM_SET_OUT(out_len, len); + return names; } gboolean -_nm_setting_option_clear (NMSetting *setting, - const char *optname) +_nm_setting_option_clear(NMSetting *setting, const char *optname) { - GHashTable *ht; + GHashTable *ht; - nm_assert (NM_IS_SETTING (setting)); - nm_assert (nm_str_not_empty (optname)); + nm_assert(NM_IS_SETTING(setting)); + nm_assert(nm_str_not_empty(optname)); - ht = _nm_setting_option_hash (setting, FALSE); - if (!ht) - return FALSE; + ht = _nm_setting_option_hash(setting, FALSE); + if (!ht) + return FALSE; - return g_hash_table_remove (ht, optname); + return g_hash_table_remove(ht, optname); } /** @@ -2536,36 +2540,35 @@ _nm_setting_option_clear (NMSetting *setting, * Since: 1.26 */ void -nm_setting_option_clear_by_name (NMSetting *setting, - NMUtilsPredicateStr predicate) -{ - GHashTable *hash; - GHashTableIter iter; - const char *name; - gboolean changed = FALSE; - - g_return_if_fail (NM_IS_SETTING (setting)); - - hash = _nm_setting_option_hash (NM_SETTING (setting), FALSE); - if (!hash) - return; - - if (!predicate) { - changed = (g_hash_table_size (hash) > 0); - if (changed) - g_hash_table_remove_all (hash); - } else { - g_hash_table_iter_init (&iter, hash); - while (g_hash_table_iter_next (&iter, (gpointer *) &name, NULL)) { - if (predicate (name)) { - g_hash_table_iter_remove (&iter); - changed = TRUE; - } - } - } - - if (changed) - _nm_setting_option_notify (setting, TRUE); +nm_setting_option_clear_by_name(NMSetting *setting, NMUtilsPredicateStr predicate) +{ + GHashTable * hash; + GHashTableIter iter; + const char * name; + gboolean changed = FALSE; + + g_return_if_fail(NM_IS_SETTING(setting)); + + hash = _nm_setting_option_hash(NM_SETTING(setting), FALSE); + if (!hash) + return; + + if (!predicate) { + changed = (g_hash_table_size(hash) > 0); + if (changed) + g_hash_table_remove_all(hash); + } else { + g_hash_table_iter_init(&iter, hash); + while (g_hash_table_iter_next(&iter, (gpointer *) &name, NULL)) { + if (predicate(name)) { + g_hash_table_iter_remove(&iter); + changed = TRUE; + } + } + } + + if (changed) + _nm_setting_option_notify(setting, TRUE); } /*****************************************************************************/ @@ -2581,16 +2584,15 @@ nm_setting_option_clear_by_name (NMSetting *setting, * Since: 1.26. */ GVariant * -nm_setting_option_get (NMSetting *setting, - const char *opt_name) +nm_setting_option_get(NMSetting *setting, const char *opt_name) { - GenData *gendata; + GenData *gendata; - g_return_val_if_fail (NM_IS_SETTING (setting), FALSE); - g_return_val_if_fail (opt_name, FALSE); + g_return_val_if_fail(NM_IS_SETTING(setting), FALSE); + g_return_val_if_fail(opt_name, FALSE); - gendata = _gendata_hash (setting, FALSE); - return gendata ? g_hash_table_lookup (gendata->hash, opt_name) : NULL; + gendata = _gendata_hash(setting, FALSE); + return gendata ? g_hash_table_lookup(gendata->hash, opt_name) : NULL; } /** @@ -2605,20 +2607,17 @@ nm_setting_option_get (NMSetting *setting, * Since: 1.26 */ gboolean -nm_setting_option_get_boolean (NMSetting *setting, - const char *opt_name, - gboolean *out_value) +nm_setting_option_get_boolean(NMSetting *setting, const char *opt_name, gboolean *out_value) { - GVariant *v; + GVariant *v; - v = nm_setting_option_get (NM_SETTING (setting), opt_name); - if ( v - && g_variant_is_of_type (v, G_VARIANT_TYPE_BOOLEAN)) { - NM_SET_OUT (out_value, g_variant_get_boolean (v)); - return TRUE; - } - NM_SET_OUT (out_value, FALSE); - return FALSE; + v = nm_setting_option_get(NM_SETTING(setting), opt_name); + if (v && g_variant_is_of_type(v, G_VARIANT_TYPE_BOOLEAN)) { + NM_SET_OUT(out_value, g_variant_get_boolean(v)); + return TRUE; + } + NM_SET_OUT(out_value, FALSE); + return FALSE; } /** @@ -2633,20 +2632,17 @@ nm_setting_option_get_boolean (NMSetting *setting, * Since: 1.26 */ gboolean -nm_setting_option_get_uint32 (NMSetting *setting, - const char *opt_name, - guint32 *out_value) +nm_setting_option_get_uint32(NMSetting *setting, const char *opt_name, guint32 *out_value) { - GVariant *v; + GVariant *v; - v = nm_setting_option_get (NM_SETTING (setting), opt_name); - if ( v - && g_variant_is_of_type (v, G_VARIANT_TYPE_UINT32)) { - NM_SET_OUT (out_value, g_variant_get_uint32 (v)); - return TRUE; - } - NM_SET_OUT (out_value, 0); - return FALSE; + v = nm_setting_option_get(NM_SETTING(setting), opt_name); + if (v && g_variant_is_of_type(v, G_VARIANT_TYPE_UINT32)) { + NM_SET_OUT(out_value, g_variant_get_uint32(v)); + return TRUE; + } + NM_SET_OUT(out_value, 0); + return FALSE; } /** @@ -2661,63 +2657,59 @@ nm_setting_option_get_uint32 (NMSetting *setting, * * Note that not all setting types support options. It is a bug * setting a variant to a setting that doesn't support it. - * Currently only #NMSettingEthtool supports it. + * Currently, only #NMSettingEthtool supports it. * * Since: 1.26 */ void -nm_setting_option_set (NMSetting *setting, - const char *opt_name, - GVariant *variant) -{ - GVariant *old_variant; - gboolean changed_name; - gboolean changed_value; - GHashTable *hash; - - g_return_if_fail (NM_IS_SETTING (setting)); - g_return_if_fail (opt_name); - - hash = _nm_setting_option_hash (setting, variant != NULL); - - if (!variant) { - if (hash) { - if (g_hash_table_remove (hash, opt_name)) - _nm_setting_option_notify (setting, TRUE); - } - return; - } - - /* Currently, it is a bug setting any option, unless the setting type supports it. - * And currently, only NMSettingEthtool supports it. - * - * In the future, more setting types may support it. Or we may relax this so - * that options can be attached to all setting types (to indicate "unsupported" - * settings for forward compatibility). - * - * As it is today, internal code will only add gendata options to NMSettingEthtool, - * and there exists not public API to add such options. Still, it is permissible - * to call get(), clear() and set(variant=NULL) also on settings that don't support - * it, as these operations don't add options. - */ - g_return_if_fail (_nm_setting_class_get_sett_info (NM_SETTING_GET_CLASS (setting))->detail.gendata_info); - - old_variant = g_hash_table_lookup (hash, opt_name); - - changed_name = (old_variant == NULL); - changed_value = changed_name - || !g_variant_equal (old_variant, variant); - - /* We always want to replace the variant, even if it has - * the same value according to g_variant_equal(). The reason - * is that we want to take a reference on @variant, because - * that is what the user might expect. */ - g_hash_table_insert (hash, - g_strdup (opt_name), - g_variant_ref_sink (variant)); - - if (changed_value) - _nm_setting_option_notify (setting, !changed_name); +nm_setting_option_set(NMSetting *setting, const char *opt_name, GVariant *variant) +{ + GVariant * old_variant; + gboolean changed_name; + gboolean changed_value; + GHashTable *hash; + + g_return_if_fail(NM_IS_SETTING(setting)); + g_return_if_fail(opt_name); + + hash = _nm_setting_option_hash(setting, variant != NULL); + + if (!variant) { + if (hash) { + if (g_hash_table_remove(hash, opt_name)) + _nm_setting_option_notify(setting, TRUE); + } + return; + } + + /* Currently, it is a bug setting any option, unless the setting type supports it. + * And currently, only NMSettingEthtool supports it. + * + * In the future, more setting types may support it. Or we may relax this so + * that options can be attached to all setting types (to indicate "unsupported" + * settings for forward compatibility). + * + * As it is today, internal code will only add gendata options to NMSettingEthtool, + * and there exists not public API to add such options. Still, it is permissible + * to call get(), clear() and set(variant=NULL) also on settings that don't support + * it, as these operations don't add options. + */ + g_return_if_fail( + _nm_setting_class_get_sett_info(NM_SETTING_GET_CLASS(setting))->detail.gendata_info); + + old_variant = g_hash_table_lookup(hash, opt_name); + + changed_name = (old_variant == NULL); + changed_value = changed_name || !g_variant_equal(old_variant, variant); + + /* We always want to replace the variant, even if it has + * the same value according to g_variant_equal(). The reason + * is that we want to take a reference on @variant, because + * that is what the user might expect. */ + g_hash_table_insert(hash, g_strdup(opt_name), g_variant_ref_sink(variant)); + + if (changed_value) + _nm_setting_option_notify(setting, !changed_name); } /** @@ -2730,35 +2722,31 @@ nm_setting_option_set (NMSetting *setting, * Since: 1.26 */ void -nm_setting_option_set_boolean (NMSetting *setting, - const char *opt_name, - gboolean value) +nm_setting_option_set_boolean(NMSetting *setting, const char *opt_name, gboolean value) { - GVariant *old_variant; - gboolean changed_name; - gboolean changed_value; - GHashTable *hash; + GVariant * old_variant; + gboolean changed_name; + gboolean changed_value; + GHashTable *hash; - g_return_if_fail (NM_IS_SETTING (setting)); - g_return_if_fail (opt_name); + g_return_if_fail(NM_IS_SETTING(setting)); + g_return_if_fail(opt_name); - value = (!!value); + value = (!!value); - hash = _nm_setting_option_hash (setting, TRUE); + hash = _nm_setting_option_hash(setting, TRUE); - old_variant = g_hash_table_lookup (hash, opt_name); + old_variant = g_hash_table_lookup(hash, opt_name); - changed_name = (old_variant == NULL); - changed_value = changed_name - || ( !g_variant_is_of_type (old_variant, G_VARIANT_TYPE_BOOLEAN) - || g_variant_get_boolean (old_variant) != value); + changed_name = (old_variant == NULL); + changed_value = changed_name + || (!g_variant_is_of_type(old_variant, G_VARIANT_TYPE_BOOLEAN) + || g_variant_get_boolean(old_variant) != value); - g_hash_table_insert (hash, - g_strdup (opt_name), - g_variant_ref_sink (g_variant_new_boolean (value))); + g_hash_table_insert(hash, g_strdup(opt_name), g_variant_ref_sink(g_variant_new_boolean(value))); - if (changed_value) - _nm_setting_option_notify (setting, !changed_name); + if (changed_value) + _nm_setting_option_notify(setting, !changed_name); } /** @@ -2771,108 +2759,102 @@ nm_setting_option_set_boolean (NMSetting *setting, * Since: 1.26 */ void -nm_setting_option_set_uint32 (NMSetting *setting, - const char *opt_name, - guint32 value) +nm_setting_option_set_uint32(NMSetting *setting, const char *opt_name, guint32 value) { - GVariant *old_variant; - gboolean changed_name; - gboolean changed_value; - GHashTable *hash; + GVariant * old_variant; + gboolean changed_name; + gboolean changed_value; + GHashTable *hash; - g_return_if_fail (NM_IS_SETTING (setting)); - g_return_if_fail (opt_name); + g_return_if_fail(NM_IS_SETTING(setting)); + g_return_if_fail(opt_name); - hash = _nm_setting_option_hash (setting, TRUE); + hash = _nm_setting_option_hash(setting, TRUE); - old_variant = g_hash_table_lookup (hash, opt_name); + old_variant = g_hash_table_lookup(hash, opt_name); - changed_name = (old_variant == NULL); - changed_value = changed_name - || ( !g_variant_is_of_type (old_variant, G_VARIANT_TYPE_UINT32) - || g_variant_get_uint32 (old_variant) != value); + changed_name = (old_variant == NULL); + changed_value = changed_name + || (!g_variant_is_of_type(old_variant, G_VARIANT_TYPE_UINT32) + || g_variant_get_uint32(old_variant) != value); - g_hash_table_insert (hash, - g_strdup (opt_name), - g_variant_ref_sink (g_variant_new_uint32 (value))); + g_hash_table_insert(hash, g_strdup(opt_name), g_variant_ref_sink(g_variant_new_uint32(value))); - if (changed_value) - _nm_setting_option_notify (setting, !changed_name); + if (changed_value) + _nm_setting_option_notify(setting, !changed_name); } /*****************************************************************************/ static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) +get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { - NMSetting *setting = NM_SETTING (object); + NMSetting *setting = NM_SETTING(object); - switch (prop_id) { - case PROP_NAME: - g_value_set_string (value, nm_setting_get_name (setting)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } + switch (prop_id) { + case PROP_NAME: + g_value_set_string(value, nm_setting_get_name(setting)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + break; + } } /*****************************************************************************/ static void -nm_setting_init (NMSetting *setting) -{ -} +nm_setting_init(NMSetting *setting) +{} static void -finalize (GObject *object) +finalize(GObject *object) { - NMSettingPrivate *priv = NM_SETTING_GET_PRIVATE (object); + NMSettingPrivate *priv = NM_SETTING_GET_PRIVATE(object); - if (priv->gendata) { - g_free (priv->gendata->names); - g_free (priv->gendata->values); - g_hash_table_unref (priv->gendata->hash); - g_slice_free (GenData, priv->gendata); - } + if (priv->gendata) { + g_free(priv->gendata->names); + g_free(priv->gendata->values); + g_hash_table_unref(priv->gendata->hash); + g_slice_free(GenData, priv->gendata); + } - G_OBJECT_CLASS (nm_setting_parent_class)->finalize (object); + G_OBJECT_CLASS(nm_setting_parent_class)->finalize(object); } static void -nm_setting_class_init (NMSettingClass *setting_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (setting_class); - - g_type_class_add_private (setting_class, sizeof (NMSettingPrivate)); - - object_class->get_property = get_property; - object_class->finalize = finalize; - - setting_class->update_one_secret = update_one_secret; - setting_class->get_secret_flags = get_secret_flags; - setting_class->set_secret_flags = set_secret_flags; - setting_class->compare_property = compare_property; - setting_class->clear_secrets = clear_secrets; - setting_class->for_each_secret = for_each_secret; - setting_class->duplicate_copy_properties = duplicate_copy_properties; - setting_class->enumerate_values = enumerate_values; - setting_class->aggregate = aggregate; - setting_class->init_from_dbus = init_from_dbus; - - /** - * NMSetting:name: - * - * The setting's name, which uniquely identifies the setting within the - * connection. Each setting type has a name unique to that type, for - * example "ppp" or "802-11-wireless" or "802-3-ethernet". - **/ - obj_properties[PROP_NAME] = - g_param_spec_string (NM_SETTING_NAME, "", "", - NULL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS); - - g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties); +nm_setting_class_init(NMSettingClass *setting_class) +{ + GObjectClass *object_class = G_OBJECT_CLASS(setting_class); + + g_type_class_add_private(setting_class, sizeof(NMSettingPrivate)); + + object_class->get_property = get_property; + object_class->finalize = finalize; + + setting_class->update_one_secret = update_one_secret; + setting_class->get_secret_flags = get_secret_flags; + setting_class->set_secret_flags = set_secret_flags; + setting_class->compare_property = compare_property; + setting_class->clear_secrets = clear_secrets; + setting_class->for_each_secret = for_each_secret; + setting_class->duplicate_copy_properties = duplicate_copy_properties; + setting_class->enumerate_values = enumerate_values; + setting_class->aggregate = aggregate; + setting_class->init_from_dbus = init_from_dbus; + + /** + * NMSetting:name: + * + * The setting's name, which uniquely identifies the setting within the + * connection. Each setting type has a name unique to that type, for + * example "ppp" or "802-11-wireless" or "802-3-ethernet". + **/ + obj_properties[PROP_NAME] = g_param_spec_string(NM_SETTING_NAME, + "", + "", + NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties); } |