]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Adopt a standard naming convention and signture for debug functions
authorJames Jones <jejones3141@gmail.com>
Fri, 31 Jan 2025 19:56:05 +0000 (13:56 -0600)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 31 Jul 2025 21:20:27 +0000 (14:20 -0700)
To get the "dd" debugger command to work without having to create an
wxplicit mapping from type to function either by hand or by runtime
inspection (the latter preventing setting up the command at debugger
startup), the debug functions that dd calls should have a type of
the form

    foo_debug(FILE *fp, foo_t const *)

We add the qualifier becausen
 * some support functions with extra parameters are meant to be
   called by these functions, which pass the additional parameters;
   the functions we do call can pass fp along, or in the case of
   src/lib/util/dict_print.c, add fp to the context
 * fe_dict_attr_t * has three debug functions
 * fr_pair_validate_debug() takes a pointer to an array, and
   thus can't follow the convention
 * virtual_server_{listen, process}_debug() and module_rlm_list_debug()
   have *no* parameters

37 files changed:
debugger/dd.py
src/bin/fuzzer.c
src/bin/unit_test_attribute.c
src/lib/io/atomic_queue.c
src/lib/io/atomic_queue.h
src/lib/io/message.c
src/lib/io/message.h
src/lib/io/queue.c
src/lib/io/queue.h
src/lib/io/ring_buffer.c
src/lib/io/ring_buffer.h
src/lib/server/command.c
src/lib/server/command.h
src/lib/server/tmpl.h
src/lib/server/tmpl_dcursor.c
src/lib/server/tmpl_tokenize.c
src/lib/unlang/edit.c
src/lib/unlang/xlat_builtin.c
src/lib/unlang/xlat_eval.c
src/lib/unlang/xlat_expr.c
src/lib/util/dict.h
src/lib/util/dict_print.c
src/lib/util/dict_util.c
src/lib/util/dl.c
src/lib/util/dl.h
src/lib/util/pair.h
src/lib/util/pair_print.c
src/lib/util/sbuff.c
src/lib/util/sbuff.h
src/lib/util/value.c
src/lib/util/value.h
src/protocols/dns/encode.c
src/tests/util/atomic_queue_test.c
src/tests/util/channel_test.c
src/tests/util/message_set_test.c
src/tests/util/radius1_test.c
src/tests/util/worker_test.c

index 9c184271e2af28fb86abbfa80c35c839794eed80..527e5858abefc8dc7e0d43a38d19b8930dd85143 100644 (file)
@@ -3,9 +3,9 @@
 #
 # Syntax: dd <variable name>
 #
-# where the variable named either has one of the types
-# shown in the _howTo list or whose address has one of the
-# types shown in the _howTo list.
+# where <variable name> has a type foo * or foo for which
+# there is a function foo_debug(FILE *, foo_t *) that presumably
+# displays values of type foo_t in a useful, legible format.
 #
 # When the command is run, it calls the appropriate FreeRADIUS
 # function to display the value the variable points at (or
 # we're running under gdb or lldb, we can have a single Python
 # source that can do the right thing for the debugger it's running
 # under.
+#
+# NOTE: this function cheerfully assumes such functions exist, but
+# will report if the call fails (modulo an issue with lldb and
+# fr_value_box_t being defined twice--see below). The idea is that
+# these reports will point out where an appropriate foo_debug()
+# function needs to exist or to be modified to fit the signature.
 
 import sys
 
-_howTo = {
-    'fr_value_box_t *'           : ('fr_value_box_debug',              True),
-    'fr_value_box_list_t *'      : ('fr_value_box_list_debug',         True),
-    'tmpl_t *'                   : ('tmpl_debug',                      True),
-    'CONF_ITEM *'                : ('_cf_debug',                       True),
-    'dl_loader_t *'              : ('dl_loader_debug',                 False),
-    'fr_dict_gctx_t * '          : ('fr_dict_global_ctx_debug',                True),
-    'fr_pair_t *'                : ('fr_pair_debug',                   True),
-    'fr_pair_list_t *'           : ('fr_pair_list_debug',              True),
-    'fr_sbuff_term_t *'          : ('fr_sbuff_terminal_debug',         True),
-    'fr_sbuff_parse_rules_t *'   : ('fr_sbuff_parse_rules_debug',      True),
-    'fr_sbuff_unescape_rules_t *': ('fr_sbuff_unescape_debug',         True),
-    'tmpl_attr_list_head_t *'    : ('tmpl_attr_ref_list_debug',                True),
-    'tmpl_attr_rules_t *'        : ('tmpl_attr_rules_debug',           True),
-    'fr_dlist_head_t *'          : ('tmpl_extents_debug',              False),
-    'tmpl_request_list_head_t *' : ('tmpl_request_ref_list_debug',     True),
-    'tmpl_rules_t *'             : ('tmpl_rules_debug',                        True),
-    'lua_State *'                : ('_util_log_debug',                 False),
-    'xlat_exp_t *'               : ('xlat_debug',                      True)
-}
+def debug_function(ptr_foo_name):
+    # ditch trailng ' *' (will always be there)
+    ptr_foo_name = ptr_foo_name[:-2]
+    # ditch trailing ' const'
+    if ptr_foo_name.endswith(' const'):
+        ptr_foo_name = ptr_foo_name[:-6]
+    # ditch trailing '_t' (again should always be there)
+    if ptr_foo_name.endswith('_t'):
+        ptr_foo_name = ptr_foo_name[:-2]
+    return f'{ptr_foo_name}_debug'
 
 try:
     import gdb  # Attempt to import GDB module
@@ -85,17 +81,13 @@ if dbg == "lldb":
         if not sb_var.IsValid():
             sb_var = target.FindFirstGlobalVariable(command)
         if not sb_var.IsValid():
-            result.SetError('{} is not a variable'.format(command))
+            result.SetError(f'{command} is not a variable')
             return
         arg = sb_var if sb_var.type.is_pointer else sb_var.address_of
         type = arg.GetDisplayTypeName()
-        if not (type in _howTo):
-            result.SetError('unsupported type "{}"'.format(type))
-            return
-        function, const = _howTo[type]
-        cast = '({} const *)'.format(type[0:-2]) if const else ''
-        argName = arg.GetName()
-        cmd = 'expr {0}({1}({2}))'.format(function, cast, argName)
+        function = debug_function(type)
+        cast = f'({type[:-2]} const *)'
+        cmd = f'expr {function}(stderr, {cast}({arg.GetName()}))'
         interpreter = debugger.GetCommandInterpreter()
         if not interpreter.IsValid():
            result.SetError("can't set up SBCommandInterpreter")
@@ -106,7 +98,7 @@ if dbg == "lldb":
         for i in range(2):
             if (cmdStatus := interpreter.HandleCommand(cmd, result)) == lldb.eReturnStatusSuccessFinishResult:
                 return
-        result.SetError("command {} failed, status {}".format(cmd, cmdStatus))
+        result.SetError(f'command "{cmd}" failed, status {cmdStatus}')
 
     # And then some boilerplate to set up the command and announce its availability.
     # I'm guessing that the -f option is <file name without extension>.<name of function>,
@@ -138,12 +130,9 @@ else:
                 argMod = '&'
                 var = var.address
             varType = str(var.type)
-            if not (varType in _howTo):
-                print('unsupported type "{}"'.format(varType))
-                return
-            function, const = _howTo[varType]
-            cast = '({} const *)'.format(varType[0:-2]) if const else ''
-            command = 'call {0}({1}{2}({3}))'.format(function, cast, argMod, arg)
+            function = debug_function(varType)
+            cast = f'({varType[0:-2]} const *)'
+            command = f'call {function}(stderr, {cast}{argMod}({arg}))'
             try:
                 gdb.execute(command)
             except:
index 03353ac43236c1716611c56e926c39e02c5713ce..a36eca7dd1dd1c864b4b9645839b8966bb85a294 100644 (file)
@@ -270,7 +270,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *buf, size_t len)
        }
 
        tp->func(ctx, &vps, buf, len, decode_ctx);
-       if (fr_debug_lvl > 3) fr_pair_list_debug(&vps);
+       if (fr_debug_lvl > 3) fr_pair_list_debug(stderr, &vps);
 
        talloc_free(decode_ctx);
        talloc_free(ctx);
