*/
if (tmpl_contains_regex(c->data.map->rhs)) {
fr_assert((c->data.map->op == T_OP_REG_EQ) || (c->data.map->op == T_OP_REG_NE));
- fr_assert(!tmpl_is_list(c->data.map->lhs));
fr_assert(fr_type_is_null(tmpl_rules_cast(c->data.map->rhs)));
/*
fr_assert(map->rhs); /* Quite clang scan */
fr_assert(tmpl_is_exec(map->rhs));
- fr_assert(tmpl_is_attr(map->lhs) || tmpl_is_list(map->lhs));
+ fr_assert(tmpl_is_attr(map->lhs));
/*
* We always put the request pairs into the environment
* if dst is an attribute, then we create an attribute of that type and then
* call fr_pair_value_from_str on the output of the script.
*/
- result = radius_exec_program_legacy(ctx, answer, sizeof(answer),
- tmpl_is_list(map->lhs) ? &output_pairs : NULL,
+ result = radius_exec_program_legacy(ctx, answer, sizeof(answer), NULL,
request, map->rhs->name, input_pairs ? input_pairs : NULL,
true, true, fr_time_delta_from_sec(EXEC_TIMEOUT));
talloc_free(expanded);
MAP_VERIFY(map);
if (!fr_cond_assert(map->lhs != NULL)) return -1;
- fr_assert(tmpl_is_list(map->lhs) || tmpl_is_attr(map->lhs));
+ fr_assert(tmpl_is_attr(map->lhs));
/*
* Special case for !*, we don't need to parse RHS as this is a unary operator.
* to allocate any attributes, just finding the current list, and change
* the op.
*/
- if ((tmpl_is_list(map->lhs) || (tmpl_contains_attr(map->lhs) && tmpl_attr_tail_da_is_structural(map->lhs))) &&
- (tmpl_is_list(map->rhs) || (tmpl_contains_attr(map->rhs) && tmpl_attr_tail_da_is_structural(map->rhs)))) {
+ if ((tmpl_contains_attr(map->lhs) && tmpl_attr_tail_da_is_structural(map->lhs)) &&
+ (tmpl_contains_attr(map->rhs) && tmpl_attr_tail_da_is_structural(map->rhs))) {
fr_pair_list_t *from = NULL;
if (tmpl_request_ptr(&context, tmpl_request(map->rhs)) == 0) {
fr_pair_t *vp;
fr_dcursor_t from;
- fr_assert((tmpl_is_attr(map->lhs) && tmpl_attr_tail_da(map->lhs)) ||
- (tmpl_is_list(map->lhs) && !tmpl_attr_tail_da(map->lhs)));
+ fr_assert(tmpl_is_attr(map->lhs) && tmpl_attr_tail_da(map->lhs));
/*
* @todo should log error, and return -1 for v3.1 (causes update to fail)
rcode = -1;
goto finish;
}
- fr_assert(tmpl_is_attr(exp_lhs) || tmpl_is_list(exp_lhs));
+ fr_assert(tmpl_is_attr(exp_lhs));
memcpy(&exp_map, map, sizeof(exp_map));
exp_map.lhs = exp_lhs;
* Sanity check inputs. We can have a list or attribute
* as a destination.
*/
- if (!tmpl_is_list(map->lhs) &&
- !tmpl_is_attr(map->lhs)) {
+ if (!tmpl_is_attr(map->lhs)) {
REDEBUG("Left side \"%.*s\" of map should be an attr or list but is an %s",
(int)map->lhs->len, map->lhs->name,
tmpl_type_to_str(map->lhs->type));
if (!fr_cond_assert(original->lhs != NULL)) return -1;
if (!fr_cond_assert(original->rhs != NULL)) return -1;
- fr_assert(tmpl_is_list(original->lhs) ||
- tmpl_is_attr(original->lhs) ||
- tmpl_is_xlat(original->lhs));
+ fr_assert(tmpl_is_attr(original->lhs) ||
+ tmpl_is_xlat(original->lhs));
*out = NULL;
fr_value_box_list_init(&head);
fr_value_box_list_talloc_free(lhs_result);
goto error;
}
- fr_assert(tmpl_is_attr(mutated->lhs) || tmpl_is_list(mutated->lhs));
+ fr_assert(tmpl_is_attr(mutated->lhs));
}
break;
int err;
fr_assert(fr_value_box_list_empty(rhs_result));
- fr_assert((tmpl_is_attr(mutated->lhs) && tmpl_attr_tail_da(mutated->lhs)) ||
- (tmpl_is_list(mutated->lhs) && !tmpl_attr_tail_da(mutated->lhs)));
+ fr_assert(tmpl_is_attr(mutated->lhs) && tmpl_attr_tail_da(mutated->lhs));
/*
* Check source list
fr_assert(mod->lhs != NULL);
fr_assert(mod->rhs != NULL);
- fr_assert(tmpl_is_attr(mod->lhs) || tmpl_is_list(mod->lhs));
+ fr_assert(tmpl_is_attr(mod->lhs));
fr_assert(((mod->op == T_OP_CMP_FALSE) && tmpl_is_null(mod->rhs)) ||
tmpl_is_data(mod->rhs));
static inline FR_DLIST_HEAD(tmpl_request_list) const *tmpl_request(tmpl_t const *vpt)
{
tmpl_assert_type(tmpl_is_attr(vpt) ||
- tmpl_is_attr_unresolved(vpt) ||
- tmpl_is_list(vpt));
+ tmpl_is_attr_unresolved(vpt));
return &vpt->data.attribute.rr;
}
static inline size_t tmpl_request_ref_count(tmpl_t const *vpt)
{
tmpl_assert_type(tmpl_is_attr(vpt) ||
- tmpl_is_attr_unresolved(vpt) ||
- tmpl_is_list(vpt));
+ tmpl_is_attr_unresolved(vpt));
return tmpl_request_list_num_elements(&vpt->data.attribute.rr);
}
static inline int16_t tmpl_attr_tail_num(tmpl_t const *vpt)
{
tmpl_assert_type(tmpl_is_attr(vpt) ||
- tmpl_is_attr_unresolved(vpt) ||
- tmpl_is_list(vpt));
-
- if (tmpl_is_list(vpt) && (tmpl_attr_list_num_elements(tmpl_attr(vpt)) == 0)) return NUM_ALL;
+ tmpl_is_attr_unresolved(vpt));
return tmpl_attr_list_tail(tmpl_attr(vpt))->ar_num;
}
static inline fr_dict_attr_t const *tmpl_list(tmpl_t const *vpt)
{
tmpl_assert_type(tmpl_is_attr(vpt) ||
- tmpl_is_attr_unresolved(vpt) || /* Remove once list is part of ar dlist */
- tmpl_is_list(vpt));
+ tmpl_is_attr_unresolved(vpt));
return vpt->data.attribute.list;
}
/*
* Iterates over attributes of a specific type
*/
- if (tmpl_is_list(cc->vpt) || ar_is_normal(ar)) {
+ if (ar_is_normal(ar)) {
fr_pair_dcursor_iter_init(&ns->cursor, list, _tmpl_cursor_child_next, ns);
/*
* Iterates over all attributes at this level
pop = true;
}
break;
- } else goto all_inst; /* Used for TMPL_TYPE_LIST */
+ } else goto all_inst;
/*
* If no pair was found and there is a fill
{
fr_pair_t *list;
- fr_assert(tmpl_is_attr(vpt) || tmpl_is_list(vpt));
+ fr_assert(tmpl_is_attr(vpt));
if (err) *err = 0;
TMPL_VERIFY(vpt);
- fr_assert(tmpl_is_attr(vpt) || tmpl_is_list(vpt));
+ fr_assert(tmpl_is_attr(vpt));
/*
* Navigate to the correct request context
TMPL_VERIFY(vpt);
- fr_assert(!tmpl_is_list(vpt));
fr_assert(!buff || (bufflen >= 2));
switch (vpt->type) {
TMPL_VERIFY(vpt);
- fr_assert(tmpl_is_attr(vpt) || tmpl_is_list(vpt));
+ fr_assert(tmpl_is_attr(vpt));
for (vp = tmpl_dcursor_init(&err, NULL, &cc, &from, request, vpt);
vp;
TMPL_VERIFY(vpt);
- fr_assert(tmpl_is_attr(vpt) || tmpl_is_list(vpt));
+ fr_assert(tmpl_is_attr(vpt));
fr_pair_list_free(out);
int ret = 0;
FR_DLIST_HEAD(fr_value_box_list) list;
- fr_assert(tmpl_is_attr(vpt) || tmpl_is_list(vpt));
+ fr_assert(tmpl_is_attr(vpt));
fr_value_box_list_init(&list);
return -1;
}
- if (tmpl_is_attr(vpt) || tmpl_is_list(vpt)) {
+ if (tmpl_is_attr(vpt)) {
return tmpl_eval_pair(ctx, out, request, vpt);
}
{
tmpl_attr_t *ar;
- tmpl_assert_type(tmpl_is_attr(vpt) || tmpl_is_list(vpt) || tmpl_is_attr_unresolved(vpt));
+ tmpl_assert_type(tmpl_is_attr(vpt) || tmpl_is_attr_unresolved(vpt));
if (tmpl_attr_list_num_elements(tmpl_attr(vpt)) == 0) {
ar = tmpl_attr_add(vpt, TMPL_ATTR_TYPE_UNKNOWN);
{
tmpl_attr_t *ref = NULL;
- tmpl_assert_type(tmpl_is_attr(vpt) || tmpl_is_list(vpt) || tmpl_is_attr_unresolved(vpt));
+ tmpl_assert_type(tmpl_is_attr(vpt) || tmpl_is_attr_unresolved(vpt));
if (tmpl_attr_list_num_elements(tmpl_attr(vpt)) == 0) return;
{
tmpl_attr_t *ref = NULL;
- tmpl_assert_type(tmpl_is_attr(vpt) || tmpl_is_list(vpt) || tmpl_is_attr_unresolved(vpt));
+ tmpl_assert_type(tmpl_is_attr(vpt) || tmpl_is_attr_unresolved(vpt));
while ((ref = tmpl_attr_list_next(tmpl_attr(vpt), ref))) if (ref->ar_num == from) ref->ar_num = to;
*/
ar = NULL;
while ((ar = tmpl_attr_list_next(tmpl_attr(vpt), ar))) {
- if (!tmpl_is_list(vpt)) switch(ar->type) {
+ switch(ar->type) {
case TMPL_ATTR_TYPE_UNSPEC:
break;
tmpl_attr_t *seen_unknown = NULL;
tmpl_attr_t *seen_unresolved = NULL;
- fr_assert(tmpl_is_attr_unresolved(vpt) || tmpl_is_attr(vpt) || tmpl_is_list(vpt));
+ fr_assert(tmpl_is_attr_unresolved(vpt) || tmpl_is_attr(vpt));
/*
* Loop detection
}
}
- if (tmpl_is_list(map->lhs)) {
- /*
- * Can't copy an xlat expansion or literal into a list,
- * we don't know what type of attribute we'd need
- * to create.
- *
- * The only exception is where were using a unary
- * operator like !*.
- */
- if (map->op != T_OP_CMP_FALSE) switch (map->rhs->type) {
- case TMPL_TYPE_XLAT_UNRESOLVED:
- case TMPL_TYPE_UNRESOLVED:
- cf_log_err(map->ci, "Can't copy value into list (we don't know which attribute to create)");
- return -1;
-
- default:
- break;
- }
-
- /*
- * Only += and :=, and !*, and ^= operators are supported
- * for lists.
- */
- switch (map->op) {
- case T_OP_CMP_FALSE:
- break;
-
- case T_OP_ADD_EQ:
- if (!tmpl_is_list(map->rhs) &&
- !tmpl_is_exec(map->rhs)) {
- cf_log_err(map->ci, "Invalid source for list assignment '%s += ...'", map->lhs->name);
- return -1;
- }
- break;
-
- case T_OP_SET:
- if (tmpl_is_exec(map->rhs)) {
- WARN("%s[%d]: Please change ':=' to '=' for list assignment",
- cf_filename(cp), cf_lineno(cp));
- }
-
- if (!tmpl_is_list(map->rhs)) {
- cf_log_err(map->ci, "Invalid source for list assignment '%s := ...'", map->lhs->name);
- return -1;
- }
- break;
-
- case T_OP_EQ:
- if (!tmpl_is_exec(map->rhs)) {
- cf_log_err(map->ci, "Invalid source for list assignment '%s = ...'", map->lhs->name);
- return -1;
- }
- break;
-
- case T_OP_PREPEND:
- if (!tmpl_is_list(map->rhs) &&
- !tmpl_is_exec(map->rhs)) {
- cf_log_err(map->ci, "Invalid source for list assignment '%s ^= ...'", map->lhs->name);
- return -1;
- }
- break;
-
- default:
- cf_log_err(map->ci, "Operator \"%s\" not allowed for list assignment",
- fr_table_str_by_value(fr_tokens_table, map->op, "<INVALID>"));
- return -1;
- }
- }
-
/*
* If the map has a unary operator there's no further
* processing we need to, as RHS is unused.
*/
fr_assert(vpt);
- if (!tmpl_is_attr(vpt) && !tmpl_is_list(vpt)) {
+ if (!tmpl_is_attr(vpt)) {
cf_log_err(cs, "MUST use attribute or list reference (not %s) in 'foreach'",
tmpl_type_to_str(vpt->type));
talloc_free(vpt);
}
fr_pair_append(&child->request_pairs, vp);
- if (gext->src) {
- if (tmpl_is_list(gext->src)) {
- if (tmpl_copy_pairs(child->request_ctx, &child->request_pairs, request, gext->src) < -1) {
- RPEDEBUG("Failed copying source attributes into subrequest");
- goto fail;
- }
- } else {
- if (tmpl_copy_pair_children(child->request_ctx, &child->request_pairs, request, gext->src) < -1) {
- RPEDEBUG("Failed copying source attributes into subrequest");
- goto fail;
- }
- }
+ if ((gext->src) && (tmpl_copy_pair_children(child->request_ctx, &child->request_pairs, request, gext->src) < -1)) {
+ RPEDEBUG("Failed copying source attributes into subrequest");
+ goto fail;
}
/*
fr_value_box_list_move((FR_DLIST_HEAD(fr_value_box_list) *)out->dlist, &result);
continue;
- } else if (tmpl_is_attr(node->vpt) || tmpl_is_list(node->vpt)) {
+ } else if (tmpl_is_attr(node->vpt)) {
if (node->fmt[0] == '&') {
XLAT_DEBUG("** [%i] %s(attribute) - %s", unlang_interpret_stack_depth(request), __FUNCTION__,
node->fmt);
fr_assert(!tmpl_contains_regex(node->vpt));
// attr or list
- fr_assert(tmpl_is_list(node->vpt) || tmpl_is_attr(node->vpt));
+ fr_assert(tmpl_is_attr(node->vpt));
fr_assert(talloc_parent(node->vpt) == node);
fr_assert(!node->flags.pure);
{
if (unlang_fixup_update(map, ctx) < 0) return -1;
- if (!tmpl_is_attr(map->lhs) &&
- !tmpl_is_list(map->lhs)) {
+ if (!tmpl_is_attr(map->lhs)) {
cf_log_err(map->ci, "Destination must be an attribute ref or a list");
return -1;
}
goto finish;
}
- if(tmpl_is_list(vpt)) {
- ret = -1;
- goto finish;
- }
-
/* Only string values should be used for SMTP components */
if(tmpl_expanded_type(vpt) != FR_TYPE_STRING) {
cf_log_err(cp, "Attribute reference must be a string");