X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=debug.c;h=d8cf6f2e5f865cc765229e0b4f2d0828d0078eb1;hb=ea9d0eaa10eaa70e7a24b609fdd676a4322052ef;hp=d852a8de323facee4c8c321dc50aa6329213babe;hpb=aad355533c7afbfde3b95653737e280f70a12bcb;p=libradsec.git diff --git a/debug.c b/debug.c index d852a8d..d8cf6f2 100644 --- a/debug.c +++ b/debug.c @@ -1,12 +1,15 @@ /* * 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 * copyright notice and this permission notice appear in all copies. */ +#ifndef SYS_SOLARIS9 #include +#endif #include #include #include @@ -16,12 +19,16 @@ #include #include #include +#include #include "debug.h" +#include "util.h" static char *debug_ident = NULL; -static uint8_t debug_level = DBG_WARN; +static uint8_t debug_level = DBG_INFO; +static char *debug_filepath = NULL; static FILE *debug_file = NULL; static int debug_syslogfacility = 0; +static uint8_t debug_timestamp = 0; void debug_init(char *ident) { debug_file = stderr; @@ -38,11 +45,21 @@ void debug_set_level(uint8_t level) { debug_level = DBG_WARN; return; case 3: + 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; } @@ -56,17 +73,22 @@ int debug_set_destination(char *dest) { 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_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", - dest + 7, strerror(errno)); + debug_filepath, strerror(errno)); + } setvbuf(debug_file, NULL, _IONBF, 0); return 1; } if (!strncasecmp(dest, "x-syslog://", 11)) { dest += 11; + if (*dest == '/') + dest++; if (*dest) { for (i = 0; facstrings[i]; i++) if (!strcasecmp(dest, facstrings[i])) @@ -83,16 +105,45 @@ int debug_set_destination(char *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: + priority = LOG_DEBUG; + break; case DBG_INFO: priority = LOG_INFO; break; + case DBG_NOTICE: + priority = LOG_NOTICE; + break; case DBG_WARN: priority = LOG_WARNING; break; @@ -104,12 +155,11 @@ 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'; - fprintf(debug_file, "%s: ", timebuf); + fprintf(debug_file, "%s: ", timebuf + 4); free(timebuf); } vfprintf(debug_file, format, ap); @@ -135,3 +185,34 @@ 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); +} + +/* Local Variables: */ +/* c-file-style: "stroustrup" */ +/* End: */