index a44aef542d1020d656b881689486d167ca0c9c99..95d8dcf0d069fb27426e9257c2d67e9f495afe89 100644 (file)
@@ -1046,6 +1046,7 @@ static int dictionary_load_common(command_result_t *result, command_file_ctx_t *
         */
        if (fr_debug_lvl > 5) fr_dict_debug(fr_log_fp, cc->tmpl_rules.attr.dict_def);
 
+
        RETURN_OK(0);
 }
 
@@ -1155,7 +1156,7 @@ static void command_print(void)
        void *walk_ctx = NULL;
 
        printf("Command hierarchy --------");
-       fr_command_debug(stdout, command_head);
+       fr_cmd_debug(stdout, command_head);
 
        printf("Command list --------");
        while (fr_command_walk(command_head, &walk_ctx, NULL, command_walk) == 1) {
index 4c9b7eac8aec45848041939320b3ab29e966ff9f..7bf0bcdaf1da661fb7f93ed0bd7152f129bae325 100644 (file)
@@ -169,7 +169,7 @@ bool fr_atomic_queue_push(fr_atomic_queue_t *aq, void *data)
                 */
                if (diff < 0) {
 #if 0
-                       fr_atomic_queue_debug(aq, stderr);
+                       fr_atomic_queue_debug(stderr, aq);
 #endif
                        return false;
                }
@@ -298,7 +298,7 @@ typedef struct {
  * @param[in] aq       The atomic queue to debug.
  * @param[in] fp       where the debugging information will be printed.
  */
-void fr_atomic_queue_debug(fr_atomic_queue_t *aq, FILE *fp)
+void fr_atomic_queue_debug(FILE * fp, fr_atomic_queue_t *aq)
 {
        size_t i;
        int64_t head, tail;
index fb096dd9a62ff019c2dd770f854ec76775c3c2da..015e143b73fbdb9f075631d1d11e0190bc058450 100644 (file)
@@ -64,7 +64,7 @@ void                  fr_atomic_queue_verify(fr_atomic_queue_t *aq);
 #endif
 
 #ifndef NDEBUG
-void                   fr_atomic_queue_debug(fr_atomic_queue_t *aq, FILE *fp);
+void                   fr_atomic_queue_debug(FILE *fp, fr_atomic_queue_t *aq);
 #endif
 
 
index 986864d4ac3fcfcc45754b9048f12929e9f54319..e3e729be210e9929fa8688a9ed8603ea6dd93e23 100644 (file)
@@ -1259,7 +1259,7 @@ void fr_message_set_gc(fr_message_set_t *ms)
  * @param[in] ms the message set
  * @param[in] fp the FILE where the messages are printed.
  */
-void fr_message_set_debug(fr_message_set_t *ms, FILE *fp)
+void fr_message_set_debug(FILE *fp, fr_message_set_t *ms)
 {
        int i;
 
index 7206e0084927a678f99326376394966cea8ac4fd..6d4182f00de150c6a35be1874ceef9a21e0af2fd 100644 (file)
@@ -64,7 +64,7 @@ fr_message_t *fr_message_localize(TALLOC_CTX *ctx, fr_message_t *m, size_t messa
 int fr_message_set_messages_used(fr_message_set_t *ms) CC_HINT(nonnull);
 void fr_message_set_gc(fr_message_set_t *ms) CC_HINT(nonnull);
 
-void fr_message_set_debug(fr_message_set_t *ms, FILE *fp) CC_HINT(nonnull);
+void fr_message_set_debug(FILE *fp, fr_message_set_t *ms) CC_HINT(nonnull);
 
 #ifdef __cplusplus
 }
index d548ba35be7ea8fa5baf0a68d3dddacbe6674101..37eb67c7cc097938b50019e1a84f90bec26b2326 100644 (file)
@@ -252,10 +252,10 @@ int fr_queue_localize_atomic(fr_queue_t *fq, fr_atomic_queue_t *aq)
 #ifndef NDEBUG
 /**  Dump a queue.
  *
- * @param[in] fq the queue
  * @param[in] fp where the debugging information will be printed.
+ * @param[in] fq the queue
  */
-void fr_queue_debug(fr_queue_t *fq, FILE *fp)
+void fr_queue_debug(FILE *fp, fr_queue_t *fq)
 {
        int i;
 
index 12e9e6d7e79e169f6e9360995ff9f5a523ec71be..c6d7b536104b79ea28c1cda72332268fc1948e74 100644 (file)
@@ -47,7 +47,7 @@ int fr_queue_num_elements(fr_queue_t *fq) CC_HINT(nonnull);
 int fr_queue_localize_atomic(fr_queue_t *fq, fr_atomic_queue_t *aq) CC_HINT(nonnull);
 
 #ifndef NDEBUG
-void fr_queue_debug(fr_queue_t *fq, FILE *fp) CC_HINT(nonnull);
+void fr_queue_debug(FILE *fp, fr_queue_t *fq) CC_HINT(nonnull);
 #endif
 
 
index 3589c946da23712a0b0d8a251f91b9b6ba610e80..8495779e4babdb109d907093e391556a1dec8de4 100644 (file)
@@ -482,7 +482,7 @@ int fr_ring_buffer_start(fr_ring_buffer_t *rb, uint8_t **p_start, size_t *p_size
  * @param[in] rb the ring buffer
  * @param[in] fp the FILE where the messages are printed.
  */
-void fr_ring_buffer_debug(fr_ring_buffer_t *rb, FILE *fp)
+void fr_ring_buffer_debug(FILE *fp, fr_ring_buffer_t *rb)
 {
        fprintf(fp, "Buffer %p, write_offset %zu, data_start %zu, data_end %zu\n",
                rb->buffer, rb->write_offset, rb->data_start, rb->data_end);
index d8f3088307a19dd06a1395d94256ebc8330c2593..2ea27b52a67d6c23d96ebc58552d1faedc42fa7a 100644 (file)
@@ -52,7 +52,7 @@ size_t                        fr_ring_buffer_size(fr_ring_buffer_t *rb) CC_HINT(nonnull);
 
 size_t                         fr_ring_buffer_used(fr_ring_buffer_t *rb) CC_HINT(nonnull);
 
-void                   fr_ring_buffer_debug(fr_ring_buffer_t *rb, FILE *fp) CC_HINT(nonnull);
+void                   fr_ring_buffer_debug(FILE *fp, fr_ring_buffer_t *rb) CC_HINT(nonnull);
 
 #ifdef __cplusplus
 }
index b6a0c541f011f3d71a27a4eeb28f3b0fedac71b3..8a6973c3519f36afe4ebfa1701979e0088653487 100644 (file)
@@ -1607,7 +1607,7 @@ static void fr_command_debug_internal(FILE *fp, fr_cmd_t *head, int depth)
        }
 }
 
-void fr_command_debug(FILE *fp, fr_cmd_t *head)
+void fr_cmd_debug(FILE *fp, fr_cmd_t *head)
 {
        fr_command_debug_internal(fp, head, 0);
 }
index 3cdf8eb3ff240c43af3443982f1ad669233e2a1e..0ab457f3a93a9fa196ebdb1ba9a9b5b1c4751825 100644 (file)
@@ -79,7 +79,7 @@ int fr_command_walk(fr_cmd_t *head, void **walk_ctx, void *ctx, fr_cmd_walk_t ca
 int fr_command_tab_expand(TALLOC_CTX *ctx, fr_cmd_t *head, fr_cmd_info_t *info, int max_expansions, char const **expansions);
 char const *fr_command_help(fr_cmd_t *head, int argc, char *argv[]);
 int fr_command_run(FILE *fp, FILE *fp_err, fr_cmd_info_t *info, bool read_only);
-void fr_command_debug(FILE *fp, fr_cmd_t *head);
+void fr_cmd_debug(FILE *fp, fr_cmd_t *head);
 int fr_command_str_to_argv(fr_cmd_t *head, fr_cmd_info_t *info, char const *str);
 int fr_command_clear(int new_argc, fr_cmd_info_t *info) CC_HINT(nonnull);
 
index 6f1bba1ca271bded710d7a3af2149395cc2ce296..843f1d7b8ddc8e5e0d735e081e74773df46ccad5 100644 (file)
@@ -1071,7 +1071,7 @@ typedef enum {
 #define tmpl_aexpand_type(_ctx, _out, _type, _request, _vpt) \
                          _tmpl_to_atype(_ctx, (void *)(_out), _request, _vpt, NULL, NULL, _type)
 
-void                   tmpl_debug(tmpl_t const *vpt) CC_HINT(nonnull);
+void                   tmpl_debug(FILE *fp, tmpl_t const *vpt) CC_HINT(nonnull);
 
 fr_pair_list_t         *tmpl_list_head(request_t *request, fr_dict_attr_t const *list);
 
@@ -1169,11 +1169,11 @@ void                    tmpl_set_xlat(tmpl_t *vpt, xlat_exp_head_t *xlat) CC_HINT(nonnull);
 
 int                    tmpl_afrom_value_box(TALLOC_CTX *ctx, tmpl_t **out, fr_value_box_t *data, bool steal) CC_HINT(nonnull);
 
-void                   tmpl_attr_ref_debug(const tmpl_attr_t *ar, int idx) CC_HINT(nonnull);
+void                   tmpl_attr_ref_debug(FILE *fp, const tmpl_attr_t *ar, int idx) CC_HINT(nonnull);
 
-void                   tmpl_attr_ref_list_debug(FR_DLIST_HEAD(tmpl_attr_list) const *ar_head) CC_HINT(nonnull);
+void                   tmpl_attr_ref_list_debug(FILE *fp, FR_DLIST_HEAD(tmpl_attr_list) const *ar_head) CC_HINT(nonnull);
 
-void                   tmpl_attr_debug(tmpl_t const *vpt) CC_HINT(nonnull);
+void                   tmpl_attr_debug(FILE *fp, tmpl_t const *vpt) CC_HINT(nonnull);
 
 int                    tmpl_attr_copy(tmpl_t *dst, tmpl_t const *src) CC_HINT(nonnull);
 
@@ -1313,7 +1313,7 @@ int                       tmpl_extents_find(TALLOC_CTX *ctx,
 int                    tmpl_extents_build_to_leaf_parent(fr_dlist_head_t *leaf, fr_dlist_head_t *interior,
                                                   tmpl_t const *vpt) CC_HINT(nonnull);
 
-void                   tmpl_extents_debug(fr_dlist_head_t *head) CC_HINT(nonnull);
+void                   tmpl_extents_debug(FILE *fp, fr_dlist_head_t *head) CC_HINT(nonnull);
 
 int                    tmpl_eval_pair(TALLOC_CTX *ctx, fr_value_box_list_t *out, request_t *request, tmpl_t const *vpt);
 
index 34926a83ef62419848cfdf1d847b3d914d1df2f5..8b6f1410715059e833b98f392df1f27b4171820d 100644 (file)
@@ -761,7 +761,7 @@ int tmpl_extents_build_to_leaf_parent(fr_dlist_head_t *existing, fr_dlist_head_t
        return 0;
 }
 
-void tmpl_extents_debug(fr_dlist_head_t *head)
+void tmpl_extents_debug(FILE *fp, fr_dlist_head_t *head)
 {
        tmpl_attr_extent_t const *extent = NULL;
        fr_pair_t *vp = NULL;
@@ -773,25 +773,25 @@ void tmpl_extents_debug(fr_dlist_head_t *head)
                char const *ctx_name;
 
                if (ar) {
-                       FR_FAULT_LOG("extent-interior-attr");
-                       tmpl_attr_ref_debug(extent->ar, 0);
+                       fprintf(fp, "extent-interior-attr\n");
+                       tmpl_attr_ref_debug(fp, extent->ar, 0);
                } else {
-                       FR_FAULT_LOG("extent-leaf");
+                       fprintf(fp, "extent-leaf\n");
                }
 
                ctx_name = talloc_get_name(extent->list_ctx);
                if (strcmp(ctx_name, "fr_pair_t") == 0) {
-                       FR_FAULT_LOG("list_ctx     : %p (%s, %s)", extent->list_ctx, ctx_name,
+                       fprintf(fp, "list_ctx     : %p (%s, %s)\n", extent->list_ctx, ctx_name,
                                     ((fr_pair_t *)extent->list_ctx)->da->name);
                } else {
-                       FR_FAULT_LOG("list_ctx     : %p (%s)", extent->list_ctx, ctx_name);
+                       fprintf(fp, "list_ctx     : %p (%s)\n", extent->list_ctx, ctx_name);
                }
-               FR_FAULT_LOG("list         : %p", extent->list);
+               fprintf(fp, "list         : %p", extent->list);
                if (fr_pair_list_empty(extent->list)) {
-                       FR_FAULT_LOG("list (first) : none (%p)", extent->list);
+                       fprintf(fp, "list (first) : none (%p)\n", extent->list);
                } else {
                        vp = fr_pair_list_head(extent->list);
-                       FR_FAULT_LOG("list (first) : %s (%p)", vp->da->name, extent->list);
+                       fprintf(fp, "list (first) : %s (%p)\n", vp->da->name, extent->list);
                }
        }
 
index d02682cb3b2b39722307988cd041ce4f9b116cb7..81b3c490bfb0c22ed4c096dd51a93c80626fbf0f 100644 (file)
@@ -193,7 +193,7 @@ static inline bool CC_HINT(always_inline) tmpl_substr_terminal_check(fr_sbuff_t
        return ret;
 }
 
-void tmpl_attr_ref_debug(const tmpl_attr_t *ar, int i)
+void tmpl_attr_ref_debug(FILE *fp, const tmpl_attr_t *ar, int i)
 {
        char buffer[sizeof(STRINGIFY(INT16_MAX)) + 1];
 
@@ -204,29 +204,29 @@ void tmpl_attr_ref_debug(const tmpl_attr_t *ar, int i)
        case TMPL_ATTR_TYPE_UNSPEC:
        case TMPL_ATTR_TYPE_UNKNOWN:
                if (!ar->da) {
-                       FR_FAULT_LOG("\t[%u] %s null%s%s%s",
-                                    i,
-                                    fr_table_str_by_value(attr_table, ar->type, "<INVALID>"),
-                                    ar->ar_num != NUM_UNSPEC ? "[" : "",
-                                    ar->ar_num != NUM_UNSPEC ? fr_table_str_by_value(attr_num_table, ar->ar_num, buffer) : "",
-                                    ar->ar_num != NUM_UNSPEC ? "]" : "");
+                       fprintf(fp, "\t[%u] %s null%s%s%s\n",
+                               i,
+                               fr_table_str_by_value(attr_table, ar->type, "<INVALID>"),
+                               ar->ar_num != NUM_UNSPEC ? "[" : "",
+                               ar->ar_num != NUM_UNSPEC ? fr_table_str_by_value(attr_num_table, ar->ar_num, buffer) : "",
+                               ar->ar_num != NUM_UNSPEC ? "]" : "");
                        return;
                }
 
-               FR_FAULT_LOG("\t[%u] %s %s %s%s%s%s (%p) attr %u",
-                            i,
-                            fr_table_str_by_value(attr_table, ar->type, "<INVALID>"),
-                            fr_type_to_str(ar->da->type),
-                            ar->da->name,
-                            ar->ar_num != NUM_UNSPEC ? "[" : "",
-                            ar->ar_num != NUM_UNSPEC ? fr_table_str_by_value(attr_num_table, ar->ar_num, buffer) : "",
-                            ar->ar_num != NUM_UNSPEC ? "]" : "",
-                            ar->da,
-                            ar->da->attr
+               fprintf(fp, "\t[%u] %s %s %s%s%s%s (%p) attr %u\n ",
+                       i,
+                       fr_table_str_by_value(attr_table, ar->type, "<INVALID>"),
+                       fr_type_to_str(ar->da->type),
+                       ar->da->name,
+                       ar->ar_num != NUM_UNSPEC ? "[" : "",
+                       ar->ar_num != NUM_UNSPEC ? fr_table_str_by_value(attr_num_table, ar->ar_num, buffer) : "",
+                       ar->ar_num != NUM_UNSPEC ? "]" : "",
+                       ar->da,
+                       ar->da->attr
                );
-               FR_FAULT_LOG("\t    is_raw     : %s", ar_is_raw(ar) ? "yes" : "no");
-               FR_FAULT_LOG("\t    is_unknown : %s", ar_is_unknown(ar) ? "yes" : "no");
-               if (ar->ar_parent) FR_FAULT_LOG("\t    parent     : %s (%p)", ar->ar_parent->name, ar->ar_parent);
+               fprintf(fp, "\t    is_raw     : %s\n", ar_is_raw(ar) ? "yes" : "no");
+               fprintf(fp, "\t    is_unknown : %s", ar_is_unknown(ar) ? "yes" : "no");
+               if (ar->ar_parent) fprintf(fp, "\t    parent     : %s (%p)", ar->ar_parent->name, ar->ar_parent);
                break;
 
 
@@ -235,40 +235,40 @@ void tmpl_attr_ref_debug(const tmpl_attr_t *ar, int i)
                 *      Type reveals unresolved status
                 *      so we don't need to add it explicitly
                 */
-               FR_FAULT_LOG("\t[%u] %s %s%s%s%s",
-                            i,
-                            fr_table_str_by_value(attr_table, ar->type, "<INVALID>"),
-                            ar->ar_unresolved,
-                            ar->ar_num != NUM_UNSPEC ? "[" : "",
-                            ar->ar_num != NUM_UNSPEC ? fr_table_str_by_value(attr_num_table, ar->ar_num, buffer) : "",
-                            ar->ar_num != NUM_UNSPEC ? "]" : "");
-               if (ar->ar_parent)                      FR_FAULT_LOG("\t    parent     : %s", ar->ar_parent->name);
-               if (ar->ar_unresolved_namespace)        FR_FAULT_LOG("\t    namespace  : %s", ar->ar_unresolved_namespace->name);
+               fprintf(fp, "\t[%u] %s %s%s%s%s\n",
+                       i,
+                       fr_table_str_by_value(attr_table, ar->type, "<INVALID>"),
+                       ar->ar_unresolved,
+                       ar->ar_num != NUM_UNSPEC ? "[" : "",
+                       ar->ar_num != NUM_UNSPEC ? fr_table_str_by_value(attr_num_table, ar->ar_num, buffer) : "",
+                       ar->ar_num != NUM_UNSPEC ? "]" : "");
+               if (ar->ar_parent)                      fprintf(fp, "\t    parent     : %s", ar->ar_parent->name);
+               if (ar->ar_unresolved_namespace)        fprintf(fp, "\t    namespace  : %s", ar->ar_unresolved_namespace->name);
                break;
 
        default:
-               FR_FAULT_LOG("\t[%u] Bad type %s(%u)",
+               fprintf(fp, "\t[%u] Bad type %s(%u)",
                             i, fr_table_str_by_value(attr_table, ar->type, "<INVALID>"), ar->type);
                break;
        }
 }
 
-void tmpl_attr_ref_list_debug(FR_DLIST_HEAD(tmpl_attr_list) const *ar_head)
+void tmpl_attr_ref_list_debug(FILE *fp, FR_DLIST_HEAD(tmpl_attr_list) const *ar_head)
 {
        tmpl_attr_t             *ar = NULL;
        unsigned int            i = 0;
 
-       FR_FAULT_LOG("attribute references:");
+       fprintf(fp, "attribute references:\n");
        /*
         *      Print all the attribute references
         */
        while ((ar = tmpl_attr_list_next(ar_head, ar))) {
-               tmpl_attr_ref_debug(ar, i);
+               tmpl_attr_ref_debug(fp, ar, i);
                i++;
        }
 }
 
-void tmpl_attr_debug(tmpl_t const *vpt)
+void tmpl_attr_debug(FILE *fp, tmpl_t const *vpt)
 {
        tmpl_request_t          *rr = NULL;
        unsigned int            i = 0;
@@ -279,61 +279,61 @@ void tmpl_attr_debug(tmpl_t const *vpt)
                break;
 
        default:
-               FR_FAULT_LOG("%s can't print tmpls of type %s", __FUNCTION__,
-                            tmpl_type_to_str(vpt->type));
+               fprintf(fp, "%s can't print tmpls of type %s\n", __FUNCTION__,
+                       tmpl_type_to_str(vpt->type));
                return;
        }
 
-       FR_FAULT_LOG("tmpl_t %s (%.8x) \"%pV\" (%p)",
-                    tmpl_type_to_str(vpt->type),
-                    vpt->type,
-                    fr_box_strvalue_len(vpt->name, vpt->len), vpt);
+       fprintf(fp, "tmpl_t %s (%.8x) \"%pV\" (%p)\n",
+               tmpl_type_to_str(vpt->type),
+               vpt->type,
+               fr_box_strvalue_len(vpt->name, vpt->len), vpt);
 
-       FR_FAULT_LOG("\tcast       : %s", fr_type_to_str(tmpl_rules_cast(vpt)));
-       FR_FAULT_LOG("\tquote      : %s", fr_table_str_by_value(fr_token_quotes_table, vpt->quote, "<INVALID>"));
+       fprintf(fp, "\tcast       : %s\n", fr_type_to_str(tmpl_rules_cast(vpt)));
+       fprintf(fp, "\tquote      : %s\n", fr_table_str_by_value(fr_token_quotes_table, vpt->quote, "<INVALID>"));
 
-       FR_FAULT_LOG("request references:");
+       fprintf(fp, "request references:");
 
        /*
         *      Print all the request references
         */
        while ((rr = tmpl_request_list_next(&vpt->data.attribute.rr, rr))) {
-               FR_FAULT_LOG("\t[%u] %s (%u)", i,
+               fprintf(fp, "\t[%u] %s (%u)\n", i,
                             fr_table_str_by_value(tmpl_request_ref_table, rr->request, "<INVALID>"), rr->request);
                i++;
        }
 
-       FR_FAULT_LOG("list: %s", tmpl_list_name(tmpl_list(vpt), "<INVALID>"));
-       tmpl_attr_ref_list_debug(tmpl_attr(vpt));
+       fprintf(fp, "list: %s\n", tmpl_list_name(tmpl_list(vpt), "<INVALID>"));
+       tmpl_attr_ref_list_debug(fp, tmpl_attr(vpt));
 }
 
-void tmpl_debug(tmpl_t const *vpt)
+void tmpl_debug(FILE *fp, tmpl_t const *vpt)
 {
        switch (vpt->type) {
        case TMPL_TYPE_ATTR:
        case TMPL_TYPE_ATTR_UNRESOLVED:
-               tmpl_attr_debug(vpt);
+               tmpl_attr_debug(fp, vpt);
                return;
 
        default:
                break;
        }
 
-       FR_FAULT_LOG("tmpl_t %s (%.8x) \"%s\" (%p)",
-                    tmpl_type_to_str(vpt->type),
-                    vpt->type,
-                    vpt->name, vpt);
+       fprintf(fp, "tmpl_t %s (%.8x) \"%pR\" (%p)\n",
+               tmpl_type_to_str(vpt->type),
+               vpt->type,
+               vpt->name, vpt);
 
-       FR_FAULT_LOG("\tcast       : %s", fr_type_to_str(tmpl_rules_cast(vpt)));
-       FR_FAULT_LOG("\tquote      : %s", fr_table_str_by_value(fr_token_quotes_table, vpt->quote, "<INVALID>"));
+       fprintf(fp, "\tcast       : %s\n", fr_type_to_str(tmpl_rules_cast(vpt)));
+       fprintf(fp, "\tquote      : %s\n", fr_table_str_by_value(fr_token_quotes_table, vpt->quote, "<INVALID>"));
        switch (vpt->type) {
        case TMPL_TYPE_DATA:
-               FR_FAULT_LOG("\ttype       : %s", fr_type_to_str(tmpl_value_type(vpt)));
-               FR_FAULT_LOG("\tlen        : %zu", tmpl_value_length(vpt));
-               FR_FAULT_LOG("\tvalue      : %pV", tmpl_value(vpt));
+               fprintf(fp, "\ttype       : %s\n", fr_type_to_str(tmpl_value_type(vpt)));
+               fprintf(fp, "\tlen        : %zu\n", tmpl_value_length(vpt));
+               fprintf(fp, "\tvalue      : %pV\n", tmpl_value(vpt));
 
-               if (tmpl_value_enumv(vpt)) FR_FAULT_LOG("\tenumv      : %s (%p)",
-                                                       tmpl_value_enumv(vpt)->name, tmpl_value_enumv(vpt));
+               if (tmpl_value_enumv(vpt)) fprintf(fp, "\tenumv      : %s (%p)",
+                                                  tmpl_value_enumv(vpt)->name, tmpl_value_enumv(vpt));
                return;
 
        case TMPL_TYPE_XLAT:
@@ -344,7 +344,7 @@ void tmpl_debug(tmpl_t const *vpt)
 
                xlat_aprint(NULL, &str, tmpl_xlat(vpt), NULL);
 
-               FR_FAULT_LOG("\texpansion  : %s", str);
+               fprintf(fp, "\texpansion  : %s\n", str);
 
                talloc_free(str);
        }
@@ -352,21 +352,21 @@ void tmpl_debug(tmpl_t const *vpt)
 
        case TMPL_TYPE_REGEX:
        {
-               FR_FAULT_LOG("\tpattern    : %s", vpt->name);
+               fprintf(fp, "\tpattern    : %s\n", vpt->name);
        }
                break;
 
        default:
                if (tmpl_needs_resolving(vpt)) {
                        if (tmpl_is_data_unresolved(vpt)) {
-                               FR_FAULT_LOG("\tunescaped  : %s", vpt->data.unescaped);
-                               FR_FAULT_LOG("\tlen        : %zu", talloc_array_length(vpt->data.unescaped) - 1);
+                               fprintf(fp, "\tunescaped  : %s\n", vpt->data.unescaped);
+                               fprintf(fp, "\tlen        : %zu\n", talloc_array_length(vpt->data.unescaped) - 1);
                        } else {
-                               FR_FAULT_LOG("\tunresolved : %s", vpt->name);
-                               FR_FAULT_LOG("\tlen        : %zu", vpt->len);
+                               fprintf(fp, "\tunresolved : %s\n", vpt->name);
+                               fprintf(fp, "\tlen        : %zu\n", vpt->len);
                        }
                } else {
-                       FR_FAULT_LOG("debug nyi");
+                       fprintf(fp, "debug nyi\n");
                }
                break;
        }
@@ -5023,7 +5023,7 @@ void tmpl_attr_verify(char const *file, int line, tmpl_t const *vpt)
                switch (ar->type) {
                case TMPL_ATTR_TYPE_NORMAL:
                        if (seen_unknown) {
-                               tmpl_attr_debug(vpt);
+                               tmpl_attr_debug(stderr, vpt);
                                fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%u]: "
                                                     "TMPL_TYPE_ATTR known attribute \"%s\" "
                                                     "occurred after unknown attribute %s "
@@ -5033,7 +5033,7 @@ void tmpl_attr_verify(char const *file, int line, tmpl_t const *vpt)
                                                     ar->unknown.da->name);
                        }
                        if (seen_unresolved) {
-                               tmpl_attr_debug(vpt);
+                               tmpl_attr_debug(stderr, vpt);
                                fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%u]: "
                                                     "TMPL_TYPE_ATTR known attribute \"%s\" "
                                                     "occurred after unresolved attribute \"%s\""
@@ -5049,7 +5049,7 @@ void tmpl_attr_verify(char const *file, int line, tmpl_t const *vpt)
 
                case TMPL_ATTR_TYPE_UNSPEC:
                        if (seen_unknown) {
-                               tmpl_attr_debug(vpt);
+                               tmpl_attr_debug(stderr, vpt);
                                fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%u]: "
                                                     "TMPL_TYPE_ATTR unspecified attribute "
                                                     "occurred after unknown attribute %s "
@@ -5058,7 +5058,7 @@ void tmpl_attr_verify(char const *file, int line, tmpl_t const *vpt)
                                                     ar->unknown.da->name);
                        }
                        if (seen_unresolved) {
-                               tmpl_attr_debug(vpt);
+                               tmpl_attr_debug(stderr, vpt);
                                fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%u]: "
                                                     "TMPL_TYPE_ATTR unspecified attribute "
                                                     "occurred after unresolved attribute \"%s\""
@@ -5078,7 +5078,7 @@ void tmpl_attr_verify(char const *file, int line, tmpl_t const *vpt)
                case TMPL_ATTR_TYPE_UNKNOWN:
                        seen_unknown = ar;
                        if (seen_unresolved) {
-                               tmpl_attr_debug(vpt);
+                               tmpl_attr_debug(stderr, vpt);
                                fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%u]: "
                                                     "TMPL_TYPE_ATTR unknown attribute \"%s\" "
                                                     "occurred after unresolved attribute %s "
@@ -5189,7 +5189,7 @@ void tmpl_verify(char const *file, int line, tmpl_t const *vpt)
                if ((tmpl_attr_list_num_elements(tmpl_attr(vpt)) > 0) &&
                    ((tmpl_attr_t *)tmpl_attr_list_tail(tmpl_attr(vpt)))->da) {
 #ifndef NDEBUG
-                       tmpl_attr_debug(vpt);
+                       tmpl_attr_debug(stderr, vpt);
 #endif
                        fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%u]: TMPL_TYPE_ATTR_UNRESOLVED contains %u "
                                             "references", file, line, tmpl_attr_list_num_elements(tmpl_attr(vpt)));
index 1f2b0eaccc20a533506c5f745f55bd3f1e16d606..4b400b6c4f588af6159d45a0d687b496db91a2a9 100644 (file)
@@ -174,7 +174,7 @@ static int tmpl_to_values(TALLOC_CTX *ctx, edit_result_t *out, request_t *reques
                 *      The other tmpl types MUST have already been
                 *      converted to the "realized" types.
                 */
-               tmpl_debug(vpt);
+               tmpl_debug(stderr, vpt);
                fr_assert(0);
                break;
        }
index 98ba109544ee1c7459a537e80db2e9b54a19c619..15b17a467945764c72dc2a5b16d47eaed535c00d 100644 (file)
@@ -2724,7 +2724,7 @@ static xlat_action_t xlat_func_range(TALLOC_CTX *ctx, fr_dcursor_t *out,
 
        } else {
                start = 0;
-               fr_value_box_debug(start_vb);
+               fr_value_box_debug(fr_log_fp, start_vb);
                end = fr_value_box_list_head(&start_vb->vb_group)->vb_uint64;
                step = 1;
        }
index 92185c153e6b0276519b89be3edb63d3f42b71c9..05123d007b9e364e7b53e3a32a10ca43751f44d9 100644 (file)
@@ -539,7 +539,7 @@ check_non_leaf:
                }
 
                if (!fr_value_box_is_safe_for(vb, FR_VALUE_BOX_SAFE_FOR_ANY)) {
-                       fr_value_box_debug(vb);
+                       fr_value_box_debug(fr_log_fp, vb);
                        REDEBUG("Refusing to reference attribute from unsafe data");
                        return XLAT_ACTION_FAIL;
                }
index b9a5cf13963f2b4bf3c15129a3a4f7905c7b3cc6..aee8bbead51c9b116b33d6a7f4102c7ce20655a2 100644 (file)
@@ -2645,7 +2645,7 @@ static fr_slen_t tokenize_field(xlat_exp_head_t *head, xlat_exp_t **out, fr_sbuf
                        /*
                         *      Regex?  Or something else weird?
                         */
-                       tmpl_debug(vpt);
+                       tmpl_debug(stderr, vpt);
                        fr_assert(0);
                }
        }
index 4d30d529d080308d4aba11c46b282174b3040c8a..096121c3db5ee62b517228b5be1890d46d594cc6 100644 (file)
@@ -911,7 +911,7 @@ int                 fr_dict_global_ctx_dir_set(char const *dict_dir);
 
 void                   fr_dict_global_ctx_read_only(void);
 
-void                   fr_dict_global_ctx_debug(fr_dict_gctx_t const *gctx);
+void                   fr_dict_gctx_debug(FILE *fp, fr_dict_gctx_t const *gctx);
 
 char const             *fr_dict_global_ctx_dir(void);
 
index 8fc03ce90336ada341dc4868d521f408a99aab47..b8e207f524e1e272de12adcfe7e2a3b3f874973a 100644 (file)
@@ -208,7 +208,7 @@ static int dict_attr_debug(fr_dict_attr_t const *da, void *uctx)
                da->attr,
                fr_type_to_str(da->type),
                ctx->flags);
-       
+
        dict_attr_ext_debug(ctx->prefix, da);   /* Print all the extension debug info */
 
        ext = fr_dict_attr_ext(da, FR_DICT_ATTR_EXT_ENUMV);
@@ -218,7 +218,7 @@ static int dict_attr_debug(fr_dict_attr_t const *da, void *uctx)
             enumv;
             enumv = fr_hash_table_iter_next(ext->name_by_value, &iter)) {
                char *value = fr_asprintf(NULL, "%pV", enumv->value);
-               
+
                fprintf(ctx->fp, "%s    %s -> %s\n",
                        ctx->prefix,
                        enumv->name,
@@ -348,4 +348,3 @@ void fr_dict_alias_export(FILE *fp, fr_dict_attr_t const *parent)
                fprintf(fp, "%-40s\t%s\n", da->name, buffer);
        }
 }
-
index f3d3ca9aa5408f53a86e2b29a1cbc91178603269..729826c0a1defaf885a7853f0486b15457d7e6dd 100644 (file)
@@ -4406,7 +4406,7 @@ static int _dict_global_free(fr_dict_gctx_t *gctx)
 
        if (still_loaded) {
 #ifndef NDEBUG
-               fr_dict_global_ctx_debug(gctx);
+               fr_dict_gctx_debug(stderr, gctx);
 #endif
                return -1;
        }
@@ -4571,7 +4571,7 @@ void fr_dict_global_ctx_read_only(void)
  *
  * Intended to be called from a debugger
  */
-void fr_dict_global_ctx_debug(fr_dict_gctx_t const *gctx)
+void fr_dict_gctx_debug(FILE *fp, fr_dict_gctx_t const *gctx)
 {
        fr_hash_iter_t                  dict_iter;
        fr_dict_t                       *dict;
@@ -4581,18 +4581,19 @@ void fr_dict_global_ctx_debug(fr_dict_gctx_t const *gctx)
        if (gctx == NULL) gctx = dict_gctx;
 
        if (!gctx) {
-               FR_FAULT_LOG("gctx not initialised");
+               fprintf(fp, "gctx not initialised\n");
                return;
        }
 
-       FR_FAULT_LOG("gctx %p report", dict_gctx);
+       fprintf(fp, "gctx %p report\n", dict_gctx);
        for (dict = fr_hash_table_iter_init(gctx->protocol_by_num, &dict_iter);
             dict;
             dict = fr_hash_table_iter_next(gctx->protocol_by_num, &dict_iter)) {
                for (dep = fr_rb_iter_init_inorder(&dep_iter, dict->dependents);
                     dep;
                     dep = fr_rb_iter_next_inorder(&dep_iter)) {
-                       FR_FAULT_LOG("\t%s is referenced from %s count (%d)", dict->root->name, dep->dependent, dep->count);
+                       fprintf(fp, "\t%s is referenced from %s count (%d)\n",
+                               dict->root->name, dep->dependent, dep->count);
                }
        }
 
@@ -4600,7 +4601,8 @@ void fr_dict_global_ctx_debug(fr_dict_gctx_t const *gctx)
                for (dep = fr_rb_iter_init_inorder(&dep_iter, gctx->internal->dependents);
                     dep;
                     dep = fr_rb_iter_next_inorder(&dep_iter)) {
-                       FR_FAULT_LOG("\t%s is referenced from %s count (%d)", gctx->internal->root->name, dep->dependent, dep->count);
+                       fprintf(fp, "\t%s is referenced from %s count (%d)\n",
+                               gctx->internal->root->name, dep->dependent, dep->count);
                }
        }
 }
