* 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)
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)
#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
#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);
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);
+}
+