From: Arran Cudbard-Bell Date: Thu, 9 Feb 2023 16:44:57 +0000 (-0600) Subject: Add tmpl_attr_list_from_substr() to parse a list reference X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c0ceb9b333aac36efa23ed69fba4cebf0c7c75d0;p=thirdparty%2Ffreeradius-server.git Add tmpl_attr_list_from_substr() to parse a list reference --- diff --git a/src/lib/server/tmpl.h b/src/lib/server/tmpl.h index 73b960cd839..307f0b600d1 100644 --- a/src/lib/server/tmpl.h +++ b/src/lib/server/tmpl.h @@ -1013,6 +1013,8 @@ fr_radius_packet_t *tmpl_packet_ptr(request_t *request, tmpl_pair_list_t list_na TALLOC_CTX *tmpl_list_ctx(request_t *request, tmpl_pair_list_t list_name); size_t tmpl_pair_list_name(tmpl_pair_list_t *out, char const *name, tmpl_pair_list_t default_list) CC_HINT(nonnull); +fr_slen_t tmpl_attr_list_from_substr(fr_dict_attr_t const **da_p, fr_sbuff_t *in) CC_HINT(nonnull); + tmpl_t *tmpl_init_printf(tmpl_t *vpt, tmpl_type_t type, fr_token_t quote, char const *fmt, ...) CC_HINT(nonnull(1,4)); diff --git a/src/lib/server/tmpl_tokenize.c b/src/lib/server/tmpl_tokenize.c index 155cfc392c0..0923cd84a30 100644 --- a/src/lib/server/tmpl_tokenize.c +++ b/src/lib/server/tmpl_tokenize.c @@ -400,6 +400,34 @@ void tmpl_debug(tmpl_t const *vpt) * @{ */ +/** Parse one a single list reference + * + * @param[out] da_p attribute representing a list. + * @param[in] in Sbuff to read request references from. + * @return + * - > 0 the number of bytes parsed. + * - 0 no list qualifier found. + */ +fr_slen_t tmpl_attr_list_from_substr(fr_dict_attr_t const **da_p, fr_sbuff_t *in) +{ + fr_dict_attr_t const *da; + fr_sbuff_t our_in = FR_SBUFF(in); + + if (((fr_sbuff_adv_past_strcase(&our_in, request_attr_request->name, request_attr_request->name_len)) && + (da = request_attr_request)) || + ((fr_sbuff_adv_past_strcase(&our_in, request_attr_reply->name, request_attr_reply->name_len)) && + (da = request_attr_reply)) || + ((fr_sbuff_adv_past_strcase(&our_in, request_attr_control->name, request_attr_control->name_len)) && + (da = request_attr_control)) || + ((fr_sbuff_adv_past_strcase(&our_in, request_attr_state->name, request_attr_state->name_len)) && + (da = request_attr_state))) { + *da_p = da; + FR_SBUFF_SET_RETURN(in, &our_in); + } + + return 0; +} + /** Resolve attribute name to a #pair_list_t value. * * Check the name string for #pair_list_t qualifiers and write a #pair_list_t value