index 37717f9f82c82f4dbd6ede12de7e9f66a357e939..8f3c6af8b8fd3feac5a124c5e8ff7bcae387a281 100644 (file)
@@ -959,26 +959,26 @@ bool dl_loader_set_static(dl_loader_t *dl_loader, bool do_static)
 /** Called from a debugger to print information about a dl_loader
  *
  */
-void dl_loader_debug(dl_loader_t *dl)
+void dl_loader_debug(FILE *fp, dl_loader_t *dl)
 {
-       FR_FAULT_LOG("dl_loader %p", dl);
-       FR_FAULT_LOG("lib_dir           : %s", dl->lib_dir);
-       FR_FAULT_LOG("do_dlclose        : %s", dl->do_dlclose ? "yes" : "no");
-       FR_FAULT_LOG("uctx              : %p", dl->uctx);
-       FR_FAULT_LOG("uctx_free         : %s", dl->do_dlclose ? "yes" : "no");
-       FR_FAULT_LOG("defer_symbol_init : %s", dl->defer_symbol_init ? "yes" : "no");
+       fprintf(fp, "dl_loader %p", dl);
+       fprintf(fp, "lib_dir           : %s\n", dl->lib_dir);
+       fprintf(fp, "do_dlclose        : %s\n", dl->do_dlclose ? "yes" : "no");
+       fprintf(fp, "uctx              : %p\n", dl->uctx);
+       fprintf(fp, "uctx_free         : %s\n", dl->do_dlclose ? "yes" : "no");
+       fprintf(fp, "defer_symbol_init : %s\n", dl->defer_symbol_init ? "yes" : "no");
 
        fr_dlist_foreach(&dl->sym_init, dl_symbol_init_t, sym) {
-               FR_FAULT_LOG("symbol_init %s", sym->symbol ? sym->symbol : "<base>");
-               FR_FAULT_LOG("\tpriority : %u", sym->priority);
-               FR_FAULT_LOG("\tfunc     : %p", sym->func);
-               FR_FAULT_LOG("\tuctx     : %p", sym->uctx);
+               fprintf(fp, "symbol_init %s\n", sym->symbol ? sym->symbol : "<base>");
+               fprintf(fp, "\tpriority : %u\n", sym->priority);
+               fprintf(fp, "\tfunc     : %p\n", sym->func);
+               fprintf(fp, "\tuctx     : %p\n", sym->uctx);
        }
 
        fr_dlist_foreach(&dl->sym_free, dl_symbol_free_t, sym) {
-               FR_FAULT_LOG("symbol_free %s", sym->symbol ? sym->symbol : "<base>");
-               FR_FAULT_LOG("\tpriority : %u", sym->priority);
-               FR_FAULT_LOG("\tfunc     : %p", sym->func);
-               FR_FAULT_LOG("\tuctx     : %p", sym->uctx);
+               fprintf(fp, "symbol_free %s\n", sym->symbol ? sym->symbol : "<base>");
+               fprintf(fp, "\tpriority : %u\n", sym->priority);
+               fprintf(fp, "\tfunc     : %p\n", sym->func);
+               fprintf(fp, "\tuctx     : %p\n", sym->uctx);
        }
 }
