diff --git a/shared/nm-meta-setting.c b/shared/nm-meta-setting.c index 00221dac6a..4ef07d85e5 100644 --- a/shared/nm-meta-setting.c +++ b/shared/nm-meta-setting.c @@ -408,15 +408,44 @@ const NMMetaSettingInfo nm_meta_setting_infos[] = { const NMMetaSettingInfo * nm_meta_setting_infos_by_name (const char *name) { - int i; + gssize idx; + +#if NM_MORE_ASSERTS > 10 + { + guint i, j; - if (name) { for (i = 0; i < _NM_META_SETTING_TYPE_NUM; i++) { - if (nm_streq (nm_meta_setting_infos[i].setting_name, name)) - return &nm_meta_setting_infos[i]; + const NMMetaSettingInfo *setting_info = &nm_meta_setting_infos[i]; + + nm_assert (setting_info->meta_type == (NMMetaSettingType) i); + nm_assert (setting_info->setting_name); + nm_assert (setting_info->setting_name[0]); + nm_assert (setting_info->get_setting_gtype); + nm_assert (setting_info->setting_priority != NM_SETTING_PRIORITY_INVALID); + if ( i > 0 + && strcmp (nm_meta_setting_infos[i - 1].setting_name, setting_info->setting_name) >= 0) { + g_error ("nm_meta_setting_infos[%u, \"%s\"] is wrongly sorted before nm_meta_setting_infos[%u, \"%s\"]. Rearange NMMetaSettingType enum", + i - 1, nm_meta_setting_infos[i - 1].setting_name, + i, setting_info->setting_name); + } + for (j = 0; j < i; j++) { + const NMMetaSettingInfo *s = &nm_meta_setting_infos[j]; + + nm_assert (setting_info->get_setting_gtype != s->get_setting_gtype); + } } } - return NULL; +#endif + + G_STATIC_ASSERT_EXPR (G_STRUCT_OFFSET (NMMetaSettingInfo, setting_name) == 0); + idx = nm_utils_array_find_binary_search (nm_meta_setting_infos, + sizeof (NMMetaSettingInfo), + _NM_META_SETTING_TYPE_NUM, + &name, + nm_strcmp_p_with_data, + NULL); + + return idx >= 0 ? &nm_meta_setting_infos[idx] : NULL; } const NMMetaSettingInfo * diff --git a/shared/nm-meta-setting.h b/shared/nm-meta-setting.h index 28091ff98e..677ae4c00d 100644 --- a/shared/nm-meta-setting.h +++ b/shared/nm-meta-setting.h @@ -97,8 +97,18 @@ extern const NMSetting8021xSchemeVtable nm_setting_8021x_scheme_vtable[_NM_SETTI /*****************************************************************************/ typedef enum { + /* the enum (and their numeric values) are internal API. Do not assign + * any meaning the numeric values, because they already have one: + * + * they are sorted in a way, that corresponds to the asciibetical sort + * order of the corresponding setting-name. */ + NM_META_SETTING_TYPE_6LOWPAN, + NM_META_SETTING_TYPE_OLPC_MESH, + NM_META_SETTING_TYPE_WIRELESS, + NM_META_SETTING_TYPE_WIRELESS_SECURITY, NM_META_SETTING_TYPE_802_1X, + NM_META_SETTING_TYPE_WIRED, NM_META_SETTING_TYPE_ADSL, NM_META_SETTING_TYPE_BLUETOOTH, NM_META_SETTING_TYPE_BOND, @@ -111,12 +121,11 @@ typedef enum { NM_META_SETTING_TYPE_GENERIC, NM_META_SETTING_TYPE_GSM, NM_META_SETTING_TYPE_INFINIBAND, + NM_META_SETTING_TYPE_IP_TUNNEL, NM_META_SETTING_TYPE_IP4_CONFIG, NM_META_SETTING_TYPE_IP6_CONFIG, - NM_META_SETTING_TYPE_IP_TUNNEL, NM_META_SETTING_TYPE_MACSEC, NM_META_SETTING_TYPE_MACVLAN, - NM_META_SETTING_TYPE_OLPC_MESH, NM_META_SETTING_TYPE_OVS_BRIDGE, NM_META_SETTING_TYPE_OVS_INTERFACE, NM_META_SETTING_TYPE_OVS_PATCH, @@ -135,9 +144,6 @@ typedef enum { NM_META_SETTING_TYPE_VPN, NM_META_SETTING_TYPE_VXLAN, NM_META_SETTING_TYPE_WIMAX, - NM_META_SETTING_TYPE_WIRED, - NM_META_SETTING_TYPE_WIRELESS, - NM_META_SETTING_TYPE_WIRELESS_SECURITY, NM_META_SETTING_TYPE_WPAN, NM_META_SETTING_TYPE_UNKNOWN, @@ -163,10 +169,10 @@ typedef enum { #define _NMMetaSettingInfoXX _NMMetaSettingInfoCli #endif struct _NMMetaSettingInfoXX { - NMMetaSettingType meta_type; - NMSettingPriority setting_priority; const char *setting_name; GType (*get_setting_gtype) (void); + NMMetaSettingType meta_type; + NMSettingPriority setting_priority; }; typedef struct _NMMetaSettingInfoXX NMMetaSettingInfo;