From: Alan T. DeKok Date: Wed, 14 Jan 2026 16:33:30 +0000 (-0500) Subject: squash the nested names down when debugging X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3535481caaa9c1d093895a6296f9d381f98499f2;p=thirdparty%2Ffreeradius-server.git squash the nested names down when debugging --- diff --git a/src/lib/unlang/edit.c b/src/lib/unlang/edit.c index 2524ea58ad2..e8098556336 100644 --- a/src/lib/unlang/edit.c +++ b/src/lib/unlang/edit.c @@ -211,7 +211,7 @@ static int tmpl_to_values(TALLOC_CTX *ctx, edit_result_t *out, request_t *reques static void edit_debug_attr_list(request_t *request, fr_pair_list_t const *list, map_t const *map); -static void edit_debug_attr_vp(request_t *request, fr_pair_t *vp, map_t const *map) +static void edit_debug_attr_vp(request_t *request, fr_pair_t const *vp, map_t const *map) { fr_assert(vp != NULL); @@ -230,9 +230,28 @@ static void edit_debug_attr_vp(request_t *request, fr_pair_t *vp, map_t const *m break; } } else { + size_t slen; + char const *name; + fr_sbuff_t sbuff; + char buffer[1024]; + + sbuff = FR_SBUFF_OUT(buffer, sizeof(buffer)); + + /* + * Squash the names down if necessary. + */ + if (!RDEBUG_ENABLED3) { + slen = fr_pair_print_name(&sbuff, NULL, &vp); + if (slen <= 0) return; + name = buffer; + + } else { + name = vp->da->name; + } + switch (vp->vp_type) { case FR_TYPE_STRUCTURAL: - RDEBUG2("%s = {", vp->da->name); + RDEBUG2("%s = {", name); RINDENT(); edit_debug_attr_list(request, &vp->vp_group, NULL); REXDENT(); @@ -240,7 +259,8 @@ static void edit_debug_attr_vp(request_t *request, fr_pair_t *vp, map_t const *m break; default: - RDEBUG_ASSIGN(vp->da->name, vp->op, &vp->data); + if (fr_pair_print_value_quoted(&sbuff, vp, T_DOUBLE_QUOTED_STRING) <= 0) return; + RDEBUG2("%s", fr_sbuff_start(&sbuff)); break; } } diff --git a/src/lib/unlang/xlat_builtin.c b/src/lib/unlang/xlat_builtin.c index e48a881d2c4..02629f5a33f 100644 --- a/src/lib/unlang/xlat_builtin.c +++ b/src/lib/unlang/xlat_builtin.c @@ -109,7 +109,7 @@ done: } -static void xlat_debug_attr_vp(request_t *request, fr_pair_t *vp); +static void xlat_debug_attr_vp(request_t *request, fr_pair_t const *vp); static void xlat_debug_attr_list(request_t *request, fr_pair_list_t const *list) { @@ -128,15 +128,30 @@ static xlat_arg_parser_t const xlat_pair_cursor_args[] = { XLAT_ARG_PARSER_TERMINATOR }; -static void xlat_debug_attr_vp(request_t *request, fr_pair_t *vp) +static void xlat_debug_attr_vp(request_t *request, fr_pair_t const *vp) { fr_dict_vendor_t const *vendor; fr_table_num_ordered_t const *type; size_t i; + ssize_t slen; + char const *name; + char buffer[1024]; + + /* + * Squash the names down if necessary. + */ + if (!RDEBUG_ENABLED3) { + slen = fr_pair_print_name(&FR_SBUFF_OUT(buffer, sizeof(buffer)), NULL, &vp); + if (slen <= 0) return; + name = buffer; + + } else { + name = vp->da->name; + } switch (vp->vp_type) { case FR_TYPE_STRUCTURAL: - RIDEBUG2("%s = {", vp->da->name); + RIDEBUG2("%s = {", name); RINDENT(); xlat_debug_attr_list(request, &vp->vp_group); REXDENT(); @@ -144,7 +159,7 @@ static void xlat_debug_attr_vp(request_t *request, fr_pair_t *vp) break; default: - RIDEBUG2("%s = %pV", vp->da->name, &vp->data); + RIDEBUG2("%s = %pV", name, &vp->data); } if (!RDEBUG_ENABLED3) return; @@ -194,9 +209,10 @@ static void xlat_debug_attr_vp(request_t *request, fr_pair_t *vp) */ if (!fr_type_is_leaf(type->value) || !fr_type_is_leaf(vp->vp_type)) goto next_type; - MEM(dst = fr_value_box_alloc_null(vp)); + MEM(dst = fr_value_box_acopy(NULL, &vp->data)); + /* We expect some to fail */ - if (fr_value_box_cast(dst, dst, type->value, NULL, &vp->data) < 0) { + if (fr_value_box_cast_in_place(dst, dst, type->value, NULL) < 0) { goto next_type; } diff --git a/src/lib/util/pair.h b/src/lib/util/pair.h index 3ce5d341baf..26828f14a5c 100644 --- a/src/lib/util/pair.h +++ b/src/lib/util/pair.h @@ -844,6 +844,8 @@ static inline fr_slen_t CC_HINT(nonnull(2,3)) fr_pair_t const *vp, fr_token_t quote) SBUFF_OUT_TALLOC_FUNC_NO_LEN_DEF(fr_pair_print_value_quoted, vp, quote) +ssize_t fr_pair_print_name(fr_sbuff_t *out, fr_dict_attr_t const *parent, fr_pair_t const **vp_p); + ssize_t fr_pair_print(fr_sbuff_t *out, fr_dict_attr_t const *parent, fr_pair_t const *vp) CC_HINT(nonnull(1,3)); @@ -861,11 +863,11 @@ static inline fr_slen_t CC_HINT(nonnull(2,4)) SBUFF_OUT_TALLOC_FUNC_NO_LEN_DEF(fr_pair_print_secure, parent, vp) #define fr_pair_list_log(_log, _lvl, _list) _fr_pair_list_log(_log, _lvl, NULL, _list, __FILE__, __LINE__) -void _fr_pair_list_log(fr_log_t const *log, int lvl, fr_pair_t *parent, +void _fr_pair_list_log(fr_log_t const *log, int lvl, fr_pair_t const *parent, fr_pair_list_t const *list, char const *file, int line) CC_HINT(nonnull(1,4)); void fr_pair_list_debug(FILE *fp, fr_pair_list_t const *list) CC_HINT(nonnull); -void _fr_pair_list_debug(FILE *fp, int lvl, fr_pair_t *parent, fr_pair_list_t const *list) +void _fr_pair_list_debug(FILE *fp, int lvl, fr_pair_t const *parent, fr_pair_list_t const *list) CC_HINT(nonnull(1, 4)); void fr_pair_debug(FILE *fp, fr_pair_t const *pair) CC_HINT(nonnull); diff --git a/src/lib/util/pair_legacy.c b/src/lib/util/pair_legacy.c index 4ea295d59c5..bd1d2a2c433 100644 --- a/src/lib/util/pair_legacy.c +++ b/src/lib/util/pair_legacy.c @@ -497,6 +497,11 @@ redo: goto error; } + /* + * People can use this, but it doesn't mean anything. + */ + if (op == T_OP_SET) op = T_OP_EQ; + } else { /* * @todo - handle different operators ala v3? diff --git a/src/lib/util/pair_print.c b/src/lib/util/pair_print.c index 4f87b19f28a..2cb91a16355 100644 --- a/src/lib/util/pair_print.c +++ b/src/lib/util/pair_print.c @@ -21,7 +21,7 @@ */ #define fr_pair_reset_parent(parent) do { \ if (!parent) break; \ - fr_assert(parent != vp->da); \ + fr_assert((parent != vp->da) || (parent->type == FR_TYPE_GROUP)); \ fr_assert(fr_type_is_structural(parent->type)); \ if (parent->type == FR_TYPE_GROUP) { \ parent = fr_dict_attr_ref(parent); \ @@ -133,7 +133,7 @@ static ssize_t fr_pair_print_value(fr_sbuff_t *out, fr_pair_t const *vp) * - Length of data written to out. * - value >= outlen on truncation. */ -static ssize_t fr_pair_print_name(fr_sbuff_t *out, fr_dict_attr_t const *parent, fr_pair_t const **vp_p) +ssize_t fr_pair_print_name(fr_sbuff_t *out, fr_dict_attr_t const *parent, fr_pair_t const **vp_p) { char const *token; fr_pair_t const *vp = *vp_p; @@ -341,34 +341,30 @@ ssize_t fr_pair_list_print(fr_sbuff_t *out, fr_dict_attr_t const *parent, fr_pai FR_SBUFF_SET_RETURN(out, &our_out); } -static void fr_pair_list_log_sbuff(fr_log_t const *log, int lvl, fr_pair_t *parent, fr_pair_list_t const *list, char const *file, int line, fr_sbuff_t *sbuff) +static void fr_pair_list_log_sbuff(fr_log_t const *log, int lvl, fr_pair_t const *parent, fr_pair_list_t const *list, char const *file, int line, fr_sbuff_t *sbuff) { - fr_dict_attr_t const *parent_da = NULL; - fr_pair_list_foreach(list, vp) { + fr_pair_t const *child = vp; + PAIR_VERIFY_WITH_LIST(list, vp); fr_sbuff_set_to_start(sbuff); - if (vp->vp_raw) (void) fr_sbuff_in_strcpy(sbuff, "raw."); - - if (parent && (parent->vp_type != FR_TYPE_GROUP)) parent_da = parent->da; - if (fr_dict_attr_oid_print(sbuff, parent_da, vp->da, false) <= 0) return; + if (fr_pair_print_name(sbuff, parent ? parent->da : NULL, &child) <= 0) return; /* * Recursively print grouped attributes. */ - switch (vp->vp_type) { + switch (child->vp_type) { case FR_TYPE_STRUCTURAL: fr_log(log, L_DBG, file, line, "%*s%*s {", lvl * 2, "", (int) fr_sbuff_used(sbuff), fr_sbuff_start(sbuff)); - _fr_pair_list_log(log, lvl + 1, vp, &vp->vp_group, file, line); + _fr_pair_list_log(log, lvl + 1, child, &child->vp_group, file, line); fr_log(log, L_DBG, file, line, "%*s}", lvl * 2, ""); break; default: - (void) fr_sbuff_in_strcpy(sbuff, " = "); - if (fr_pair_print_value(sbuff, vp) < 0) break; + if (fr_pair_print_value(sbuff, child) < 0) break; fr_log(log, L_DBG, file, line, "%*s%*s", lvl * 2, "", (int) fr_sbuff_used(sbuff), fr_sbuff_start(sbuff)); @@ -386,7 +382,7 @@ static void fr_pair_list_log_sbuff(fr_log_t const *log, int lvl, fr_pair_t *pare * @param[in] file where the message originated * @param[in] line where the message originated */ -void _fr_pair_list_log(fr_log_t const *log, int lvl, fr_pair_t *parent, fr_pair_list_t const *list, char const *file, int line) +void _fr_pair_list_log(fr_log_t const *log, int lvl, fr_pair_t const *parent, fr_pair_list_t const *list, char const *file, int line) { fr_sbuff_t sbuff; char buffer[1024]; @@ -398,33 +394,29 @@ void _fr_pair_list_log(fr_log_t const *log, int lvl, fr_pair_t *parent, fr_pair_ fr_pair_list_log_sbuff(log, lvl, parent, list, file, line, &sbuff); } -static void fr_pair_list_debug_sbuff(FILE *fp, int lvl, fr_pair_t *parent, fr_pair_list_t const *list, fr_sbuff_t *sbuff) +static void fr_pair_list_debug_sbuff(FILE *fp, int lvl, fr_pair_t const *parent, fr_pair_list_t const *list, fr_sbuff_t *sbuff) { - fr_dict_attr_t const *parent_da = NULL; - fr_pair_list_foreach(list, vp) { + fr_pair_t const *child = vp; + PAIR_VERIFY_WITH_LIST(list, vp); fr_sbuff_set_to_start(sbuff); - if (vp->vp_raw) (void) fr_sbuff_in_strcpy(sbuff, "raw."); - - if (parent && (parent->vp_type != FR_TYPE_GROUP)) parent_da = parent->da; - if (fr_dict_attr_oid_print(sbuff, parent_da, vp->da, false) <= 0) return; + if (fr_pair_print_name(sbuff, parent ? parent->da : NULL, &child) <= 0) return; /* * Recursively print grouped attributes. */ - switch (vp->vp_type) { + switch (child->vp_type) { case FR_TYPE_STRUCTURAL: fprintf(fp, "%*s%*s {\n", lvl * 2, "", (int) fr_sbuff_used(sbuff), fr_sbuff_start(sbuff)); - _fr_pair_list_debug(fp, lvl + 1, vp, &vp->vp_group); + _fr_pair_list_debug(fp, lvl + 1, child, &child->vp_group); fprintf(fp, "%*s}\n", lvl * 2, ""); break; default: - (void) fr_sbuff_in_strcpy(sbuff, " = "); - if (fr_value_box_print_quoted(sbuff, &vp->data, T_DOUBLE_QUOTED_STRING)< 0) break; + if (fr_value_box_print_quoted(sbuff, &child->data, T_DOUBLE_QUOTED_STRING)< 0) break; fprintf(fp, "%*s%*s\n", lvl * 2, "", (int) fr_sbuff_used(sbuff), fr_sbuff_start(sbuff)); } @@ -438,7 +430,7 @@ static void fr_pair_list_debug_sbuff(FILE *fp, int lvl, fr_pair_t *parent, fr_pa * @param[in] parent parent attribute * @param[in] list to print. */ -void _fr_pair_list_debug(FILE *fp, int lvl, fr_pair_t *parent, fr_pair_list_t const *list) +void _fr_pair_list_debug(FILE *fp, int lvl, fr_pair_t const *parent, fr_pair_list_t const *list) { fr_sbuff_t sbuff; char buffer[1024];