]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
add function to prepend logging destination
authorAlan T. DeKok <aland@freeradius.org>
Tue, 21 Nov 2023 19:57:48 +0000 (14:57 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 21 Nov 2023 19:57:48 +0000 (14:57 -0500)
src/lib/server/request.c
src/lib/server/request.h

index 745281f61048ea55843b12c692c92e49361c4626..3c1e3bf534d2638b804347a13205636c899c9875 100644 (file)
@@ -83,6 +83,61 @@ static inline void CC_HINT(always_inline) request_log_init_orphan(request_t *req
        }
        request->log.dst->func = vlog_request;
        request->log.dst->uctx = &default_log;
+       request->log.dst->lvl = fr_debug_lvl;
+}
+
+/** Prepend another logging destination to the list.
+ *
+
+ * @param request      the request
+ * @param log_dst      the logging destination
+ * @param lvl          the new request debug lvl
+ */
+void request_log_prepend(request_t *request, fr_log_t *log_dst, fr_log_lvl_t lvl)
+{
+       log_dst_t *dst;
+
+       if (lvl == L_DBG_LVL_DISABLE) {
+               while (request->log.dst) {
+                       dst = request->log.dst->next;
+                       talloc_free(request->log.dst);
+                       request->log.dst = dst;
+               }
+
+               return;
+       }
+
+       /*
+        *      Disable any debug destinations which have actual debug output.
+        */
+       if (lvl == L_DBG_LVL_OFF) {
+               log_dst_t **last;
+
+               if (!request->log.dst) return;
+
+               last = &request->log.dst;
+               while (*last) {
+                       dst = *last;
+                       if (dst->lvl > L_DBG_LVL_OFF) {
+                               dst = dst->next;
+                               free(*last);
+                       }
+
+                       last = &(dst->next);
+               }
+
+               return;
+       }
+
+       MEM(dst = talloc_zero(request, log_dst_t));
+
+       dst->func = vlog_request;
+       dst->uctx = log_dst;
+
+       dst->lvl = request->log.lvl;
+       dst->next = request->log.dst;
+
+       request->log.dst = dst;
 }
 
 static inline void CC_HINT(always_inline) request_log_init_child(request_t *child, request_t const *parent)
index c46a4d3d311486c308a8c698de38a8d92dac7934..3dcf3d333b2ae5baebacfb14d30d6c3441913808 100644 (file)
@@ -335,6 +335,8 @@ int         request_detach(request_t *child);
 int            request_global_init(void);
 void           request_global_free(void);
 
+void           request_log_prepend(request_t *request, fr_log_t *log, fr_log_lvl_t lvl);
+
 #ifdef WITH_VERIFY_PTR
 void           request_verify(char const *file, int line, request_t const *request);   /* only for special debug builds */
 #endif