index 7ab8dc5798d5af68d350a761ceea9882bcd3e355..a6f32d8e7f34d83a7211a1988f3d0763c94c95a4 100644 (file)
@@ -129,7 +129,7 @@ dl_loader_t         *dl_loader_init(TALLOC_CTX *ctx, void *uctx, bool uctx_free, bool d
 
 bool                   dl_loader_set_static(dl_loader_t *dl_loader, bool do_static) CC_HINT(nonnull);
 
-void                   dl_loader_debug(dl_loader_t *dl);
+void                   dl_loader_debug(FILE *fp, dl_loader_t *dl) CC_HINT(nonnull);
 #ifdef __cplusplus
 }
 #endif
index 9b5db0ee7401e1e88a174ca27110a0af5b6631e0..600a70cf60e6cf0260bbdae2ddc72e58fc334309 100644 (file)
@@ -848,8 +848,10 @@ static inline fr_slen_t CC_HINT(nonnull(2,4))
 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) CC_HINT(nonnull(1,4));
 
-void           fr_pair_list_debug(fr_pair_list_t const *list) CC_HINT(nonnull);
-void           fr_pair_debug(fr_pair_t const *pair) CC_HINT(nonnull);
+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)
+                                   CC_HINT(nonnull(1, 4));
+void           fr_pair_debug(FILE *fp, fr_pair_t const *pair) CC_HINT(nonnull);
 
 /** @} */
 
