]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Add tmpl_attr_list_from_substr() to parse a list reference
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 9 Feb 2023 16:44:57 +0000 (10:44 -0600)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 9 Feb 2023 16:44:57 +0000 (10:44 -0600)
src/lib/server/tmpl.h
src/lib/server/tmpl_tokenize.c

index 73b960cd83986dace3629d27e12fcc28c81b60cf..307f0b600d19d463a19043cf4eb254ab4b3df1b9 100644 (file)
@@ -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));
 
index 155cfc392c0f3004fae389a8605a7b818717f8bf..0923cd84a30c783bfce45a4d4288af81e1eb265f 100644 (file)
@@ -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