From: Alan T. DeKok Date: Tue, 25 Jan 2022 19:16:54 +0000 (-0500) Subject: Revert "remove unused function" X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=48831ee726328fde3724b203fec2a89155d5e76c;p=thirdparty%2Ffreeradius-server.git Revert "remove unused function" This reverts commit 8a5c44eaf76c5184874a0c63e330b33fbb226ab8. --- diff --git a/src/lib/util/dict.h b/src/lib/util/dict.h index e8f3c99e60..563b0216ba 100644 --- a/src/lib/util/dict.h +++ b/src/lib/util/dict.h @@ -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) diff --git a/src/lib/util/dict_util.c b/src/lib/util/dict_util.c index dab23cf3cf..d97d736f86 100644 --- a/src/lib/util/dict_util.c +++ b/src/lib/util/dict_util.c @@ -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 *