#include <freeradius-devel/util/perm.h>
#include <freeradius-devel/util/sem.h>
#include <freeradius-devel/util/token.h>
+#include <freeradius-devel/util/pair_legacy.h>
#include <freeradius-devel/unlang/xlat_func.h>
{ FR_CONF_OFFSET("use_new_conditions", FR_TYPE_BOOL | FR_TYPE_HIDDEN, main_config_t, use_new_conditions) },
{ FR_CONF_OFFSET("rewrite_update", FR_TYPE_BOOL | FR_TYPE_HIDDEN, main_config_t, rewrite_update) },
{ FR_CONF_OFFSET("forbid_update", FR_TYPE_BOOL | FR_TYPE_HIDDEN, main_config_t, forbid_update) },
+ { FR_CONF_POINTER("pair_legacy_nested", FR_TYPE_BOOL | FR_TYPE_HIDDEN, &fr_pair_legacy_nested), },
+
CONF_PARSER_TERMINATOR
};
fr_value_box_t box;
size_t offset;
char const *p;
+ bool *out;
p = strchr(value, '=');
if (!p) return -1;
offset = fr_table_value_by_substr(config_arg_table, value, p - value, 0);
- if (!offset) return -1;
+ if (offset) {
+ out = (((uintptr_t) main_config) + offset);
+
+ } else if (strncmp(p, "pair_legacy_nested", p - value) != 0) {
+ out = &fr_pair_legacy_nested;
+
+ } else {
+ return -1;
+ }
p += 1;
fr_exit(1);
}
- *(bool *) (((uintptr_t) main_config) + offset) = box.vb_bool;
+ *out = box.vb_bool;
return 0;
}
if (!main_config) return false;
+ if (strcmp(name, "pair_legacy_nested") == 0) return fr_pair_legacy_nested;
+
offset = fr_table_value_by_substr(config_arg_table, name, strlen(name), 0);
if (!offset) return false;
#include <freeradius-devel/protocol/radius/rfc2865.h>
#include <freeradius-devel/protocol/freeradius/freeradius.internal.h>
+bool fr_pair_legacy_nested = false;
+
static fr_sbuff_term_t const bareword_terminals =
FR_SBUFF_TERMS(
L("\t"),
* @param[in,out] token The last token we parsed
* @param[in] depth the nesting depth for FR_TYPE_GROUP
* @param[in,out] relative_vp for relative attributes
- * @param[in] nested create nested attributes (or not)
* @return
* - <= 0 on failure.
* - The number of bytes of name consumed on success.
*/
static ssize_t fr_pair_list_afrom_substr(TALLOC_CTX *ctx, fr_dict_attr_t const *parent, fr_pair_t *parent_vp, char const *buffer, char const *end,
- fr_pair_list_t *list, fr_token_t *token, unsigned int depth, fr_pair_t **relative_vp, bool nested)
+ fr_pair_list_t *list, fr_token_t *token, unsigned int depth, fr_pair_t **relative_vp)
{
fr_pair_t *vp = NULL;
fr_pair_t *my_relative_vp;
fr_skip_whitespace(p);
- if (!nested || parent_vp || (*relative_vp && ((*relative_vp)->da == da->parent))) {
+ if (!fr_pair_legacy_nested || parent_vp || (*relative_vp && ((*relative_vp)->da == da->parent))) {
vp = fr_pair_afrom_da(my_ctx, da);
if (!vp) goto error;
fr_pair_append(my_list, vp);
*/
my_relative_vp = NULL;
- slen = fr_pair_list_afrom_substr(vp, vp->da, vp, p, end, &vp->vp_group, &last_token, depth + 1, &my_relative_vp, nested);
+ slen = fr_pair_list_afrom_substr(vp, vp->da, vp, p, end, &vp->vp_group, &last_token, depth + 1, &my_relative_vp);
if (slen <= 0) {
goto error;
}
fr_pair_list_init(&tmp_list);
- if (fr_pair_list_afrom_substr(ctx, parent, NULL, buffer, buffer + len, &tmp_list, &token, 0, &relative_vp, false) < 0) {
+ if (fr_pair_list_afrom_substr(ctx, parent, NULL, buffer, buffer + len, &tmp_list, &token, 0, &relative_vp) < 0) {
fr_pair_list_free(&tmp_list);
return T_INVALID;
}
/*
* Call our internal function, instead of the public wrapper.
*/
- if (fr_pair_list_afrom_substr(ctx, fr_dict_root(dict), NULL, buf, buf + strlen(buf), &tmp_list, &last_token, 0, &relative_vp, false) < 0) {
+ if (fr_pair_list_afrom_substr(ctx, fr_dict_root(dict), NULL, buf, buf + strlen(buf), &tmp_list, &last_token, 0, &relative_vp) < 0) {
goto fail;
}