#endif
#include <freeradius-devel/util/table.h>
+#include <freeradius-devel/util/dlist.h>
/** The maximum number of request references allowed
*
///< may be resolved later.
} tmpl_attr_type_t;
+#define tmpl_attr_is_normal(_ar) (_ar->ar_type == TMPL_ATTR_TYPE_NORMAL)
+#define tmpl_attr_is_unknown(_ar) (_ar->ar_type == TMPL_ATTR_TYPE_UNKNOWN)
+#define tmpl_attr_is_unresolved(_ar) (_ar->ar_type == TMPL_ATTR_TYPE_UNRESOLVED)
+
+
#define NUM_ANY INT16_MIN
#define NUM_ALL (INT16_MIN + 1)
#define NUM_COUNT (INT16_MIN + 2)
#define NUM_LAST (INT16_MIN + 3)
+/** Define entry and head types for attribute reference lists
+ *
+ */
+FR_DLIST_TYPES(tmpl_attr)
+
/** An element in a list of nested attribute references
*
*/
typedef struct {
- fr_dlist_t _CONST entry; //!< Entry in the doubly linked list
+ FR_DLIST_ENTRY_TYPE(tmpl_attr) _CONST entry; //!< Entry in the doubly linked list
///< of attribute references.
fr_dict_attr_t const * _CONST da; //!< Resolved dictionary attribute.
tmpl_attr_type_t _CONST type; //!< Type of attribute reference.
} tmpl_attr_t;
+
+/** Define manipulation functions for the attribute reference list
+ *
+ */
+FR_DLIST_FUNCS(tmpl_attr, tmpl_attr_t, entry)
+
+/** Define entry and head types for tmpl request references
+ *
+ */
+FR_DLIST_TYPES(tmpl_request)
+
/** An element in a list of request references
*
*/
typedef struct {
- fr_dlist_t _CONST entry; //!< Entry in the doubly linked list
- ///< of request references.
+ FR_DLIST_ENTRY_TYPE(tmpl_request) _CONST entry; //!< Entry in the doubly linked list
+ ///< of request references.
- tmpl_request_ref_t _CONST request;
+ tmpl_request_ref_t _CONST request;
} tmpl_request_t;
+/** Define manipulation functions for the attribute reference list
+ *
+ */
+FR_DLIST_FUNCS(tmpl_request, tmpl_request_t, entry)
/** How many additional headers to allocate in a pool for a tmpl_t
*
bool ref_prefix; //!< true if the reference was prefixed
///< with a '&'.
- fr_dlist_head_t rr; //!< Request to search or insert in.
-
tmpl_pair_list_t list; //!< List to search or insert in.
///< deprecated.
- fr_dlist_head_t ar; //!< Head of the attribute reference list.
+ FR_DLIST_HEAD_TYPE(tmpl_request) rr; //!< Request to search or insert in.
+ FR_DLIST_HEAD_TYPE(tmpl_attr) ar; //!< Head of the attribute reference list.
bool was_oid; //!< Was originally a numeric OID.
} attribute;
tmpl_is_attr_unresolved(vpt) ||
tmpl_is_list(vpt));
- return ((tmpl_request_t *)fr_dlist_tail(&vpt->data.attribute.rr))->request;
+ return ((tmpl_request_t *)fr_dlist_tmpl_request_tail(&vpt->data.attribute.rr))->request;
}
/** The number of request references contained within a tmpl
tmpl_is_attr_unresolved(vpt) ||
tmpl_is_list(vpt));
- return fr_dlist_num_elements(&vpt->data.attribute.rr);
+ return fr_dlist_tmpl_request_num_elements(&vpt->data.attribute.rr);
}
/**
{
tmpl_assert_type(tmpl_is_attr(vpt));
- return ((tmpl_attr_t *)fr_dlist_tail(&vpt->data.attribute.ar))->ar_da;
+ return ((tmpl_attr_t *)fr_dlist_tmpl_attr_tail(&vpt->data.attribute.ar))->ar_da;
}
static inline fr_dict_attr_t const *tmpl_unknown(tmpl_t const *vpt)
{
tmpl_assert_type(tmpl_is_attr(vpt));
- return ((tmpl_attr_t *)fr_dlist_tail(&vpt->data.attribute.ar))->ar_unknown;
+ return ((tmpl_attr_t *)fr_dlist_tmpl_attr_tail(&vpt->data.attribute.ar))->ar_unknown;
}
static inline char const *tmpl_attr_unresolved(tmpl_t const *vpt)
{
tmpl_assert_type(vpt->type == TMPL_TYPE_ATTR_UNRESOLVED);
- return ((tmpl_attr_t *)fr_dlist_tail(&vpt->data.attribute.ar))->ar_unresolved;
+ return ((tmpl_attr_t *)fr_dlist_tmpl_attr_tail(&vpt->data.attribute.ar))->ar_unresolved;
}
/** The number of attribute references contained within a tmpl
tmpl_assert_type(tmpl_is_attr(vpt) ||
tmpl_is_attr_unresolved(vpt));
- return fr_dlist_num_elements(&vpt->data.attribute.ar);
+ return fr_dlist_tmpl_attr_num_elements(&vpt->data.attribute.ar);
}
static inline int16_t tmpl_num(tmpl_t const *vpt)
tmpl_is_attr_unresolved(vpt) ||
tmpl_is_list(vpt));
- if (tmpl_is_list(vpt) && (fr_dlist_num_elements(&vpt->data.attribute.ar) == 0)) return NUM_ALL;
+ if (tmpl_is_list(vpt) && (fr_dlist_tmpl_attr_num_elements(&vpt->data.attribute.ar) == 0)) return NUM_ALL;
- return ((tmpl_attr_t *)fr_dlist_tail(&vpt->data.attribute.ar))->ar_num;
+ return ((tmpl_attr_t *)fr_dlist_tmpl_attr_tail(&vpt->data.attribute.ar))->ar_num;
}
static inline tmpl_pair_list_t tmpl_list(tmpl_t const *vpt)
void tmpl_attr_ref_debug(const tmpl_attr_t *ar, int idx);
-void tmpl_attr_ref_list_debug(fr_dlist_head_t const *ar_head) CC_HINT(nonnull);
+void tmpl_attr_ref_list_debug(FR_DLIST_HEAD_TYPE(tmpl_attr) const *ar_head) CC_HINT(nonnull);
void tmpl_attr_debug(tmpl_t const *vpt) CC_HINT(nonnull);
}
}
-void tmpl_attr_ref_list_debug(fr_dlist_head_t const *ar_head)
+void tmpl_attr_ref_list_debug(FR_DLIST_HEAD_TYPE(tmpl_attr) const *ar_head)
{
tmpl_attr_t *ar = NULL;
unsigned int i = 0;
/*
* Print all the attribute references
*/
- while ((ar = fr_dlist_next(ar_head, ar))) {
+ while ((ar = fr_dlist_tmpl_attr_next(ar_head, ar))) {
tmpl_attr_ref_debug(ar, i);
i++;
}
/*
* Print all the request references
*/
- while ((rr = fr_dlist_next(&vpt->data.attribute.rr, rr))) {
+ while ((rr = fr_dlist_tmpl_request_next(&vpt->data.attribute.rr, rr))) {
FR_FAULT_LOG("\t[%u] %s (%u)", i,
fr_table_str_by_value(tmpl_request_ref_table, rr->request, "<INVALID>"), rr->request);
i++;
case TMPL_TYPE_ATTR:
case TMPL_TYPE_ATTR_UNRESOLVED:
case TMPL_TYPE_LIST:
- fr_dlist_talloc_init(&vpt->data.attribute.ar, tmpl_attr_t, entry);
- fr_dlist_talloc_init(&vpt->data.attribute.rr, tmpl_request_t, entry);
+ fr_dlist_tmpl_attr_talloc_init(&vpt->data.attribute.ar);
+ fr_dlist_tmpl_request_talloc_init(&vpt->data.attribute.rr);
break;
default:
tmpl_request_t *rr;
TALLOC_CTX *ctx;
- if (fr_dlist_num_elements(&vpt->data.attribute.rr) == 0) {
+ if (fr_dlist_tmpl_request_num_elements(&vpt->data.attribute.rr) == 0) {
ctx = vpt;
} else {
- ctx = fr_dlist_tail(&vpt->data.attribute.rr);
+ ctx = fr_dlist_tmpl_request_tail(&vpt->data.attribute.rr);
}
MEM(rr = talloc(ctx, tmpl_request_t));
*rr = (tmpl_request_t){
.request = request
};
- fr_dlist_insert_tail(&vpt->data.attribute.rr, rr);
+ fr_dlist_tmpl_request_insert_tail(&vpt->data.attribute.rr, rr);
return rr;
}
tmpl_attr_t *ar;
TALLOC_CTX *ctx;
- if (fr_dlist_num_elements(&vpt->data.attribute.ar) == 0) {
+ if (fr_dlist_tmpl_attr_num_elements(&vpt->data.attribute.ar) == 0) {
ctx = vpt;
} else {
- ctx = fr_dlist_tail(&vpt->data.attribute.ar);
+ ctx = fr_dlist_tmpl_attr_tail(&vpt->data.attribute.ar);
}
MEM(ar = talloc(ctx, tmpl_attr_t));
.type = type,
.num = NUM_ANY
};
- fr_dlist_insert_tail(&vpt->data.attribute.ar, ar);
+ fr_dlist_tmpl_attr_insert_tail(&vpt->data.attribute.ar, ar);
return ar;
}
/*
* Clear any existing attribute references
*/
- if (fr_dlist_num_elements(&dst->data.attribute.ar) > 0) fr_dlist_talloc_reverse_free(&dst->data.attribute.ar);
+ if (fr_dlist_tmpl_attr_num_elements(&dst->data.attribute.ar) > 0) fr_dlist_tmpl_attr_talloc_reverse_free(&dst->data.attribute.ar);
- while ((src_ar = fr_dlist_next(&src->data.attribute.ar, src_ar))) {
+ while ((src_ar = fr_dlist_tmpl_attr_next(&src->data.attribute.ar, src_ar))) {
dst_ar = tmpl_attr_add(dst, src_ar->type);
switch (src_ar->type) {
/*
* Clear any existing request references
*/
- if (fr_dlist_num_elements(&dst->data.attribute.rr) > 0) fr_dlist_talloc_reverse_free(&dst->data.attribute.rr);
+ if (fr_dlist_tmpl_request_num_elements(&dst->data.attribute.rr) > 0) {
+ fr_dlist_tmpl_request_talloc_reverse_free(&dst->data.attribute.rr);
+ }
- while ((src_rr = fr_dlist_next(&src->data.attribute.rr, src_rr))) {
+ while ((src_rr = fr_dlist_tmpl_request_next(&src->data.attribute.rr, src_rr))) {
MEM(dst_rr = tmpl_req_ref_add(dst, src_rr->request));
}
/*
* Clear any existing references
*/
- if (fr_dlist_num_elements(&vpt->data.attribute.ar) > 0) {
- fr_dlist_talloc_reverse_free(&vpt->data.attribute.ar);
+ if (fr_dlist_tmpl_attr_num_elements(&vpt->data.attribute.ar) > 0) {
+ fr_dlist_tmpl_attr_talloc_reverse_free(&vpt->data.attribute.ar);
}
/*
/*
* Clear any existing references
*/
- if (fr_dlist_num_elements(&vpt->data.attribute.ar) > 0) {
- if (fr_dlist_num_elements(&vpt->data.attribute.ar) > 1) {
- ref = fr_dlist_tail(&vpt->data.attribute.ar);
- parent = fr_dlist_prev(&vpt->data.attribute.ar, ref);
+ if (fr_dlist_tmpl_attr_num_elements(&vpt->data.attribute.ar) > 0) {
+ if (fr_dlist_tmpl_attr_num_elements(&vpt->data.attribute.ar) > 1) {
+ ref = fr_dlist_tmpl_attr_tail(&vpt->data.attribute.ar);
+ parent = fr_dlist_tmpl_attr_prev(&vpt->data.attribute.ar, ref);
if (!fr_dict_attr_common_parent(parent->ar_da, da, true)) {
fr_strerror_const("New leaf da and old leaf da do not share the same ancestor");
return -1;
}
} else {
- ref = fr_dlist_tail(&vpt->data.attribute.ar);
+ ref = fr_dlist_tmpl_attr_tail(&vpt->data.attribute.ar);
}
/*
tmpl_assert_type(tmpl_is_attr(vpt) || tmpl_is_list(vpt) || tmpl_is_attr_unresolved(vpt));
- if (fr_dlist_num_elements(&vpt->data.attribute.ar) == 0) {
+ if (fr_dlist_tmpl_attr_num_elements(&vpt->data.attribute.ar) == 0) {
ref = tmpl_attr_add(vpt, TMPL_ATTR_TYPE_UNKNOWN);
} else {
- ref = fr_dlist_tail(&vpt->data.attribute.ar);
+ ref = fr_dlist_tmpl_attr_tail(&vpt->data.attribute.ar);
}
ref->num = num;
tmpl_assert_type(tmpl_is_attr(vpt) || tmpl_is_list(vpt) || tmpl_is_attr_unresolved(vpt));
- if (fr_dlist_num_elements(&vpt->data.attribute.ar) == 0) return;
+ if (fr_dlist_tmpl_attr_num_elements(&vpt->data.attribute.ar) == 0) return;
- ref = fr_dlist_tail(&vpt->data.attribute.ar);
+ ref = fr_dlist_tmpl_attr_tail(&vpt->data.attribute.ar);
if (ref->ar_num == from) ref->ar_num = to;
TMPL_ATTR_VERIFY(vpt);
tmpl_assert_type(tmpl_is_attr(vpt) || tmpl_is_list(vpt) || tmpl_is_attr_unresolved(vpt));
- while ((ref = fr_dlist_next(&vpt->data.attribute.ar, ref))) if (ref->ar_num == from) ref->ar_num = to;
+ while ((ref = fr_dlist_tmpl_attr_next(&vpt->data.attribute.ar, ref))) if (ref->ar_num == from) ref->ar_num = to;
TMPL_ATTR_VERIFY(vpt);
}
fr_assert_msg(tmpl_is_attr(vpt), "Expected tmpl type 'attr', got '%s'",
fr_table_str_by_value(tmpl_type_table, vpt->type, "<INVALID>"));
- if (fr_dlist_num_elements(&vpt->data.attribute.rr) > 0) fr_dlist_talloc_reverse_free(&vpt->data.attribute.rr);
+ if (fr_dlist_tmpl_request_num_elements(&vpt->data.attribute.rr) > 0) fr_dlist_tmpl_request_talloc_reverse_free(&vpt->data.attribute.rr);
tmpl_req_ref_add(vpt, request);
/*
* Insert the reference into the list.
*/
- fr_dlist_insert_tail(&vpt->data.attribute.ar, ar);
+ fr_dlist_tmpl_attr_insert_tail(&vpt->data.attribute.ar, ar);
switch (ar->num) {
case 0:
default:
ar->resolve_only = true;
- while ((ar = fr_dlist_prev(&vpt->data.attribute.ar, ar))) ar->resolve_only = true;
+ while ((ar = fr_dlist_tmpl_attr_prev(&vpt->data.attribute.ar, ar))) ar->resolve_only = true;
break;
}
}
if (fr_sbuff_next_if_char(name, '.')) {
ret = tmpl_attr_afrom_attr_unresolved_substr(ctx, err, vpt, NULL, NULL, name, t_rules, depth + 1);
if (ret < 0) {
- fr_dlist_talloc_free_tail(&vpt->data.attribute.ar); /* Remove and free ar */
+ fr_dlist_tmpl_attr_talloc_free_tail(&vpt->data.attribute.ar); /* Remove and free ar */
return -1;
}
}
* useful to have the original.
*/
if (!da && !vpt->rules.disallow_internal &&
- (ar = fr_dlist_tail(&vpt->data.attribute.ar)) &&
+ (ar = fr_dlist_tmpl_attr_tail(&vpt->data.attribute.ar)) &&
(ar->type == TMPL_ATTR_TYPE_NORMAL) && (ar->ar_da->type == FR_TYPE_GROUP)) {
(void)fr_dict_attr_by_name_substr(NULL,
&da, fr_dict_root(fr_dict_internal()),
if (ar) tmpl_attr_insert(vpt, ar);
if (tmpl_attr_afrom_attr_substr(ctx, err, vpt, our_parent, namespace, name, p_rules, t_rules, depth + 1) < 0) {
- if (ar) fr_dlist_talloc_free_tail(&vpt->data.attribute.ar); /* Remove and free ar */
+ if (ar) fr_dlist_tmpl_attr_talloc_free_tail(&vpt->data.attribute.ar); /* Remove and free ar */
goto error;
}
/*
tmpl_rules_t const **pt_rules,
unsigned int depth)
{
- tmpl_request_ref_t ref;
- size_t ref_len;
- tmpl_request_t *rr;
- fr_dlist_head_t *list = &vpt->data.attribute.rr;
- fr_sbuff_marker_t s_m;
- tmpl_rules_t const *t_rules = *pt_rules;
+ tmpl_request_ref_t ref;
+ size_t ref_len;
+ tmpl_request_t *rr;
+ FR_DLIST_HEAD_TYPE(tmpl_request) *list = &vpt->data.attribute.rr;
+ fr_sbuff_marker_t s_m;
+ tmpl_rules_t const *t_rules = *pt_rules;
fr_sbuff_marker(&s_m, name);
fr_sbuff_out_by_longest_prefix(&ref_len, &ref, tmpl_request_ref_table, name, t_rules->request_def);
*rr = (tmpl_request_t){
.request = ref
};
- fr_dlist_insert_tail(list, rr);
+ fr_dlist_tmpl_request_insert_tail(list, rr);
}
return 0;
*rr = (tmpl_request_t){
.request = ref
};
- fr_dlist_insert_tail(list, rr);
+ fr_dlist_tmpl_request_insert_tail(list, rr);
/*
* Update the parsing rules if we go to the parent.
*/
if (fr_sbuff_next_if_char(name, '.')) {
if (tmpl_request_ref_afrom_attr_substr(ctx, err, vpt, name, p_rules, pt_rules, depth + 1) < 0) {
- fr_dlist_talloc_free_tail(list); /* Remove and free rr */
+ fr_dlist_tmpl_request_talloc_free_tail(list); /* Remove and free rr */
return -1;
}
}
if (t_rules->list_as_attr) {
tmpl_attr_t *ar;
- ar = fr_dlist_head(&vpt->data.attribute.ar);
+ ar = fr_dlist_tmpl_attr_head(&vpt->data.attribute.ar);
fr_assert(ar != NULL);
if ((ar->ar_type != TMPL_ATTR_TYPE_NORMAL) ||
* Prepend the list ref so it gets evaluated
* first.
*/
- fr_dlist_insert_head(&vpt->data.attribute.ar, ar);
+ fr_dlist_tmpl_attr_insert_head(&vpt->data.attribute.ar, ar);
}
}
}
*
* Eventually we'll remove TMPL_TYPE_LIST
*/
- if (fr_dlist_num_elements(&vpt->data.attribute.ar) == 0) {
+ if (fr_dlist_tmpl_attr_num_elements(&vpt->data.attribute.ar) == 0) {
tmpl_attr_t *ar;
MEM(ar = talloc_zero(vpt, tmpl_attr_t));
break;
case 1: /* Found a filter */
- fr_dlist_insert_tail(&vpt->data.attribute.ar, ar);
+ fr_dlist_tmpl_attr_insert_tail(&vpt->data.attribute.ar, ar);
break;
default: /* Parse error */
* This emulates what's done in the initial
* tokenizer function.
*/
- ar = fr_dlist_head(&vpt->data.attribute.ar);
+ ar = fr_dlist_tmpl_attr_head(&vpt->data.attribute.ar);
if (ar->type == TMPL_ATTR_TYPE_UNRESOLVED) {
(void)fr_dict_attr_search_by_name_substr(NULL,
&da,
* and correct its parent and
* namespace.
*/
- next = fr_dlist_next(&vpt->data.attribute.ar, ar);
+ next = fr_dlist_tmpl_attr_next(&vpt->data.attribute.ar, ar);
if (next) {
next->ar_parent = da;
next->ar_unresolved_namespace = da;
/*
* Loop, resolving each unresolved attribute in turn
*/
- while ((ar = fr_dlist_next(&vpt->data.attribute.ar, ar))) {
+ while ((ar = fr_dlist_tmpl_attr_next(&vpt->data.attribute.ar, ar))) {
switch (ar->type) {
case TMPL_ATTR_TYPE_NORMAL:
continue; /* Don't need to resolve */
* in the internal dictionary.
*/
if (!da) {
- prev = fr_dlist_prev(&vpt->data.attribute.ar, ar);
+ prev = fr_dlist_tmpl_attr_prev(&vpt->data.attribute.ar, ar);
if (!vpt->rules.disallow_internal && prev && (prev->ar_da->type == FR_TYPE_GROUP)) {
(void)fr_dict_attr_by_name_substr(NULL,
&da,
* Reach into the next reference
* and correct its parent.
*/
- next = fr_dlist_next(&vpt->data.attribute.ar, ar);
+ next = fr_dlist_tmpl_attr_next(&vpt->data.attribute.ar, ar);
if (next) {
next->ar_parent = da;
next->ar_unresolved_namespace = da;
* an index, the ar is redundant and should
* be removed.
*/
- prev = fr_dlist_prev(&vpt->data.attribute.ar, ar);
+ prev = fr_dlist_tmpl_attr_prev(&vpt->data.attribute.ar, ar);
if (prev && (prev->ar_da->type != FR_TYPE_GROUP) && (prev->ar_num == NUM_ANY)) {
- fr_dlist_remove(&vpt->data.attribute.ar, prev);
+ fr_dlist_tmpl_attr_remove(&vpt->data.attribute.ar, prev);
ar->ar_parent = prev->ar_parent;
talloc_free(prev);
}
case TMPL_TYPE_LIST:
case TMPL_TYPE_ATTR:
case TMPL_TYPE_ATTR_UNRESOLVED:
- fr_dlist_talloc_free(&vpt->data.attribute.ar);
- fr_dlist_talloc_free(&vpt->data.attribute.rr);
+ fr_dlist_tmpl_attr_talloc_free(&vpt->data.attribute.ar);
+ fr_dlist_tmpl_request_talloc_free(&vpt->data.attribute.rr);
break;
/*
*/
void tmpl_attr_to_raw(tmpl_t *vpt)
{
- attr_to_raw(vpt, fr_dlist_tail(&vpt->data.attribute.ar));
+ attr_to_raw(vpt, fr_dlist_tmpl_attr_tail(&vpt->data.attribute.ar));
}
/** Add an unknown #fr_dict_attr_t specified by a #tmpl_t to the main dictionary
if (!tmpl_da(vpt)->flags.is_unknown) return 1; /* Ensure at least the leaf is unknown */
- while ((ar = fr_dlist_next(&vpt->data.attribute.ar, ar))) {
+ while ((ar = fr_dlist_tmpl_attr_next(&vpt->data.attribute.ar, ar))) {
fr_dict_attr_t const *unknown, *known;
switch (ar->type) {
* Fixup the parent of the next unknown
* now it's known.
*/
- next = fr_dlist_next(&vpt->data.attribute.ar, ar);
+ next = fr_dlist_tmpl_attr_next(&vpt->data.attribute.ar, ar);
if (next && (next->type == TMPL_ATTR_TYPE_UNKNOWN) &&
(next->ar_da->parent == unknown)) {
if (fr_dict_attr_unknown_parent_to_known(fr_dict_attr_unconst(next->ar_da),
/*
* Print request references
*/
- while ((rr = fr_dlist_next(&vpt->data.attribute.rr, rr))) {
+ while ((rr = fr_dlist_tmpl_request_next(&vpt->data.attribute.rr, rr))) {
if (rr->request == REQUEST_CURRENT) continue; /* Don't print the default request */
FR_SBUFF_IN_TABLE_STR_RETURN(&our_out, tmpl_request_ref_table, rr->request, "<INVALID>");
if (printed_rr) FR_SBUFF_IN_CHAR_RETURN(&our_out, '.');
FR_SBUFF_IN_TABLE_STR_RETURN(&our_out, pair_list_table, tmpl_list(vpt), "<INVALID>");
- if (fr_dlist_num_elements(&vpt->data.attribute.ar)) FR_SBUFF_IN_CHAR_RETURN(&our_out, '.');
+ if (fr_dlist_tmpl_attr_num_elements(&vpt->data.attribute.ar)) FR_SBUFF_IN_CHAR_RETURN(&our_out, '.');
/*
* Request qualifier with no list qualifier
*/
} else if (printed_rr) {
- if (fr_dlist_num_elements(&vpt->data.attribute.ar)) FR_SBUFF_IN_CHAR_RETURN(&our_out, '.');
+ if (fr_dlist_tmpl_attr_num_elements(&vpt->data.attribute.ar)) FR_SBUFF_IN_CHAR_RETURN(&our_out, '.');
}
/*
* we add the .unknown prefix.
*
*/
- if (!tmpl_is_list(vpt) && (ar = fr_dlist_tail(&vpt->data.attribute.ar))) {
+ if (!tmpl_is_list(vpt) && (ar = fr_dlist_tmpl_attr_tail(&vpt->data.attribute.ar))) {
switch (ar->type) {
case TMPL_ATTR_TYPE_NORMAL:
case TMPL_ATTR_TYPE_UNKNOWN:
* Print attribute identifiers
*/
ar = NULL;
- while ((ar = fr_dlist_next(&vpt->data.attribute.ar, ar))) {
+ while ((ar = fr_dlist_tmpl_attr_next(&vpt->data.attribute.ar, ar))) {
if (!tmpl_is_list(vpt)) switch(ar->type) {
case TMPL_ATTR_TYPE_NORMAL:
case TMPL_ATTR_TYPE_UNKNOWN:
/*
* First component in the list has everything built
*/
- if (ar == fr_dlist_head(&vpt->data.attribute.ar)) {
+ if (ar == fr_dlist_tmpl_attr_head(&vpt->data.attribute.ar)) {
depth = ar->ar_parent->depth - 1; /* Adjust for array index */
/*
* Everything else skips the first component
break;
}
- if (fr_dlist_next(&vpt->data.attribute.ar, ar)) FR_SBUFF_IN_CHAR_RETURN(&our_out, '.');
+ if (fr_dlist_tmpl_attr_next(&vpt->data.attribute.ar, ar)) FR_SBUFF_IN_CHAR_RETURN(&our_out, '.');
}
return fr_sbuff_set(out, &our_out);
}
/*
* Loop detection
*/
- while ((slow = fr_dlist_next(&vpt->data.attribute.ar, slow)) &&
- (fast = fr_dlist_next(&vpt->data.attribute.ar, fast))) {
+ while ((slow = fr_dlist_tmpl_attr_next(&vpt->data.attribute.ar, slow)) &&
+ (fast = fr_dlist_tmpl_attr_next(&vpt->data.attribute.ar, fast))) {
/*
* Advances twice as fast as slow...
*/
- fast = fr_dlist_next(&vpt->data.attribute.ar, fast);
+ fast = fr_dlist_tmpl_attr_next(&vpt->data.attribute.ar, fast);
fr_fatal_assert_msg(fast != slow,
"CONSISTENCY CHECK FAILED %s[%u]: Looping reference list found. "
"Fast pointer hit slow pointer at \"%s\"",
* Known attribute cannot come after unresolved or unknown attributes
* Unknown attributes cannot come after unresolved attributes
*/
- if (!tmpl_is_list(vpt)) while ((ar = fr_dlist_next(&vpt->data.attribute.ar, ar))) {
+ if (!tmpl_is_list(vpt)) while ((ar = fr_dlist_tmpl_attr_next(&vpt->data.attribute.ar, ar))) {
switch (ar->type) {
case TMPL_ATTR_TYPE_NORMAL:
if (seen_unknown) {
break;
case TMPL_TYPE_ATTR_UNRESOLVED:
- if ((fr_dlist_num_elements(&vpt->data.attribute.ar) > 0) &&
- ((tmpl_attr_t *)fr_dlist_tail(&vpt->data.attribute.ar))->da) {
+ if ((fr_dlist_tmpl_attr_num_elements(&vpt->data.attribute.ar) > 0) &&
+ ((tmpl_attr_t *)fr_dlist_tmpl_attr_tail(&vpt->data.attribute.ar))->da) {
#ifndef NDEBUG
tmpl_attr_debug(vpt);
#endif
fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%u]: TMPL_TYPE_ATTR_UNRESOLVED contains %u "
- "references", file, line, fr_dlist_num_elements(&vpt->data.attribute.ar));
+ "references", file, line, fr_dlist_tmpl_attr_num_elements(&vpt->data.attribute.ar));
}
break;
file, line);
}
- if ((fr_dlist_num_elements(&vpt->data.attribute.ar) > 0) &&
- ((tmpl_attr_t *)fr_dlist_tail(&vpt->data.attribute.ar))->da) {
+ if ((fr_dlist_tmpl_attr_num_elements(&vpt->data.attribute.ar) > 0) &&
+ ((tmpl_attr_t *)fr_dlist_tmpl_attr_tail(&vpt->data.attribute.ar))->da) {
#ifndef NDEBUG
tmpl_attr_debug(vpt);
#endif
fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%u]: TMPL_TYPE_LIST contains %u "
- "references", file, line, fr_dlist_num_elements(&vpt->data.attribute.ar));
+ "references", file, line, fr_dlist_tmpl_attr_num_elements(&vpt->data.attribute.ar));
}
break;