summary refs log tree commit diff
path: root/src/libnmc-setting/nm-meta-setting-base-impl.c
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2022-05-04 15:35:24 +0200
committerMichael Biebl <biebl@debian.org>2022-05-04 15:35:24 +0200
commit9959fdb2e8ddd06f2161798ca0a39c77d67c652d (patch)
tree2ce24a336d2b1c5fd5dec3090db312eded6c78ba /src/libnmc-setting/nm-meta-setting-base-impl.c
parent8c623dddbdebe354cb94bfc559a5371a14865317 (diff)
New upstream version 1.37.92 upstream/1.37.92
Diffstat (limited to 'src/libnmc-setting/nm-meta-setting-base-impl.c')
-rw-r--r--src/libnmc-setting/nm-meta-setting-base-impl.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/libnmc-setting/nm-meta-setting-base-impl.c b/src/libnmc-setting/nm-meta-setting-base-impl.c
index cd55779f..69daa76c 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[] = {