]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Revert "remove unused function"
authorAlan T. DeKok <aland@freeradius.org>
Tue, 25 Jan 2022 19:16:54 +0000 (14:16 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 25 Jan 2022 19:16:54 +0000 (14:16 -0500)
This reverts commit 8a5c44eaf76c5184874a0c63e330b33fbb226ab8.

src/lib/util/dict.h
src/lib/util/dict_util.c

index e8f3c99e60e358f2a97eb3fc9f0e49609513e5fd..563b0216ba4c1f0283fae52484b09ecb5c9f896a 100644 (file)
@@ -565,6 +565,8 @@ char const          *fr_dict_enum_name_by_value(fr_dict_attr_t const *da, fr_value_box_t
 
 fr_dict_enum_value_t           *fr_dict_enum_by_name(fr_dict_attr_t const *da, char const *name, ssize_t len);
 
+ssize_t                        fr_dict_enum_by_name_substr(fr_dict_enum_value_t **out, fr_dict_attr_t const *da, fr_sbuff_t *in);
+
 fr_slen_t              fr_dict_enum_name_from_substr(fr_sbuff_t *out, fr_sbuff_t *in, fr_sbuff_term_t const *tt);
 
 static inline fr_slen_t fr_dict_enum_name_afrom_substr(TALLOC_CTX *ctx, char **out, fr_sbuff_t *in, fr_sbuff_term_t const *tt)
index dab23cf3cfcc231d4be9d49c2e8b838651e4149a..d97d736f8676b406d35ac9a607ae8c0fe9a1b8b1 100644 (file)
@@ -2895,6 +2895,57 @@ fr_dict_enum_value_t *fr_dict_enum_by_name(fr_dict_attr_t const *da, char const
        return fr_hash_table_find(ext->value_by_name, &(fr_dict_enum_value_t){ .name = name, .name_len = len});
 }
 
+/*
+ *     Get a value by its name, keyed off of an attribute, from an sbuff
+ */
+ssize_t        fr_dict_enum_by_name_substr(fr_dict_enum_value_t **out, fr_dict_attr_t const *da, fr_sbuff_t *in)
+{
+       fr_dict_attr_ext_enumv_t        *ext;
+       fr_sbuff_t      our_in = FR_SBUFF(in);
+       fr_dict_enum_value_t *found = NULL;
+       size_t          found_len = 0;
+       uint8_t         *p;
+       uint8_t         name[FR_DICT_ENUM_MAX_NAME_LEN + 1];
+
+       /*
+        *      No values associated with this attribute, do nothing.
+        */
+       ext = fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_ENUMV);
+       if (!ext || !ext->value_by_name) return 0;
+
+       /*
+        *      Loop until we exhaust all of the possibilities.
+        */
+       for (p = name; (size_t) (p - name) < ext->max_name_len; p++) {
+               int len = (p - name) + 1;
+               fr_dict_enum_value_t *enumv;
+
+               *p = *fr_sbuff_current(&our_in);
+               if (!fr_dict_attr_allowed_chars[*p]) {
+                       break;
+               }
+               fr_sbuff_next(&our_in);
+
+               enumv = fr_hash_table_find(ext->value_by_name, &(fr_dict_enum_value_t){ .name = (char const *) name,
+                                                                                       .name_len = len});
+
+               /*
+                *      Return the LONGEST match, as there may be
+                *      overlaps.  e.g. "Framed", and "Framed-User".
+                */
+               if (enumv) {
+                       found = enumv;
+                       found_len = len;
+               }
+       }
+
+       if (found) {
+               *out = found;
+               return fr_sbuff_set(in, found_len);
+       }
+
+       return 0;
+}
 
 /** Extract an enumeration name from a string
  *