Define RDEBUG macros which implicitely take a "request",
authoraland <aland>
Mon, 30 Jun 2008 09:29:18 +0000 (09:29 +0000)
committeraland <aland>
Mon, 30 Jun 2008 09:29:18 +0000 (09:29 +0000)
and call the new function radlog_request()

Define new function radlog_request(), which should make it
much easier to do configurable logging

src/include/radiusd.h
src/main/log.c

index ce56396..134ae12 100644 (file)
@@ -146,6 +146,7 @@ typedef enum RAD_LISTEN_TYPE {
  *     For listening on multiple IP's and ports.
  */
 typedef struct rad_listen_t rad_listen_t;
+typedef                void (*radlog_func_t)(int, int, REQUEST *, const char *, ...);
 
 #define REQUEST_DATA_REGEX (0xadbeef00)
 #define REQUEST_MAX_REGEX (8)
@@ -219,9 +220,14 @@ struct auth_req {
 
        const char              *server;
        REQUEST                 *parent;
+       radlog_func_t           radlog; /* logging function, if set */
 };                             /* REQUEST typedef */
 
 #define RAD_REQUEST_OPTION_NONE            (0)
+#define RAD_REQUEST_OPTION_DEBUG           (1)
+#define RAD_REQUEST_OPTION_DEBUG2          (2)
+#define RAD_REQUEST_OPTION_DEBUG3          (3)
+#define RAD_REQUEST_OPTION_DEBUG4          (4)
 
 #define REQUEST_ACTIVE                 (1)
 #define REQUEST_STOP_PROCESSING (2)
@@ -325,6 +331,18 @@ typedef struct main_config_t {
 #define DEBUG2  if (debug_flag > 1)log_debug
 #define DEBUG3  if (debug_flag > 2)log_debug
 
+#if __GNUC__ >= 3
+#define RDEBUG(fmt, ...)   if(request && request->radlog) request->radlog(L_DBG, 1, request, fmt, ## __VA_ARGS__)
+#define RDEBUG2(fmt, ...)  if(request && request->radlog) request->radlog(L_DBG, 2, request, fmt, ## __VA_ARGS__)
+#define RDEBUG3(fmt, ...)  if(request && request->radlog) request->radlog(L_DBG, 3, request, fmt, ## __VA_ARGS__)
+#define RDEBUG4(fmt, ...)  if(request && request->radlog) request->radlog(L_DBG, 4, request, fmt, ## __VA_ARGS__)
+#else
+#define RDEBUG  DEBUG
+#define RDEBUG2 DEBUG2
+#define RDEBUG3 DEBUG3
+#define RDEBUG4 DEBUG4
+#endif
+
 #define SECONDS_PER_DAY                86400
 #define MAX_REQUEST_TIME       30
 #define CLEANUP_DELAY          5
@@ -472,6 +490,11 @@ int                log_debug(const char *, ...)
 #endif
 ;
 void           vp_listdebug(VALUE_PAIR *vp);
+void radlog_request(int lvl, int priority, REQUEST *request, const char *msg, ...)
+#ifdef __GNUC__
+               __attribute__ ((format (printf, 4, 5)))
+#endif
+;
 
 /* auth.c */
 char   *auth_name(char *buf, size_t buflen, REQUEST *request, int do_cli);
index 6e4e3c9..58a393b 100644 (file)
@@ -294,3 +294,48 @@ void force_log_reopen(void)
        if (log_fp) fclose(log_fp);
        fr_log_fp = log_fp = NULL;
 }
+
+
+void radlog_request(int lvl, int priority, REQUEST *request, const char *msg, ...)
+{
+       va_list ap;
+
+       request = request;      /* -Wunused */
+
+       va_start(ap, msg);
+
+       /*
+        *      Debugging messages get printed as informational messages
+        *      if there's a log function, and the priority there says
+        *      to print it.
+        */
+       if ((lvl == L_DBG) && !debug_flag &&
+           (request && request->radlog && 
+            (request->options >= priority))) lvl = L_INFO;
+
+       /*
+        *      If the message is normal, OR it's debugging at a high
+        *      enough priority level, print it out.
+        */
+       if ((lvl != L_DBG) ||
+           (debug_flag >= priority)) {
+               size_t len;
+               char buffer[1024];
+
+               if (!request->module[0]) {
+                       len = 0;
+               } else {
+                       snprintf(buffer, sizeof(buffer), "[%s] ", request->module);
+                       len = strlen(buffer);
+               }
+               vsnprintf(buffer + len, sizeof(buffer) - len, msg, ap);
+
+               /*
+                *      FIXME: Allow different log messages to go to
+                *      different locations, based on "xlat".
+                */
+               radlog(lvl, "%s", buffer);
+       }
+       va_end(ap);
+}
+