summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2022-03-23 12:49:32 +0100
committerThomas Haller <thaller@redhat.com>2022-03-28 18:27:36 +0200
commite965aa2536eb216b35ce5e8457c0b6c597b21352 (patch)
tree83523cdc4b94223a92dccbb0d9f5763f627935b4
parent22dcfb3a6770e9893440f6a99bed3aaf16e083b8 (diff)
downloadNetworkManager-e965aa2536eb216b35ce5e8457c0b6c597b21352.tar.gz
libnm: add nm_setting_8021x_scheme_vtable_by_setting_key() helper
Add function to lookup the vtable by name. Implement a binary search.
-rw-r--r--src/libnm-core-impl/nm-meta-setting-base-impl.c62
-rw-r--r--src/libnm-core-intern/nm-meta-setting-base-impl.h4
-rw-r--r--src/libnmc-setting/nm-meta-setting-base-impl.c62
-rw-r--r--src/libnmc-setting/nm-meta-setting-base-impl.h4
4 files changed, 130 insertions, 2 deletions
diff --git a/src/libnm-core-impl/nm-meta-setting-base-impl.c b/src/libnm-core-impl/nm-meta-setting-base-impl.c
index cd55779f11..69daa76c9d 100644
--- a/src/libnm-core-impl/nm-meta-setting-base-impl.c
+++ b/src/libnm-core-impl/nm-meta-setting-base-impl.c
@@ -153,6 +153,68 @@ const NMSetting8021xSchemeVtable nm_setting_8021x_scheme_vtable[] = {
#undef _D
};
+const NMSetting8021xSchemeVtable *
+nm_setting_8021x_scheme_vtable_by_setting_key(const char *key)
+{
+ static const NMSetting8021xSchemeType sorted_index[] = {
+ NM_SETTING_802_1X_SCHEME_TYPE_CA_CERT,
+ NM_SETTING_802_1X_SCHEME_TYPE_CLIENT_CERT,
+ NM_SETTING_802_1X_SCHEME_TYPE_PHASE2_CA_CERT,
+ NM_SETTING_802_1X_SCHEME_TYPE_PHASE2_CLIENT_CERT,
+ NM_SETTING_802_1X_SCHEME_TYPE_PHASE2_PRIVATE_KEY,
+ NM_SETTING_802_1X_SCHEME_TYPE_PRIVATE_KEY,
+ };
+ int imin, imax;
+
+ nm_assert(key);
+
+ if (NM_MORE_ASSERT_ONCE(5)) {
+ const NMSetting8021xSchemeVtable *vtable_prev = NULL;
+ int i, j;
+
+ for (i = 0; i < (int) G_N_ELEMENTS(sorted_index); i++) {
+ const NMSetting8021xSchemeType t = sorted_index[i];
+ const NMSetting8021xSchemeVtable *vtable;
+
+ nm_assert(_NM_INT_NOT_NEGATIVE(t));
+ nm_assert(t < G_N_ELEMENTS(nm_setting_8021x_scheme_vtable) - 1);
+
+ for (j = 0; j < i; j++)
+ nm_assert(t != sorted_index[j]);
+
+ vtable = &nm_setting_8021x_scheme_vtable[t];
+
+ nm_assert(vtable->scheme_type == t);
+ nm_assert(vtable->setting_key);
+
+ if (vtable_prev)
+ nm_assert(strcmp(vtable_prev->setting_key, vtable->setting_key) < 0);
+ vtable_prev = vtable;
+ }
+ }
+
+ imin = 0;
+ imax = G_N_ELEMENTS(sorted_index) - 1;
+ while (imin <= imax) {
+ const NMSetting8021xSchemeVtable *vtable;
+ const int imid = imin + (imax - imin) / 2;
+ int cmp;
+
+ vtable = &nm_setting_8021x_scheme_vtable[sorted_index[imid]];
+
+ cmp = strcmp(vtable->setting_key, key);
+ if (cmp == 0)
+ return vtable;
+
+ if (cmp < 0)
+ imin = imid + 1;
+ else
+ imax = imid - 1;
+ }
+
+ return NULL;
+}
+
/*****************************************************************************/
const NMMetaSettingInfo nm_meta_setting_infos[] = {
diff --git a/src/libnm-core-intern/nm-meta-setting-base-impl.h b/src/libnm-core-intern/nm-meta-setting-base-impl.h
index b1f1263693..1268865954 100644
--- a/src/libnm-core-intern/nm-meta-setting-base-impl.h
+++ b/src/libnm-core-intern/nm-meta-setting-base-impl.h
@@ -51,7 +51,7 @@ typedef enum /*< skip >*/ {
/*****************************************************************************/
-typedef enum {
+typedef enum _nm_packed {
NM_SETTING_802_1X_SCHEME_TYPE_CA_CERT,
NM_SETTING_802_1X_SCHEME_TYPE_PHASE2_CA_CERT,
NM_SETTING_802_1X_SCHEME_TYPE_CLIENT_CERT,
@@ -92,6 +92,8 @@ typedef struct {
extern const NMSetting8021xSchemeVtable
nm_setting_8021x_scheme_vtable[_NM_SETTING_802_1X_SCHEME_TYPE_NUM + 1];
+const NMSetting8021xSchemeVtable *nm_setting_8021x_scheme_vtable_by_setting_key(const char *key);
+
/*****************************************************************************/
typedef enum _nm_packed {
diff --git a/src/libnmc-setting/nm-meta-setting-base-impl.c b/src/libnmc-setting/nm-meta-setting-base-impl.c
index cd55779f11..69daa76c9d 100644
--- a/src/libnmc-setting/nm-meta-setting-base-impl.c
+++ b/src/libnmc-setting/nm-meta-setting-base-impl.c
@@ -153,6 +153,68 @@ const NMSetting8021xSchemeVtable nm_setting_8021x_scheme_vtable[] = {
#undef _D
};
+const NMSetting8021xSchemeVtable *
+nm_setting_8021x_scheme_vtable_by_setting_key(const char *key)
+{
+ static const NMSetting8021xSchemeType sorted_index[] = {
+ NM_SETTING_802_1X_SCHEME_TYPE_CA_CERT,
+ NM_SETTING_802_1X_SCHEME_TYPE_CLIENT_CERT,
+ NM_SETTING_802_1X_SCHEME_TYPE_PHASE2_CA_CERT,
+ NM_SETTING_802_1X_SCHEME_TYPE_PHASE2_CLIENT_CERT,
+ NM_SETTING_802_1X_SCHEME_TYPE_PHASE2_PRIVATE_KEY,
+ NM_SETTING_802_1X_SCHEME_TYPE_PRIVATE_KEY,
+ };
+ int imin, imax;
+
+ nm_assert(key);
+
+ if (NM_MORE_ASSERT_ONCE(5)) {
+ const NMSetting8021xSchemeVtable *vtable_prev = NULL;
+ int i, j;
+
+ for (i = 0; i < (int) G_N_ELEMENTS(sorted_index); i++) {
+ const NMSetting8021xSchemeType t = sorted_index[i];
+ const NMSetting8021xSchemeVtable *vtable;
+
+ nm_assert(_NM_INT_NOT_NEGATIVE(t));
+ nm_assert(t < G_N_ELEMENTS(nm_setting_8021x_scheme_vtable) - 1);
+
+ for (j = 0; j < i; j++)
+ nm_assert(t != sorted_index[j]);
+
+ vtable = &nm_setting_8021x_scheme_vtable[t];
+
+ nm_assert(vtable->scheme_type == t);
+ nm_assert(vtable->setting_key);
+
+ if (vtable_prev)
+ nm_assert(strcmp(vtable_prev->setting_key, vtable->setting_key) < 0);
+ vtable_prev = vtable;
+ }
+ }
+
+ imin = 0;
+ imax = G_N_ELEMENTS(sorted_index) - 1;
+ while (imin <= imax) {
+ const NMSetting8021xSchemeVtable *vtable;
+ const int imid = imin + (imax - imin) / 2;
+ int cmp;
+
+ vtable = &nm_setting_8021x_scheme_vtable[sorted_index[imid]];
+
+ cmp = strcmp(vtable->setting_key, key);
+ if (cmp == 0)
+ return vtable;
+
+ if (cmp < 0)
+ imin = imid + 1;
+ else
+ imax = imid - 1;
+ }
+
+ return NULL;
+}
+
/*****************************************************************************/
const NMMetaSettingInfo nm_meta_setting_infos[] = {
diff --git a/src/libnmc-setting/nm-meta-setting-base-impl.h b/src/libnmc-setting/nm-meta-setting-base-impl.h
index b1f1263693..1268865954 100644
--- a/src/libnmc-setting/nm-meta-setting-base-impl.h
+++ b/src/libnmc-setting/nm-meta-setting-base-impl.h
@@ -51,7 +51,7 @@ typedef enum /*< skip >*/ {
/*****************************************************************************/
-typedef enum {
+typedef enum _nm_packed {
NM_SETTING_802_1X_SCHEME_TYPE_CA_CERT,
NM_SETTING_802_1X_SCHEME_TYPE_PHASE2_CA_CERT,
NM_SETTING_802_1X_SCHEME_TYPE_CLIENT_CERT,
@@ -92,6 +92,8 @@ typedef struct {
extern const NMSetting8021xSchemeVtable
nm_setting_8021x_scheme_vtable[_NM_SETTING_802_1X_SCHEME_TYPE_NUM + 1];
+const NMSetting8021xSchemeVtable *nm_setting_8021x_scheme_vtable_by_setting_key(const char *key);
+
/*****************************************************************************/
typedef enum _nm_packed {