/* logger.c : PUBLIC DOMAIN - Jon Mayo - 2006 */ #include #include #include #include #include #include #include "logger.h" static unsigned log_mask = LOG_BIT_ALL; static FILE *log_out; static void do_timestamp(void) { time_t now; char buf[64]; struct tm tm; time(&now); #if defined unix || defined __unix || defined __unix__ /* SuSv2 has reentrant gmtime_r() function */ if(log_mask&LOG_BIT_LOCALTIME) localtime_r(&now, &tm); else gmtime_r(&now, &tm); #else if(log_mask&LOG_BIT_LOCALTIME) tm=*localtime(&now); else tm=*gmtime(&now); #endif strftime(buf, sizeof buf, "%c", &tm); fprintf(log_out, "%s:", buf); } void log_vimessage(unsigned mode, const char *level_name, const char *filename, const char *func, unsigned line, const char *fmt, va_list ap) { assert(log_out!=NULL); if(mode&log_mask) { if(log_mask&LOG_BIT_TIMESTAMP) do_timestamp(); if(func) { fprintf(log_out, "%s:%s():%u:%s:", filename, func, line, level_name); } else { fprintf(log_out, "%s:%u:%s:", filename, line, level_name); } vfprintf(log_out, fmt, ap); } } void log_vmessage(unsigned mode, const char *level_name, const char *fmt, va_list ap) { assert(log_out!=NULL); if(mode&log_mask) { if(log_mask&LOG_BIT_TIMESTAMP) do_timestamp(); fprintf(log_out, "%s:", level_name); vfprintf(log_out, fmt, ap); } } void log_message(unsigned mode, const char *level_name, const char *fmt, ...) { va_list ap; va_start(ap, fmt); log_vmessage(mode, level_name, fmt, ap); va_end(ap); } void log_imessage(unsigned mode, const char *level_name, const char *filename, const char *func, unsigned line, const char *fmt, ...) { va_list ap; va_start(ap, fmt); log_vimessage(mode, level_name, filename, func, line, fmt, ap); va_end(ap); } int log_init(const char *file, unsigned log_bits) { if(!file) { log_out=stderr; return 1; } else { FILE *tmp; tmp=fopen(file, "a"); if(!tmp) { if(!log_out) log_out=stderr; LOG_ERRNO(file); return 0; } log_out=tmp; setvbuf(log_out, 0, _IONBF, BUFSIZ); log_mask=log_bits; LOG_INFO("-- log started --\n"); return 1; } } void log_enable(unsigned bits) { log_mask|=bits; } void log_disable(unsigned bits) { log_mask&=~bits; } void log_shutdown(void) { LOG_INFO("-- log ended --\n"); if(log_out!=stderr) { int res; res=fclose(log_out); log_out=stderr; if(res!=0) LOG_ERRNO("log_out"); } }