]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
add "find last by da" API
authorAlan T. DeKok <aland@freeradius.org>
Fri, 27 Oct 2023 22:28:47 +0000 (18:28 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Fri, 27 Oct 2023 22:28:47 +0000 (18:28 -0400)
src/lib/util/pair.c
src/lib/util/pair.h

index fa723e295c14dd74cd5e16cf8d4f22260eec6357..1b2a54462a38a3ea0c2b0d8b9307429b92e1f2a8 100644 (file)
@@ -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.
index 1d91edc4879eeac9911629b8c74a589a3b5fba29..5e7fc7b66c322ff6e3f92da98789849f880fbeaa 100644 (file)
@@ -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));