]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
add tmpl_value_list_insert_tail() which does casting, too.
authorAlan T. DeKok <aland@freeradius.org>
Tue, 7 Jun 2022 22:35:27 +0000 (18:35 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Fri, 17 Jun 2022 12:31:56 +0000 (08:31 -0400)
instead of similar code scattered everywhere.

src/lib/server/tmpl.h
src/lib/server/tmpl_eval.c

index c99de40d649684604f1c0b4b54bc85cb0ff83a39..da08345fbbaaefe6a71dc6ec05b0e770a8794849 100644 (file)
@@ -1058,6 +1058,8 @@ bool                      tmpl_async_required(tmpl_t const *vpt) CC_HINT(nonnull);
 
 fr_pair_t              *tmpl_get_list(request_t *request, tmpl_t const *vpt) CC_HINT(nonnull(2)); /* temporary hack */
 
+int                    tmpl_value_list_insert_tail(fr_value_box_list_t *list, fr_value_box_t *vb, tmpl_t const *vpt) CC_HINT(nonnull);
+
 #undef _CONST
 
 #ifdef __cplusplus
index 61dfcca83a8f8c0b87035342d91a64ebcb288f4f..40d7465c65d00ced21c57fb434cf5bfe0a89257a 100644 (file)
@@ -1000,3 +1000,26 @@ int tmpl_find_or_add_vp(fr_pair_t **out, request_t *request, tmpl_t const *vpt)
                return err;
        }
 }
+
+/** Insert a value-box to a list, with casting.
+ *
+ * @param list to append to
+ * @param box  box to cast / append
+ * @param vpt  tmpl with cast.
+ * @return
+ *     - <0 for "cast failed"
+ *     - 0 for success
+ */
+int tmpl_value_list_insert_tail(fr_value_box_list_t *list, fr_value_box_t *box, tmpl_t const *vpt)
+{
+       if (fr_type_is_null(tmpl_rules_cast(vpt)) ||
+           (box->type == tmpl_rules_cast(vpt))) {
+               fr_dlist_insert_tail(list, box);
+               return 0;
+       }
+
+       if (fr_value_box_cast_in_place(box, box, tmpl_rules_cast(vpt), tmpl_rules_enumv(vpt)) < 0) return -1;
+
+       fr_dlist_insert_tail(list, box);
+       return 0;
+}