index b95db80a5401dff83e034c3ec90b6dddad7c5223..d68b0c605b93b7d56fe17a91c51f257c81eabeea 100644 (file)
@@ -322,19 +322,69 @@ 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)
+{
+       fr_dict_attr_t const *parent_da = NULL;
+
+       fr_pair_list_foreach(list, 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;
+
+               /*
+                *      Recursively print grouped attributes.
+                */
+               switch (vp->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);
+                       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;
+
+                       fprintf(fp, "%*s%*s\n", lvl * 2, "", (int) fr_sbuff_used(sbuff), fr_sbuff_start(sbuff));
+               }
+       }
+}
+
+/** Print a list of attributes and enumv
+ *
+ * @param[in] fp       to output to.
+ * @param[in] lvl      depth in structural attribute.
+ * @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)
+{
+       fr_sbuff_t sbuff;
+       char buffer[1024];
+
+       fr_sbuff_init_out(&sbuff, buffer, sizeof(buffer));
+
+       fr_pair_list_debug_sbuff(fp, lvl, parent, list, &sbuff);
+}
+
 /** Dumps a list to the default logging destination - Useful for calling from debuggers
  *
  */
-void fr_pair_list_debug(fr_pair_list_t const *list)
+void fr_pair_list_debug(FILE *fp, fr_pair_list_t const *list)
 {
-       _fr_pair_list_log(&default_log, 0, NULL, list, "<internal>", 0);
+       _fr_pair_list_debug(fp, 0, NULL, list);
 }
 
 
 /** Dumps a pair to the default logging destination - Useful for calling from debuggers
  *
  */
