From: Alan T. DeKok Date: Fri, 27 Oct 2023 22:28:47 +0000 (-0400) Subject: add "find last by da" API X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=51e58f62139ba5da5f70df82c1b735f9f6ec2406;p=thirdparty%2Ffreeradius-server.git add "find last by da" API --- diff --git a/src/lib/util/pair.c b/src/lib/util/pair.c index fa723e295c1..1b2a54462a3 100644 --- a/src/lib/util/pair.c +++ b/src/lib/util/pair.c @@ -699,6 +699,30 @@ fr_pair_t *fr_pair_find_by_da(fr_pair_list_t const *list, fr_pair_t const *prev, return NULL; } +/** Find the last pair with a matching da + * + * @param[in] list to search in. + * @param[in] prev the previous attribute in the list. + * @param[in] da the previous da to find. + * @return + * - first matching fr_pair_t. + * - NULL if no fr_pair_ts match. + * + * @hidecallergraph + */ +fr_pair_t *fr_pair_find_last_by_da(fr_pair_list_t const *list, fr_pair_t const *prev, fr_dict_attr_t const *da) +{ + fr_pair_t *vp = UNCONST(fr_pair_t *, prev); + + if (fr_pair_list_empty(list)) return NULL; + + PAIR_LIST_VERIFY(list); + + while ((vp = fr_pair_list_prev(list, vp))) if (da == vp->da) return vp; + + return NULL; +} + /** Find a pair with a matching da at a given index * * @param[in] list to search in. diff --git a/src/lib/util/pair.h b/src/lib/util/pair.h index 1d91edc4879..5e7fc7b66c3 100644 --- a/src/lib/util/pair.h +++ b/src/lib/util/pair.h @@ -483,6 +483,9 @@ fr_pair_t *fr_pair_find_by_da_idx(fr_pair_list_t const *list, fr_pair_t *fr_pair_find_by_da_nested(fr_pair_list_t const *list, fr_pair_t const *prev, fr_dict_attr_t const *da) CC_HINT(nonnull(1,3)); +fr_pair_t *fr_pair_find_last_by_da(fr_pair_list_t const *list, + fr_pair_t const *prev, fr_dict_attr_t const *da) CC_HINT(nonnull(1,3)); + fr_pair_t *fr_pair_find_by_child_num(fr_pair_list_t const *list, fr_pair_t const *prev, fr_dict_attr_t const *parent, unsigned int attr) CC_HINT(nonnull(1,3));