}
extern char *request_log_file;
+extern char *debug_log_file;
void radlog_request(int lvl, int priority, REQUEST *request, const char *msg, ...)
{
size_t len = 0;
+ const char *filename = request_log_file;
FILE *fp = NULL;
va_list ap;
char buffer[1024];
}
/*
+ * Use the debug output file, if specified,
+ * otherwise leave it as "request_log_file".
+ */
+ if (debug_log_file) filename = debug_log_file;
+
+ /*
* Debug messages get mashed to L_INFO for
* radius.log.
*/
- if (!request_log_file) lvl = L_INFO;
+ if (!filename) lvl = L_INFO;
}
- if (request && request_log_file) {
- radius_xlat(buffer, sizeof(buffer), request_log_file,
- request, NULL); /* FIXME: escape chars! */
+ if (request && filename) {
+ char *p;
/*
- * FIXME: call mkdir?
+ * This is SLOW! Doing it for every log message
+ * in every request is NOT recommended!
*/
+ radius_xlat(buffer, sizeof(buffer), filename,
+ request, NULL); /* FIXME: escape chars! */
+
+ p = strrchr(buffer, FR_DIR_SEP);
+ if (p) {
+ *p = '\0';
+ if (rad_mkdir(buffer, S_IRWXU) < 0) {
+ radlog(L_ERR, "Failed creating %s: %s",
+ buffer,strerror(errno));
+ va_end(ap);
+ return;
+ }
+ *p = FR_DIR_SEP;
+ }
+
fp = fopen(buffer, "a");
}
va_end(ap);
}
-
struct main_config_t mainconfig;
char *request_log_file = NULL;
+char *debug_log_file = NULL;
/*
* Temporary local variables for parsing the configuration
{ "file", PW_TYPE_STRING_PTR, -1, &mainconfig.log_file, "${logdir}/radius.log" },
{ "requests", PW_TYPE_STRING_PTR, -1, &request_log_file, NULL },
+ { "debug_file", PW_TYPE_STRING_PTR, -1, &debug_log_file, NULL },
{ NULL, -1, 0, NULL, NULL }
};