-void fr_pair_debug(fr_pair_t const *pair)
+void fr_pair_debug(FILE *fp, fr_pair_t const *pair)
 {
        fr_sbuff_t sbuff;
        char buffer[1024];
@@ -347,6 +397,5 @@ void fr_pair_debug(fr_pair_t const *pair)
 
        (void) fr_pair_print(&sbuff, NULL, pair);
 
-       fr_log(&default_log, L_DBG, __FILE__, __LINE__, "%pV",
-              fr_box_strvalue_len(fr_sbuff_start(&sbuff), fr_sbuff_used(&sbuff)));
+       fprintf(fp, "%pV\n", fr_box_strvalue_len(fr_sbuff_start(&sbuff), fr_sbuff_used(&sbuff)));
 }
index 8e303e99928840ccffb699d30e7bfe57b1842349..df4483811a6c40d2d3821b6662705bf43ab85fee 100644 (file)
@@ -2261,51 +2261,51 @@ static char const *sbuff_print_char(char c)
        }
 }
 
-void fr_sbuff_unescape_debug(fr_sbuff_unescape_rules_t const *escapes)
+void fr_sbuff_unescape_debug(FILE *fp, fr_sbuff_unescape_rules_t const *escapes)
 {
        uint8_t i;
 
-       FR_FAULT_LOG("Escape rules %s (%p)", escapes->name, escapes);
-       FR_FAULT_LOG("chr     : %c", escapes->chr ? escapes->chr : ' ');
-       FR_FAULT_LOG("do_hex  : %s", escapes->do_hex ? "yes" : "no");
-       FR_FAULT_LOG("do_oct  : %s", escapes->do_oct ? "yes" : "no");
+       fprintf(fp, "Escape rules %s (%p)\n", escapes->name, escapes);
+       fprintf(fp, "chr     : %c\n", escapes->chr ? escapes->chr : ' ');
+       fprintf(fp, "do_hex  : %s\n", escapes->do_hex ? "yes" : "no");
+       fprintf(fp, "do_oct  : %s\n", escapes->do_oct ? "yes" : "no");
 
-       FR_FAULT_LOG("substitutions:");
+       fprintf(fp, "substitutions:\n");
        for (i = 0; i < UINT8_MAX; i++) {
-               if (escapes->subs[i]) FR_FAULT_LOG("\t%s -> %s",
+               if (escapes->subs[i]) FR_FAULT_LOG("\t%s -> %s\n",
                                                   sbuff_print_char((char)i),
                                                   sbuff_print_char((char)escapes->subs[i]));
        }
-       FR_FAULT_LOG("skipes:");
+       fprintf(fp, "skipes:\n");
        for (i = 0; i < UINT8_MAX; i++) {
-               if (escapes->skip[i]) FR_FAULT_LOG("\t%s", sbuff_print_char((char)i));
+               if (escapes->skip[i]) fprintf(fp, "\t%s\n", sbuff_print_char((char)i));
        }
 }
 
-void fr_sbuff_terminal_debug(fr_sbuff_term_t const *tt)
+void fr_sbuff_terminal_debug(FILE *fp, fr_sbuff_term_t const *tt)
 {
        size_t i;
 
-       FR_FAULT_LOG("Terminal count %zu", tt->len);
+       fprintf(fp, "Terminal count %zu\n", tt->len);
 
-       for (i = 0; i < tt->len; i++) FR_FAULT_LOG("\t\"%s\" (%zu)", tt->elem[i].str, tt->elem[i].len);
+       for (i = 0; i < tt->len; i++) fprintf(fp, "\t\"%s\" (%zu)\n", tt->elem[i].str, tt->elem[i].len);
 }
 
-void fr_sbuff_parse_rules_debug(fr_sbuff_parse_rules_t const *p_rules)
+void fr_sbuff_parse_rules_debug(FILE *fp, fr_sbuff_parse_rules_t const *p_rules)
 {
-       FR_FAULT_LOG("Parse rules %p", p_rules);
+       fprintf(fp, "Parse rules %p\n", p_rules);
 
        FR_FAULT_LOG("Escapes - ");
        if (p_rules->escapes) {
-               fr_sbuff_unescape_debug(p_rules->escapes);
+               fr_sbuff_unescape_debug(fp, p_rules->escapes);
        } else {
-               FR_FAULT_LOG("<none>");
+               fprintf(fp, "<none>\n");
        }
 
        FR_FAULT_LOG("Terminals - ");
        if (p_rules->terminals) {
-               fr_sbuff_terminal_debug(p_rules->terminals);
+               fr_sbuff_terminal_debug(fp, p_rules->terminals);
        } else {
-               FR_FAULT_LOG("<none>");
+               fprintf(fp, "<none>\n");
        }
 }
index 2c3fbc9bc7c184ffd4acb8ef287c039b57239edb..981dc4583e24f8286e369483717de24248d3473e 100644 (file)
@@ -1828,11 +1828,11 @@ SBUFF_IS_FUNC(hex, isxdigit((uint8_t) *p))
 
 /** @} */
 
-void   fr_sbuff_unescape_debug(fr_sbuff_unescape_rules_t const *escapes);
+void   fr_sbuff_unescape_debug(FILE *fp, fr_sbuff_unescape_rules_t const *escapes);
 
-void   fr_sbuff_terminal_debug(fr_sbuff_term_t const *tt);
+void   fr_sbuff_terminal_debug(FILE *fp, fr_sbuff_term_t const *tt);
 
-void   fr_sbuff_parse_rules_debug(fr_sbuff_parse_rules_t const *p_rules);
+void   fr_sbuff_parse_rules_debug(FILE *fp, fr_sbuff_parse_rules_t const *p_rules);
 
 /*
  *     ...printf("foo %.*s", fr_sbuff_as_percent_s(&sbuff));
index da75212f804b8874124555e9f9a26a27739c7ade..6f3d168bb01ba9a3ea05683c0dc2a862d7690d7b 100644 (file)
@@ -6831,15 +6831,15 @@ bool fr_value_box_is_truthy(fr_value_box_t const *in)
        }
 }
 
-#define INFO_INDENT(_fmt, ...)  FR_FAULT_LOG("%*s"_fmt, depth * 2, " ", ## __VA_ARGS__)
+#define INFO_INDENT(_fmt, ...)  fprintf(fp, "%*s" _fmt "\n", depth * 2, " ", ## __VA_ARGS__)
 
-static void _fr_value_box_debug(fr_value_box_t const *vb, int depth, int idx);
-static void _fr_value_box_list_debug(fr_value_box_list_t const *head, int depth)
+static void _fr_value_box_debug(FILE *fp, fr_value_box_t const *vb, int depth, int idx);
+static void _fr_value_box_list_debug(FILE *fp, fr_value_box_list_t const *head, int depth)
 {
        int i = 0;
 
        INFO_INDENT("{");
-       fr_value_box_list_foreach(head, vb) _fr_value_box_debug(vb, depth + 1, i++);
+       fr_value_box_list_foreach(head, vb) _fr_value_box_debug(fp, vb, depth + 1, i++);
        INFO_INDENT("}");
 }
 
@@ -6847,18 +6847,18 @@ static void _fr_value_box_list_debug(fr_value_box_list_t const *head, int depth)
  *
  * @note Call directly from the debugger
  */
-void fr_value_box_list_debug(fr_value_box_list_t const *head)
+void fr_value_box_list_debug(FILE *fp, fr_value_box_list_t const *head)
 {
-       _fr_value_box_list_debug(head, 0);
+       _fr_value_box_list_debug(fp, head, 0);
 }
 
-static void _fr_value_box_debug(fr_value_box_t const *vb, int depth, int idx)
+static void _fr_value_box_debug(FILE *fp, fr_value_box_t const *vb, int depth, int idx)
 {
        char *value;
        char buffer[64];
 
        if (fr_type_is_structural(vb->type)) {
-               _fr_value_box_list_debug(&vb->vb_group, depth + 1);
+               _fr_value_box_list_debug(fp, &vb->vb_group, depth + 1);
                return;
        }
 
@@ -6894,7 +6894,7 @@ static void _fr_value_box_debug(fr_value_box_t const *vb, int depth, int idx)
  *
  * @note Call directly from the debugger
  */
-void fr_value_box_debug(fr_value_box_t const *vb)
+void fr_value_box_debug(FILE *fp, fr_value_box_t const *vb)
 {
-       _fr_value_box_debug(vb, 0, -1);
+       _fr_value_box_debug(fp, vb, 0, -1);
 }
index be22948ca8caf7df5c8c7e42a15732abd2e2811b..3dfdbf28ebb742b342948de7604cfc57587b9f46 100644 (file)
@@ -1328,8 +1328,8 @@ void              fr_value_box_list_verify(char const *file, int line, fr_value_box_list_t c
  *
  * @{
  */
-void fr_value_box_list_debug(fr_value_box_list_t const *head);
-void fr_value_box_debug(fr_value_box_t const *vb);
+void fr_value_box_list_debug(FILE *fp, fr_value_box_list_t const *head);
+void fr_value_box_debug(FILE *fp, fr_value_box_t const *vb);
 /** @} */
 
 #undef _CONST
index eab30c4c1cfad29dc024fb283809123fb1a915ce..18d7f6a4cada02facdacb2a7d1ba2e877c3bd408 100644 (file)
@@ -465,7 +465,7 @@ ssize_t fr_dns_encode(fr_dbuff_t *dbuff, fr_pair_list_t *vps, fr_dns_ctx_t *pack
         */
        vp = fr_pair_dcursor_by_da_init(&cursor, vps, attr_dns_packet);
        if (!vp) {
-               fr_pair_list_debug(vps);
+               fr_pair_list_log(&default_log, 0, vps);
 
                fr_strerror_const("attribute list does not include DNS packet header");
                return -1;
index 3884f1b2cdc916dc85c485aed9a5aa3c4dab76f8..abeb02d13d4063601dad25fa75531b5f74547820 100644 (file)
@@ -91,7 +91,7 @@ int main(int argc, char *argv[])
 #ifndef NDEBUG
        if (debug_lvl) {
                printf("Start\n");
-               fr_atomic_queue_debug(aq, stdout);
+               fr_atomic_queue_debug(stdout, aq);
 
                if (debug_lvl > 1) printf("Filling with %d\n", size);
        }
@@ -111,7 +111,7 @@ int main(int argc, char *argv[])
 #ifndef NDEBUG
                if (debug_lvl > 1) {
                        printf("iteration %d\n", i);
-                       fr_atomic_queue_debug(aq, stdout);
+                       fr_atomic_queue_debug(stdout, aq);
                }
 #endif
        }
@@ -130,7 +130,7 @@ int main(int argc, char *argv[])
 #ifndef NDEBUG
        if (debug_lvl) {
                printf("Full\n");
-               fr_atomic_queue_debug(aq, stdout);
+               fr_atomic_queue_debug(stdout, aq);
 
                if (debug_lvl > 1) printf("Emptying\n");
        }
@@ -155,7 +155,7 @@ int main(int argc, char *argv[])
 #ifndef NDEBUG
                if (debug_lvl > 1) {
                        printf("iteration %d\n", i);
-                       fr_atomic_queue_debug(aq, stdout);
+                       fr_atomic_queue_debug(stdout, aq);
                }
 #endif
        }
@@ -171,7 +171,7 @@ int main(int argc, char *argv[])
 #ifndef NDEBUG
        if (debug_lvl) {
                printf("Empty\n");
-               fr_atomic_queue_debug(aq, stdout);
+               fr_atomic_queue_debug(stdout, aq);
        }
 #endif
 
index d322ff20be747104b209c6e9b6c68872e2f19fb7..aedf40e0eaaacffd6e61ddb46ea0aef37dbf01e0 100644 (file)
@@ -291,7 +291,7 @@ check_close:
        MPRINT2("GC\n");
        fr_message_set_gc(ms);
 
-       if (debug_lvl > 1) fr_message_set_debug(ms, stdout);
+       if (debug_lvl > 1) fr_message_set_debug(stdout, ms);
 
        /*
         *      After the garbage collection, all messages marked "done" MUST also be marked "free".
@@ -466,7 +466,7 @@ static void *channel_worker(void *arg)
        MPRINT2("Worker GC\n");
        fr_message_set_gc(ms);
 
-       if (debug_lvl > 1) fr_message_set_debug(ms, stdout);
+       if (debug_lvl > 1) fr_message_set_debug(stdout, ms);
 
        /*
         *      After the garbage collection, all messages marked "done" MUST also be marked "free".
index ad2272f781d674ebb18581b236d1048e7b4fd85d..c24680aeae8fa27c47430a7a0d229dbd1e2d37a1 100644 (file)
@@ -248,7 +248,7 @@ int main(int argc, char *argv[])
 
        MPRINT1("TEST 1 used %d (%zu)\n", fr_message_set_messages_used(ms), used);
 
-       if (debug_lvl) fr_message_set_debug(ms, stdout);
+       if (debug_lvl) fr_message_set_debug(stdout, ms);
 
        /*
         *      Double the size of the allocations
@@ -270,7 +270,7 @@ int main(int argc, char *argv[])
 
        MPRINT1("TEST 2 used %d\n", fr_message_set_messages_used(ms));
 
-       if (debug_lvl) fr_message_set_debug(ms, stdout);
+       if (debug_lvl) fr_message_set_debug(stdout, ms);
        /*
         *      Double the size of the allocations
         */
@@ -299,7 +299,7 @@ int main(int argc, char *argv[])
 
        MPRINT1("TEST 3 used %d\n", fr_message_set_messages_used(ms));
 
-       if (debug_lvl) fr_message_set_debug(ms, stdout);
+       if (debug_lvl) fr_message_set_debug(stdout, ms);
 
        /*
         *      Do another 1000 rounds of alloc / free.
@@ -313,7 +313,7 @@ int main(int argc, char *argv[])
 
        MPRINT1("TEST 4 used %d\n", fr_message_set_messages_used(ms));
 
-       if (debug_lvl) fr_message_set_debug(ms, stdout);
+       if (debug_lvl) fr_message_set_debug(stdout, ms);
 
 #if 0
 
@@ -335,7 +335,7 @@ int main(int argc, char *argv[])
 
        MPRINT1("TEST 5 used %d\n", fr_message_set_messages_used(ms));
 
-       if (debug_lvl) fr_message_set_debug(ms, stdout);
+       if (debug_lvl) fr_message_set_debug(stdout, ms);
 
        /*
         *      Double the number of the allocations again,
@@ -355,7 +355,7 @@ int main(int argc, char *argv[])
 
        MPRINT1("TEST 6 used %d\n", fr_message_set_messages_used(ms));
 
-       if (debug_lvl) fr_message_set_debug(ms, stdout);
+       if (debug_lvl) fr_message_set_debug(stdout, ms);
 #endif
 
        my_alloc_size = end - start;
@@ -396,7 +396,7 @@ int main(int argc, char *argv[])
        MPRINT1("GC\n");
        fr_message_set_gc(ms);
 
-       if (debug_lvl) fr_message_set_debug(ms, stdout);
+       if (debug_lvl) fr_message_set_debug(stdout, ms);
 
        /*
         *      After the garbage collection, all messages marked "done" MUST also be marked "free".
index d258a271a83e38cd97b5839f8a422b88a22f88bd..2210cea192c70c311c8ef44b0ed9e1c31b9b8e4a 100644 (file)
@@ -502,7 +502,7 @@ static void master_process(TALLOC_CTX *ctx)
        MPRINT2("GC\n");
        fr_message_set_gc(ms);
 
-       if (debug_lvl > 1) fr_message_set_debug(ms, stdout);
+       if (debug_lvl > 1) fr_message_set_debug(stdout, ms);
 
        /*
         *      After the garbage collection, all messages marked "done" MUST also be marked "free".
index 633609de8a575c4744a39a20e974ac84534cc4de..278b2032eabb9487c9b27707904d28276246f1b8 100644 (file)
@@ -455,7 +455,7 @@ check_close:
        MPRINT2("GC\n");
        fr_message_set_gc(ms);
 
-       if (debug_lvl > 1) fr_message_set_debug(ms, stdout);
+       if (debug_lvl > 1) fr_message_set_debug(stdout, ms);
 
        /*
         *      After the garbage collection, all messages marked "done" MUST also be marked "free".