X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=debug.c;h=28a86612460a80752da13d8e4d7c1f193c422963;hb=3edadaafb32f0cb230672f9363698df10c38c66d;hp=aac6ac6c482887b797062c7af2183d7ce5387dfe;hpb=52ac7dae87f8fa168921c33eb8cce2813e1b408e;p=libradsec.git diff --git a/debug.c b/debug.c index aac6ac6..28a8661 100644 --- a/debug.c +++ b/debug.c @@ -1,5 +1,6 @@ /* * Copyright (C) 2007 Stig Venaas + * Copyright (C) 2010 NORDUnet A/S * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -18,12 +19,19 @@ #include #include #include +#include #include "debug.h" +#include "util.h" static char *debug_ident = NULL; static uint8_t debug_level = DBG_INFO; +static char *debug_filepath = NULL; static FILE *debug_file = NULL; static int debug_syslogfacility = 0; +#if defined(WANT_FTICKS) +static int fticks_syslogfacility = 0; +#endif +static uint8_t debug_timestamp = 0; void debug_init(char *ident) { debug_file = stderr; @@ -40,63 +48,109 @@ void debug_set_level(uint8_t level) { debug_level = DBG_WARN; return; case 3: - debug_level = DBG_INFO; + debug_level = DBG_NOTICE; return; case 4: + debug_level = DBG_INFO; + return; + case 5: debug_level = DBG_DBG; return; } } +void debug_timestamp_on() { + debug_timestamp = 1; +} + uint8_t debug_get_level() { return debug_level; } -int debug_set_destination(char *dest) { +int debug_set_destination(char *dest, int l) { static const char *facstrings[] = { "LOG_DAEMON", "LOG_MAIL", "LOG_USER", "LOG_LOCAL0", - "LOG_LOCAL1", "LOG_LOCAL2", "LOG_LOCAL3", "LOG_LOCAL4", - "LOG_LOCAL5", "LOG_LOCAL6", "LOG_LOCAL7", NULL }; + "LOG_LOCAL1", "LOG_LOCAL2", "LOG_LOCAL3", "LOG_LOCAL4", + "LOG_LOCAL5", "LOG_LOCAL6", "LOG_LOCAL7", NULL }; static const int facvals[] = { LOG_DAEMON, LOG_MAIL, LOG_USER, LOG_LOCAL0, - LOG_LOCAL1, LOG_LOCAL2, LOG_LOCAL3, LOG_LOCAL4, - LOG_LOCAL5, LOG_LOCAL6, LOG_LOCAL7 }; + LOG_LOCAL1, LOG_LOCAL2, LOG_LOCAL3, LOG_LOCAL4, + LOG_LOCAL5, LOG_LOCAL6, LOG_LOCAL7 }; extern int errno; int i; - + if (!strncasecmp(dest, "file:///", 8)) { - debug_file = fopen(dest + 7, "a"); - if (!debug_file) { - debug_file = stderr; - debugx(1, DBG_ERR, "Failed to open logfile %s\n%s", - dest + 7, strerror(errno)); + if (l!=1) { + debug_filepath = stringcopy(dest + 7, 0); + debug_file = fopen(debug_filepath, "a"); + if (!debug_file) { + debug_file = stderr; + debugx(1, DBG_ERR, "Failed to open logfile %s\n%s", + debug_filepath, strerror(errno)); + } + setvbuf(debug_file, NULL, _IONBF, 0); } - setvbuf(debug_file, NULL, _IONBF, 0); return 1; } - if (!strncasecmp(dest, "x-syslog://", 11)) { - dest += 11; - if (*dest == '/') - dest++; + if (!strncasecmp(dest, "x-syslog://", 11) || (l==1)) { + if (!strncasecmp(dest, "x-syslog://", 11) || ((l==1) && strncasecmp(dest, "x-syslog://", 11))) { + dest += 11; + if (*dest == '/') + dest++; + } if (*dest) { for (i = 0; facstrings[i]; i++) if (!strcasecmp(dest, facstrings[i])) break; if (!facstrings[i]) debugx(1, DBG_ERR, "Unknown syslog facility %s", dest); - debug_syslogfacility = facvals[i]; - } else - debug_syslogfacility = LOG_DAEMON; - openlog(debug_ident, LOG_PID, debug_syslogfacility); + if (l==1) + fticks_syslogfacility = facvals[i]; + else + debug_syslogfacility = facvals[i]; + } else { + if (l==1) + fticks_syslogfacility = 0; + else + debug_syslogfacility = LOG_DAEMON; + } + if (l==1) { + if (fticks_syslogfacility && !debug_syslogfacility) + openlog(debug_ident, LOG_PID, fticks_syslogfacility); + } else + openlog(debug_ident, LOG_PID, debug_syslogfacility); return 1; } debug(DBG_ERR, "Unknown log destination, exiting %s", dest); exit(1); } +void debug_reopen_log() { + extern int errno; + + /* not a file, noop, return success */ + if (!debug_filepath) { + debug(DBG_ERR, "skipping reopen"); + return; + } + + if (debug_file != stderr) + fclose(debug_file); + + debug_file = fopen(debug_filepath, "a"); + if (debug_file) + debug(DBG_ERR, "Reopened logfile %s", debug_filepath); + else { + debug_file = stderr; + debug(DBG_ERR, "Failed to open logfile %s, using stderr\n%s", + debug_filepath, strerror(errno)); + } + setvbuf(debug_file, NULL, _IONBF, 0); +} + void debug_logit(uint8_t level, const char *format, va_list ap) { struct timeval now; char *timebuf; int priority; - + if (debug_syslogfacility) { switch (level) { case DBG_DBG: @@ -105,6 +159,9 @@ void debug_logit(uint8_t level, const char *format, va_list ap) { case DBG_INFO: priority = LOG_INFO; break; + case DBG_NOTICE: + priority = LOG_NOTICE; + break; case DBG_WARN: priority = LOG_WARNING; break; @@ -116,8 +173,7 @@ void debug_logit(uint8_t level, const char *format, va_list ap) { } vsyslog(priority, format, ap); } else { - timebuf = malloc(256); - if (timebuf) { + if (debug_timestamp && (timebuf = malloc(256))) { gettimeofday(&now, NULL); ctime_r(&now.tv_sec, timebuf); timebuf[strlen(timebuf) - 1] = '\0'; @@ -147,3 +203,52 @@ void debugx(int status, uint8_t level, char *format, ...) { } exit(status); } + +void debugerrno(int err, uint8_t level, char *format, ...) { + if (level >= debug_level) { + va_list ap; + size_t len = strlen(format); + char *tmp = malloc(len + 1024 + 2); + assert(tmp); + strcpy(tmp, format); + tmp[len++] = ':'; + tmp[len++] = ' '; + if (strerror_r(err, tmp + len, 1024)) + tmp = format; + va_start(ap, format); + debug_logit(level, tmp, ap); + va_end(ap); + } +} + +void debugerrnox(int err, uint8_t level, char *format, ...) { + if (level >= debug_level) { + va_list ap; + va_start(ap, format); + debugerrno(err, level, format, ap); + va_end(ap); + } + exit(err); +} + +#if defined(WANT_FTICKS) +void fticks_debug(const char *format, ...) { + int priority; + va_list ap; + va_start(ap, format); + if (!debug_syslogfacility && !fticks_syslogfacility) + debug_logit(0xff, format, ap); + else { + if (fticks_syslogfacility) { + priority = LOG_DEBUG|fticks_syslogfacility; + } else { + priority = LOG_DEBUG; + } + vsyslog(priority, format, ap); + va_end(ap); + } +} +#endif +/* Local Variables: */ +/* c-file-style: "stroustrup" */ +/* End: */