static int lyd_insert_sibling(struct lyd_node *sibling, struct lyd_node *node, int before) { struct lys_node *par1, *par2; struct lyd_node *iter, *last; if (sibling == node) { return EXIT_SUCCESS; } /* check placing the node to the appropriate place according to the schema */ for (par1 = lys_parent(sibling->schema); par1 && !(par1->nodetype & (LYS_CONTAINER | LYS_LIST | LYS_INPUT | LYS_OUTPUT | LYS_NOTIF)); par1 = lys_parent(par1)); for (par2 = lys_parent(node->schema); par2 && !(par2->nodetype & (LYS_CONTAINER | LYS_LIST | LYS_INPUT | LYS_OUTPUT | LYS_NOTIF)); par2 = lys_parent(par2)); if (par1 != par2) { ly_errno = LY_EINVAL; return EXIT_FAILURE; } if (node->parent || node->prev->next) { lyd_unlink(node); } LY_TREE_FOR(node, iter) { iter->parent = sibling->parent; last = iter; }
static void test_instid_unlink(void **state) { struct state *st = (*state); struct lyd_node *node; int r; node = st->data->child->prev; lyd_unlink(node); r = lyd_validate(st->data, 0); assert_int_not_equal(r, 0); lyd_insert(st->data, node); r = lyd_validate(st->data, 0); assert_int_equal(r, 0); }
static void test_leafref_unlink(void **state) { struct state *st = (*state); struct lyd_node *node; int r; node = st->data->child->child->next; lyd_unlink(node); r = lyd_validate(&(st->data), LYD_OPT_CONFIG, NULL); assert_int_not_equal(r, 0); lyd_insert(st->data->child, node); r = lyd_validate(&(st->data), LYD_OPT_CONFIG, NULL); assert_int_equal(r, 0); }
API int lyd_insert(struct lyd_node *parent, struct lyd_node *node) { struct lys_node *sparent; struct lyd_node *iter; if (!node || !parent) { ly_errno = LY_EINVAL; return EXIT_FAILURE; } /* check placing the node to the appropriate place according to the schema (if LYS_OUTPUT is returned, * the parent's schema will never match and it fails as it should) */ for (sparent = lys_parent(node->schema); sparent && !(sparent->nodetype & (LYS_CONTAINER | LYS_LIST | LYS_RPC | LYS_OUTPUT | LYS_NOTIF)); sparent = lys_parent(sparent)); if (sparent != parent->schema) { return EXIT_FAILURE; } if (node->parent || node->prev->next) { lyd_unlink(node); } if (!parent->child) { /* add as the only child of the parent */ parent->child = node; } else { /* add as the last child of the parent */ parent->child->prev->next = node; node->prev = parent->child->prev; for (iter = node; iter->next; iter = iter->next); parent->child->prev = iter; } LY_TREE_FOR(node, iter) { iter->parent = parent; } return EXIT_SUCCESS; }