]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
add cf_item_insert_after()
authorAlan T. DeKok <aland@freeradius.org>
Tue, 15 Nov 2022 15:10:36 +0000 (10:10 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Thu, 17 Nov 2022 12:34:48 +0000 (07:34 -0500)
for use with automagically rewriting edit sections

src/lib/server/cf_util.c
src/lib/server/cf_util.h

index 1ca457e06b20bae0a3af4d177defd3054b9e10e4..6934d0960ba9b3383b1282a3e979d630a88b150f 100644 (file)
@@ -374,6 +374,38 @@ void _cf_item_add(CONF_ITEM *parent, CONF_ITEM *child)
        fr_dlist_insert_tail(&parent->children, child); /* Append to the list of children */
 }
 
+/** Insert a child after a given one
+ *
+ * @param[in] parent   to add child to.
+ * @param[in] prev     previous
+ * @param[in] child    to add.
+ */
+void _cf_item_insert_after(CONF_ITEM *parent, CONF_ITEM *prev, CONF_ITEM *child)
+{
+       fr_assert(parent != child);
+       fr_assert(prev != child);
+
+       /*
+        *      Must be given something.  Can't insert at HEAD.
+        */
+       if (!parent || !child) return;
+
+       if (!prev) {
+               cf_item_add(parent, child);
+               return;
+       }
+
+       /*
+        *      If there's a prev, then the ident trees must be there.
+        */
+       fr_assert(parent->ident1 != NULL);
+       fr_assert(parent->ident2 != NULL);
+
+       fr_rb_insert(parent->ident1, child);
+       fr_rb_insert(parent->ident2, child);                    /* NULL ident2 is still a value */
+       fr_dlist_insert_after(&parent->children, prev, child);  /* insert in the list of children */
+}
+
 /** Remove item from parent and fixup trees
  *
  * @param[in] parent   to remove child from.
index ff1f1836ecbd5f5909c6a5ed8e9214d2b899c981..38ddcc03030691876ebf86f3ca1d606af50f804d 100644 (file)
@@ -86,6 +86,9 @@ typedef int (*cf_walker_t)(void *data, void *ctx);
 #define                cf_item_add(_parent, _child) _cf_item_add(CF_TO_ITEM(_parent), CF_TO_ITEM(_child))
 void           _cf_item_add(CONF_ITEM *parent, CONF_ITEM *child);
 
+#define                cf_item_insert_after(_parent, _prev, _child) _cf_item_insert_after(CF_TO_ITEM(_parent), CF_TO_ITEM(_prev), CF_TO_ITEM(_child))
+void           _cf_item_insert_after(CONF_ITEM *parent, CONF_ITEM *prev, CONF_ITEM *child);
+
 #define                cf_item_remove(_parent, _child) _cf_item_remove(CF_TO_ITEM(_parent), CF_TO_ITEM(_child))
 CONF_ITEM      *_cf_item_remove(CONF_ITEM *parent, CONF_ITEM *child);