static bool cond_compare_virtual(request_t *request, map_t const *map)
{
int rcode;
- fr_pair_t *virt, *vp;
+ fr_pair_t *vp;
fr_value_box_t *rhs, rhs_cast;
fr_dcursor_t cursor;
tmpl_dcursor_ctx_t cc;
break;
}
- /*
- * Create the virtual check item.
- */
- MEM(virt = fr_pair_afrom_da(request->request_ctx, tmpl_da(map->lhs)));
- virt->op = map->op;
- fr_value_box_copy(virt, &virt->data, rhs);
-
- rcode = paircmp_virtual(request, virt);
- talloc_free(virt);
+ rcode = paircmp_virtual(request, tmpl_da(map->lhs), map->op, rhs);
rcode = (rcode == 0) ? 1 : 0;
if (rhs == &rhs_cast) fr_value_box_clear(&rhs_cast);
if (rcode != 0) break;
* an attribute or a list.
*/
if (c->pass2_fixup == PASS2_PAIRCOMPARE) {
- fr_pair_t *vp;
-
fr_assert(tmpl_is_attr(map->lhs));
if (map->op == T_OP_REG_EQ) {
return false;
}
- MEM(vp = fr_pair_afrom_da(request->request_ctx, tmpl_da(map->lhs)));
- vp->op = c->data.map->op;
- fr_value_box_copy(vp, &vp->data, rhs);
-
/*
* Do JUST the virtual attribute comparison.
* Skip all of the rest of the complexity of paircmp().
*/
- rcode = paircmp_virtual(request, vp);
- talloc_free(vp);
+ rcode = paircmp_virtual(request, tmpl_da(map->lhs), c->data.map->op, rhs);
rcode = (rcode == 0) ? 1 : 0;
goto done;
}
* comparison function called.
*
* @param[in] request Current request.
- * @param[in] check_item item to compare.
+ * @param[in] da the da to use
+ * @param[in] op operator to use
+ * @param[in] value value-box to use.
* @return
* - 0 if check_item matches
* - -1 if check_item is smaller
* - 1 if check_item is larger
*/
-int paircmp_virtual(request_t *request, fr_pair_t const *check_item)
+int paircmp_virtual(request_t *request, fr_dict_attr_t const *da, fr_token_t op, fr_value_box_t const *value)
{
paircmp_t *c;
for (c = cmp; c; c = c->next) {
- if (c->da == check_item->da) {
- return (c->compare)(c->instance, request, check_item);
+ if (c->da == da) {
+ fr_pair_t *vp;
+ int rcode;
+
+ vp = fr_pair_afrom_da(request->request_ctx, da);
+ if (!vp) return -1;
+
+ vp->op = op;
+ fr_value_box_copy(vp, &vp->data, value);
+
+ rcode = (c->compare)(c->instance, request, vp);
+ talloc_free(vp);
+ return rcode;
}
}
int paircmp(request_t *request, fr_pair_list_t *request_list, fr_pair_list_t *check_list);
-int paircmp_virtual(request_t *request, fr_pair_t const *check_item);
+int paircmp_virtual(request_t *request, fr_dict_attr_t const *da, fr_token_t op, fr_value_box_t const *value);
int paircmp_find(fr_dict_attr_t const *da);