From: Alan T. DeKok Date: Tue, 21 Nov 2023 19:57:48 +0000 (-0500) Subject: add function to prepend logging destination X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4385892eda2752efe401dbef952318d9ec46e617;p=thirdparty%2Ffreeradius-server.git add function to prepend logging destination --- diff --git a/src/lib/server/request.c b/src/lib/server/request.c index 745281f6104..3c1e3bf534d 100644 --- a/src/lib/server/request.c +++ b/src/lib/server/request.c @@ -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) diff --git a/src/lib/server/request.h b/src/lib/server/request.h index c46a4d3d311..3dcf3d333b2 100644 --- a/src/lib/server/request.h +++ b/src/lib/server/request.h @@ -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