{
int rcode = 0;
fr_pair_t *vp, *dst;
- fr_pair_list_t *list, head;
+ fr_pair_list_t *list, src_list;
request_t *context, *tmp_ctx = NULL;
TALLOC_CTX *parent;
- fr_dcursor_t dst_list, src_list;
+ fr_dcursor_t dst_list;
bool found = false;
tmpl_cursor_ctx_t cc = {};
- fr_pair_list_init(&head);
+ fr_pair_list_init(&src_list);
MAP_VERIFY(map);
fr_assert(map->lhs != NULL);
fr_assert(map->rhs != NULL);
tmp_ctx = talloc_pool(request, 1024);
- fr_dcursor_init(&src_list, &tmp_list);
/*
* Preprocessing of the LHS of the map.
* VPs to work with.
*/
if (!tmpl_is_null(map->rhs)) {
- rcode = func(parent, &head, request, map, ctx);
+ rcode = func(parent, &src_list, request, map, ctx);
if (rcode < 0) {
- fr_assert(fr_pair_list_empty(tmp_list));
+ fr_assert(fr_pair_list_empty(&src_list));
goto finish;
}
- if (fr_pair_list_empty(tmp_list)) {
+ if (fr_pair_list_empty(&src_list)) {
RDEBUG2("%.*s skipped: No values available", (int)map->lhs->len, map->lhs->name);
goto finish;
}
switch (map->op) {
case T_OP_CMP_FALSE:
/* We don't need the src VPs (should just be 'ANY') */
- fr_assert(fr_pair_list_empty(tmp_list));
+ fr_assert(fr_pair_list_empty(&src_list));
/* Clear the entire dst list */
fr_pair_list_free(list);
case T_OP_SET:
if (tmpl_is_list(map->rhs)) {
- fr_pair_list_free(list);
- *list = head;
- fr_pair_list_init(&head);
+ fr_pair_list_clear(list);
+ fr_tmp_pair_list_move(list, &src_list);
+ fr_pair_list_init(&src_list);
} else {
FALL_THROUGH;
FALL_THROUGH;
case T_OP_ADD:
- fr_pair_list_move(list, &head);
- fr_pair_list_free(&head);
+ fr_pair_list_move(list, &src_list);
+ fr_pair_list_clear(&src_list);
}
goto update;
default:
- fr_pair_list_free(&head);
+ fr_pair_list_free(&src_list);
rcode = -1;
goto finish;
}
*/
case T_OP_CMP_FALSE:
/* We don't need the src VPs (should just be 'ANY') */
- fr_assert(fr_pair_list_empty(tmp_list));
+ fr_assert(fr_pair_list_empty(&src_list));
if (!dst) goto finish;
/*
* We've found the Nth one. Delete it, and only it.
*/
} else {
- fr_pair_list_free(&dst);
dst = fr_dcursor_remove(&dst_list);
+ talloc_free(dst);
}
/*
case T_OP_SUB:
/* We didn't find any attributes earlier */
if (!dst) {
- fr_pair_list_free(&head);
+ fr_pair_list_free(&src_list);
goto finish;
}
}
}
rcode = 0;
- fr_pair_list_free(&head);
+ fr_pair_list_free(&src_list);
if (!found) goto finish;
goto update;
}
}
}
rcode = 0;
- fr_pair_list_free(&head);
+ fr_pair_list_free(&src_list);
if (!found) goto finish;
goto update;
}
if (dst) {
RDEBUG3("Refusing to overwrite (use :=)");
- fr_pair_list_free(&head);
+ fr_pair_list_free(&src_list);
goto finish;
}
/*
* Need to copy src to all dsts
*/
- src_vp = fr_dcursor_head(&src_list);
+ src_vp = fr_pair_list_head(&src_list);
if (!src_vp) {
fr_dlist_talloc_free(&leaf);
rcode = -1;
}
/* Free any we didn't insert */
- fr_pair_list_free(&head);
+ fr_pair_list_free(&src_list);
fr_assert(fr_dlist_num_elements(&interior) == 0);
fr_assert(fr_dlist_num_elements(&leaf) == 0);
}
} else {
extent = fr_dlist_head(&leaf);
if (dst) {
- DEBUG_OVERWRITE(dst, fr_dcursor_current(&src_list));
+ DEBUG_OVERWRITE(dst, src_vp);
dst = fr_dcursor_replace(&dst_list, fr_pair_copy(extent->list_ctx, src_vp));
talloc_free(dst);
} else {
}
/* Free any we didn't insert */
- fr_pair_list_free(&head);
+ fr_pair_list_free(&src_list);
fr_assert(fr_dlist_num_elements(&interior) == 0);
fr_dlist_talloc_free(&leaf);
}
if (fr_dlist_num_elements(&leaf) > 1) {
while ((extent = fr_dlist_tail(&leaf))) {
- fr_pair_list_copy(extent->list_ctx, extent->list, &head);
+ fr_pair_list_copy(extent->list_ctx, extent->list, &src_list);
fr_dlist_talloc_free_tail(&leaf);
}
/* Free all the src vps */
- fr_pair_list_free(&head);
+ fr_pair_list_free(&src_list);
} else {
extent = fr_dlist_head(&leaf);
- fr_pair_list_copy(extent->list_ctx, extent->list, &head);
+ fr_pair_list_copy(extent->list_ctx, extent->list, &src_list);
fr_dlist_talloc_free_head(&leaf);
}
- fr_pair_list_free(&head);
+ fr_pair_list_free(&src_list);
fr_assert(fr_dlist_num_elements(&interior) == 0);
fr_assert(fr_dlist_num_elements(&leaf) == 0);
}
{
fr_pair_t *a, *b;
- fr_pair_list_sort(&head, fr_pair_cmp_by_da);
+ fr_pair_list_sort(&src_list, fr_pair_cmp_by_da);
fr_pair_list_sort(list, fr_pair_cmp_by_da);
fr_dcursor_head(&dst_list);
}
if (!a) break; /* end of the list */
}
- fr_pair_list_free(&head);
+ fr_pair_list_free(&src_list);
}
break;
}
update:
- fr_assert(fr_pair_list_empty(tmp_list));
+ fr_assert(fr_pair_list_empty(&src_list));
finish:
tmpl_cursor_clear(&cc);