* The delay is so we can detect retransmissions.
*/
original->linked = talloc_steal(original, packet);
- fr_pair_list_move(&original->link_vps, &decoded, T_OP_ADD); /* Move the vps over */
+ fr_pair_list_move(&original->link_vps, &decoded, T_OP_ADD_EQ); /* Move the vps over */
rs_tv_add_ms(&header->ts, conf->stats.timeout, &original->when);
if (fr_event_timer_at(NULL, event->list, &original->event,
fr_time_from_timeval(&original->when), _rs_event, original) < 0) {
fr_pair_list_free(&original->packet_vps);
fr_radius_packet_free(&original->packet);
original->packet = talloc_steal(original, packet);
- fr_pair_list_move(&original->packet_vps, &decoded, T_OP_ADD);
+ fr_pair_list_move(&original->packet_vps, &decoded, T_OP_ADD_EQ);
/* Request may need to be reinserted as the 5 tuple of the response may of changed */
if (rs_packet_cmp(original, &search) != 0) {
fr_pair_list_free(&original->expect_vps);
fr_radius_packet_free(&original->expect);
original->expect = talloc_steal(original, search.expect);
- fr_pair_list_move(&original->expect_vps, &search.expect_vps, T_OP_ADD);
+ fr_pair_list_move(&original->expect_vps, &search.expect_vps, T_OP_ADD_EQ);
/* Disarm the timer for the cleanup event for the original request */
fr_event_timer_delete(&original->event);
original->capture_p = original->capture;
original->packet = talloc_steal(original, packet);
- fr_pair_list_move(&original->packet_vps, &decoded, T_OP_ADD);
+ fr_pair_list_move(&original->packet_vps, &decoded, T_OP_ADD_EQ);
original->expect = talloc_steal(original, search.expect);
- fr_pair_list_move(&original->expect_vps, &search.expect_vps, T_OP_ADD);
+ fr_pair_list_move(&original->expect_vps, &search.expect_vps, T_OP_ADD_EQ);
if (!fr_pair_list_empty(&search.link_vps)) {
bool ret;
vp = fr_pair_list_next(&search.link_vps, vp)) {
fr_pair_steal(original, vp);
}
- fr_pair_list_move(&original->link_vps, &search.link_vps, T_OP_ADD);
+ fr_pair_list_move(&original->link_vps, &search.link_vps, T_OP_ADD_EQ);
/* We should never have conflicts */
ret = fr_rb_insert(link_tree, original);
}
static const fr_token_t token2op[UINT8_MAX + 1] = {
- [ '+' ] = T_OP_ADD,
- [ '-' ] = T_OP_SUB,
+ [ '+' ] = T_OP_ADD_EQ,
+ [ '-' ] = T_OP_SUB_EQ,
[ '^' ] = T_OP_PREPEND,
- [ '.' ] = T_OP_ADD,
+ [ '.' ] = T_OP_ADD_EQ,
};
/** Perform calculations
/*
* Only process the first value, unless the operator is +=
*/
- if (map->op != T_OP_ADD) break;
+ if (map->op != T_OP_ADD_EQ) break;
}
break;
/*
* Only process the first value, unless the operator is +=
*/
- if (map->op != T_OP_ADD) break;
+ if (map->op != T_OP_ADD_EQ) break;
}
break;
switch (map->op) {
case T_OP_SET:
case T_OP_EQ:
- case T_OP_SUB:
- case T_OP_ADD:
+ case T_OP_SUB_EQ:
+ case T_OP_ADD_EQ:
break;
default:
*/
name2_token = gettoken(&ptr, buff[2], stack->bufsize, false);
switch (name2_token) {
- case T_OP_ADD:
- case T_OP_SUB:
+ case T_OP_ADD_EQ:
+ case T_OP_SUB_EQ:
case T_OP_NE:
case T_OP_GE:
case T_OP_GT:
{ L("!*"), T_OP_CMP_FALSE },
{ L("!="), T_OP_NE },
{ L("!~"), T_OP_REG_NE },
- { L("+="), T_OP_ADD },
- { L("-="), T_OP_SUB },
+ { L("+="), T_OP_ADD_EQ },
+ { L("-="), T_OP_SUB_EQ },
{ L(":="), T_OP_SET },
{ L("<"), T_OP_LT },
{ L("<="), T_OP_LE },
for (vp = fr_pair_list_head(&found);
vp;
vp = fr_pair_list_next(&found, vp)) {
- vp->op = T_OP_ADD;
+ vp->op = T_OP_ADD_EQ;
}
fr_pair_list_append(out, &found);
fr_assert(tmpl_is_exec(map->rhs));
FALL_THROUGH;
- case T_OP_ADD:
- fr_pair_list_move(list, &src_list, T_OP_ADD);
+ case T_OP_ADD_EQ:
+ fr_pair_list_move(list, &src_list, T_OP_ADD_EQ);
fr_pair_list_free(&src_list);
}
goto update;
* - If tmpl_num(map->lhs) == NUM_ANY, we compare all instances of the dst attribute
* against each of the src_list attributes.
*/
- case T_OP_SUB:
+ case T_OP_SUB_EQ:
/* We didn't find any attributes earlier */
if (!dst) {
fr_pair_list_free(&src_list);
/*
* += - Add all src_list attributes to the destination
*/
- case T_OP_ADD:
+ case T_OP_ADD_EQ:
{
tmpl_attr_extent_t *extent = NULL;
fr_dlist_head_t leaf;
}
goto finish;
- case T_OP_ADD:
+ case T_OP_ADD_EQ:
{
fr_pair_list_t vp_from;
* - If tmpl_num(map->lhs) == NUM_ANY, we compare all instances of the found attribute
* against each of the src_list attributes.
*/
- case T_OP_SUB:
+ case T_OP_SUB_EQ:
{
/* We didn't find any attributes earlier */
if (!found) goto finish;
/*
* += - Add all attributes to the destination
*/
- case T_OP_ADD:
+ case T_OP_ADD_EQ:
do_add:
{
fr_pair_list_t vp_from;
* sent to us by the user. It ALWAYS matches.
*/
if ((check_item->op == T_OP_SET) ||
- (check_item->op == T_OP_ADD)) {
+ (check_item->op == T_OP_ADD_EQ)) {
continue;
}
* is empty, and we're supposed to replace or
* "add if not existing".
*/
- if (from_vp->op == T_OP_ADD) goto do_append;
+ if (from_vp->op == T_OP_ADD_EQ) goto do_append;
/*
* The attribute needs to be prepended to the "to"
* Delete all matching attributes from
* "to"
*/
- if ((from_vp->op == T_OP_SUB) ||
+ if ((from_vp->op == T_OP_SUB_EQ) ||
(from_vp->op == T_OP_CMP_EQ) ||
(from_vp->op == T_OP_LE) ||
(from_vp->op == T_OP_GE)) {
if (rcode != 0) goto delete;
break;
- case T_OP_SUB:
+ case T_OP_SUB_EQ:
if (rcode == 0) {
delete:
RDEBUG4("::: DELETING %s FROM %d TO %d",
{ L("!*"), T_OP_CMP_FALSE },
{ L("!="), T_OP_NE },
{ L("!~"), T_OP_REG_NE },
- { L("+="), T_OP_ADD },
+ { L("+="), T_OP_ADD_EQ },
{ L(":="), T_OP_SET },
{ L("<"), T_OP_LT },
{ L("<="), T_OP_LE },
case T_OP_CMP_FALSE:
break;
- case T_OP_ADD:
+ 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);
{
fr_value_box_t one, two;
bool overflow;
+ int64_t when;
fr_assert(dst->type == FR_TYPE_DATE);
}
switch (op) {
- case T_OP_ADD:
- dst->vb_date = fr_unix_time_from_integer(&overflow,
- fr_time_delta_unwrap(a->vb_time_delta) + fr_time_delta_unwrap(b->vb_time_delta),
- FR_TIME_RES_NSEC);
+ case T_OP_ADD_EQ:
+ if (!fr_add(&when, fr_time_delta_unwrap(a->vb_time_delta), fr_time_delta_unwrap(b->vb_time_delta))) return OVERFLOW;
+
+ dst->vb_date = fr_unix_time_from_integer(&overflow, when, FR_TIME_RES_NSEC);
if (overflow) return OVERFLOW; /* overflow */
break;
- case T_OP_SUB:
- dst->vb_date = fr_unix_time_from_integer(&overflow,
- fr_time_delta_unwrap(a->vb_time_delta) - fr_time_delta_unwrap(b->vb_time_delta),
- FR_TIME_RES_NSEC);
+ case T_OP_SUB_EQ:
+ if (!fr_sub(&when, fr_time_delta_unwrap(a->vb_time_delta), fr_time_delta_unwrap(b->vb_time_delta))) return OVERFLOW;
+
+ dst->vb_date = fr_unix_time_from_integer(&overflow, when, FR_TIME_RES_NSEC);
if (overflow) return OVERFLOW; /* overflow */
break;
static int calc_time_delta(UNUSED TALLOC_CTX *ctx, fr_value_box_t *dst, fr_value_box_t const *a, fr_token_t op, fr_value_box_t const *b)
{
fr_value_box_t one, two;
+ int64_t when;
fr_assert(dst->type == FR_TYPE_TIME_DELTA);
* cannot add two dates to get a time delta.
*/
if ((a->type == FR_TYPE_DATE) && (b->type == FR_TYPE_DATE)) {
- if (op != T_OP_SUB) {
+ if (op != T_OP_SUB_EQ) {
fr_strerror_const("Cannot perform operation on two dates");
return -1;
}
}
switch (op) {
- case T_OP_ADD:
- dst->vb_time_delta = fr_time_delta_wrap(fr_time_delta_unwrap(a->vb_time_delta) + fr_time_delta_unwrap(b->vb_time_delta));
+ case T_OP_ADD_EQ:
+ if (!fr_add(&when, fr_time_delta_unwrap(a->vb_time_delta), fr_time_delta_unwrap(b->vb_time_delta))) return OVERFLOW;
+ dst->vb_time_delta = fr_time_delta_wrap(when);
break;
- case T_OP_SUB:
- dst->vb_time_delta = fr_time_delta_wrap(fr_time_delta_unwrap(a->vb_time_delta) - fr_time_delta_unwrap(b->vb_time_delta));
+ case T_OP_SUB_EQ:
+ if (!fr_sub(&when, fr_time_delta_unwrap(a->vb_time_delta), fr_time_delta_unwrap(b->vb_time_delta))) return OVERFLOW;
+ dst->vb_time_delta = fr_time_delta_wrap(when);
break;
default:
fr_value_box_memdup_shallow(dst, dst->enumv, buf, len, a->tainted | b->tainted);
break;
- case T_OP_ADD: /* dst = a . b */
+ case T_OP_ADD_EQ: /* dst = a . b */
buf = talloc_array(ctx, uint8_t, len);
if (!buf) goto oom;
fr_value_box_strdup_shallow(dst, dst->enumv, buf, a->tainted | b->tainted);
break;
- case T_OP_ADD:
+ case T_OP_ADD_EQ:
buf = talloc_array(ctx, char, len + 1);
if (!buf) goto oom;
b = &two;
switch (op) {
- case T_OP_ADD:
+ case T_OP_ADD_EQ:
/*
* For simplicity, make sure that the prefix is first.
*/
b = &two;
switch (op) {
- case T_OP_ADD:
+ case T_OP_ADD_EQ:
/*
* For simplicity, make sure that the prefix is first.
*/
}
switch (op) {
- case T_OP_ADD:
+ case T_OP_ADD_EQ:
dst->vb_float32 = a->vb_float64 + b->vb_float64;
break;
- case T_OP_SUB:
+ case T_OP_SUB_EQ:
dst->vb_float32 = a->vb_float64 - b->vb_float64;
break;
}
switch (op) {
- case T_OP_ADD:
+ case T_OP_ADD_EQ:
dst->vb_float64 = a->vb_float64 + b->vb_float64;
break;
- case T_OP_SUB:
+ case T_OP_SUB_EQ:
dst->vb_float64 = a->vb_float64 - b->vb_float64;
break;
#define CALC(_t) static int calc_ ## _t(UNUSED TALLOC_CTX *ctx, fr_value_box_t *dst, fr_value_box_t const *in1, fr_token_t op, fr_value_box_t const *in2) \
{ \
switch (op) { \
- case T_OP_ADD: \
+ case T_OP_ADD_EQ: \
if (!fr_add(&dst->vb_ ## _t, in1->vb_ ## _t, in2->vb_ ## _t)) return OVERFLOW; \
break; \
\
- case T_OP_SUB: \
+ case T_OP_SUB_EQ: \
if (!fr_sub(&dst->vb_ ## _t, in1->vb_ ## _t, in2->vb_ ## _t)) return OVERFLOW; \
break; \
\
hint = FR_TYPE_BOOL;
break;
- case T_OP_ADD:
- case T_OP_SUB:
+ case T_OP_ADD_EQ:
+ case T_OP_SUB_EQ:
if (a->type == b->type) {
hint = a->type;
break;
rcode = 0;
break;
- case T_OP_ADD:
- case T_OP_SUB:
+ case T_OP_ADD_EQ:
+ case T_OP_SUB_EQ:
case T_OP_PREPEND:
fr_assert(hint != FR_TYPE_NULL);
* Move it from the old list and add it
* to the new list.
*/
- case T_OP_ADD:
+ case T_OP_ADD_EQ:
do_add:
j = fr_pair_list_next(from, i);
fr_pair_remove(from, i);
* Move it from the old list and add it
* to the new list.
*/
- case T_OP_ADD:
+ case T_OP_ADD_EQ:
do_add:
j = fr_pair_list_next(from, i);
fr_pair_remove(from, i);
TEST_CHECK(pfiledone == true);
TEST_CASE("Move pair from 'old_list' to 'new_list' using fr_pair_list_move()");
- fr_pair_list_move(&new_list, &old_list, T_OP_ADD);
+ fr_pair_list_move(&new_list, &old_list, T_OP_ADD_EQ);
TEST_CASE("Looking for Test-Uint32-0");
TEST_CHECK((vp = fr_pair_find_by_da_idx(&new_list, fr_dict_attr_test_uint32, 0)) != NULL);
{ L(")"), T_RBRACE },
{ L(","), T_COMMA },
{ L("++"), T_OP_INCRM },
- { L("+="), T_OP_ADD },
- { L("-="), T_OP_SUB },
+ { L("+="), T_OP_ADD_EQ },
+ { L("-="), T_OP_SUB_EQ },
{ L(":="), T_OP_SET },
{ L("=*"), T_OP_CMP_TRUE },
{ L("!*"), T_OP_CMP_FALSE },
const bool fr_assignment_op[T_TOKEN_LAST + 1] = {
T(INCRM),
- T(ADD),
- T(SUB),
+ T(ADD_EQ),
+ T(SUB_EQ),
T(SET),
T(EQ),
T(PREPEND),
T_SEMICOLON, /* ; */
T_OP_INCRM, /* ++ */
- T_OP_ADD, /* += */
- T_OP_SUB, /* -= 10 */
+ T_OP_ADD_EQ, /* += */
+ T_OP_SUB_EQ, /* -= 10 */
T_OP_SET, /* := */
T_OP_EQ, /* = */
T_OP_NE, /* != */
T_TOKEN_LAST
} fr_token_t;
-#define T_EQSTART T_OP_ADD
+#define T_EQSTART T_OP_ADD_EQ
#define T_EQEND (T_HASH)
/** Macro to use as dflt
vp->op = map->op;
fr_pair_append(&head, vp);
- if (map->op != T_OP_ADD) break; /* Create multiple attribute for multiple CONF_PAIRs */
+ if (map->op != T_OP_ADD_EQ) break; /* Create multiple attribute for multiple CONF_PAIRs */
}
fr_pair_list_append(out, &head);
switch (map->op) {
case T_OP_SET:
case T_OP_EQ:
- case T_OP_SUB:
- case T_OP_ADD:
+ case T_OP_SUB_EQ:
+ case T_OP_ADD_EQ:
case T_OP_PREPEND:
case T_OP_LT:
case T_OP_GT:
ctx = tmpl_list_ctx(request, inst->output_list);
fr_pair_list_afrom_box(ctx, &vps, request->dict, box);
- if (!fr_pair_list_empty(&vps)) fr_pair_list_move(output_pairs, &vps, T_OP_ADD);
+ if (!fr_pair_list_empty(&vps)) fr_pair_list_move(output_pairs, &vps, T_OP_ADD_EQ);
fr_dlist_talloc_free(&m->box); /* has been consumed */
}
switch (map->op) {
case T_OP_EQ:
case T_OP_SET:
- case T_OP_ADD:
+ case T_OP_ADD_EQ:
fr_pair_list_init(&tmp_list);
if (map_to_vp(request->control_ctx, &tmp_list, request, map, NULL) < 0) {
fr_pair_list_free(&list);
/*
* Move the control items over, too.
*/
- fr_pair_list_move(&request->control_pairs, &list, T_OP_ADD);
+ fr_pair_list_move(&request->control_pairs, &list, T_OP_ADD_EQ);
fr_pair_list_free(&list);
/* ctx may be reply */
* T_OP_EQ is *NOT* supported, it is impossible to
* support because of the lack of transactions in LDAP
*/
- case T_OP_ADD:
+ case T_OP_ADD_EQ:
mod_s[total].mod_op = LDAP_MOD_ADD;
break;
mod_s[total].mod_op = LDAP_MOD_REPLACE;
break;
- case T_OP_SUB:
+ case T_OP_SUB_EQ:
case T_OP_CMP_FALSE:
mod_s[total].mod_op = LDAP_MOD_DELETE;
break;
len = av_len(av);
for (j = 0; j <= len; j++) {
av_sv = av_fetch(av, j, 0);
- ret = pairadd_sv(ctx, request, vps, key, *av_sv, T_OP_ADD, hash_name, list_name) + ret;
+ ret = pairadd_sv(ctx, request, vps, key, *av_sv, T_OP_ADD_EQ, hash_name, list_name) + ret;
}
} else ret = pairadd_sv(ctx, request, vps, key, res_sv, T_OP_EQ, hash_name, list_name) + ret;
}
* Automagically switch the op for multivalued attributes.
*/
if (((flags.op == T_OP_SET) || (flags.op == T_OP_EQ)) && (i >= 1)) {
- flags.op = T_OP_ADD;
+ flags.op = T_OP_ADD_EQ;
}
if (json_object_is_type(element, json_type_object) && !flags.is_json) {