X-Git-Url: http://git.imager.perl.org/imager.git/blobdiff_plain/10ea52a3d4a66a82193e59839e580cf7b4e27d0b..9619c400aab403242cc2d7ae13dd714a4bb7ccd6:/log.c diff --git a/log.c b/log.c index 05197707..efc604c1 100644 --- a/log.c +++ b/log.c @@ -1,66 +1,88 @@ +#define IMAGER_NO_CONTEXT +#include "imageri.h" #include "imconfig.h" #include "log.h" #include #include +#include "imerror.h" #ifdef IMAGER_LOG #define DTBUFF 50 #define DATABUFF DTBUFF+3+10+1+5+1+1 -static int log_level = 0; -static FILE *lg_file = NULL; -static char *date_format = "%Y/%m/%d %H:%M:%S"; -static char date_buffer[DTBUFF]; -static char data_buffer[DATABUFF]; +#define LOG_DATE_FORMAT "%Y/%m/%d %H:%M:%S" +static i_mutex_t log_mutex; + +static void +im_vloog(pIMCTX, int level, const char *fmt, va_list ap); /* * Logging is active */ int -i_init_log(const char* name,int level) { +im_init_log(pIMCTX, const char* name,int level) { i_clear_error(); - log_level = level; + + if (!log_mutex) { + log_mutex = i_mutex_new(); + } + + if (aIMCTX->lg_file) { + if (aIMCTX->own_log) + fclose(aIMCTX->lg_file); + aIMCTX->lg_file = NULL; + } + + aIMCTX->log_level = level; if (level < 0) { - lg_file = NULL; + aIMCTX->lg_file = NULL; } else { if (name == NULL) { - lg_file = stderr; + aIMCTX->lg_file = stderr; + aIMCTX->own_log = 0; } else { - if (NULL == (lg_file = fopen(name, "w+")) ) { - i_push_errorf(errno, "Cannot open file '%s': (%d)", name, errno); + if (NULL == (aIMCTX->lg_file = fopen(name, "w+")) ) { + im_push_errorf(aIMCTX, errno, "Cannot open file '%s': (%d)", name, errno); return 0; } + aIMCTX->own_log = 1; + setvbuf(aIMCTX->lg_file, NULL, _IONBF, BUFSIZ); } } - if (lg_file) { - setvbuf(lg_file, NULL, _IONBF, BUFSIZ); - mm_log((0,"Imager - log started (level = %d)\n", level)); + if (aIMCTX->lg_file) { + im_log((aIMCTX, 0,"Imager - log started (level = %d)\n", level)); } - return lg_file != NULL; + return aIMCTX->lg_file != NULL; } void i_fatal(int exitcode,const char *fmt, ... ) { va_list ap; - time_t timi; - struct tm *str_tm; - - if (lg_file != NULL) { - timi = time(NULL); - str_tm = localtime(&timi); - if ( strftime(date_buffer, DTBUFF, date_format, str_tm) ) - fprintf(lg_file,"[%s] ",date_buffer); + dIMCTX; + + if (aIMCTX->lg_file != NULL) { va_start(ap,fmt); - vfprintf(lg_file,fmt,ap); + im_vloog(aIMCTX, 0, fmt, ap); va_end(ap); } exit(exitcode); } +void +im_fatal(pIMCTX, int exitcode,const char *fmt, ... ) { + va_list ap; + + if (aIMCTX->lg_file != NULL) { + va_start(ap,fmt); + im_vloog(aIMCTX, 0, fmt, ap); + va_end(ap); + } + exit(exitcode); +} /* =item i_loog(level, format, ...) @@ -71,18 +93,51 @@ This is an internal function called by the mm_log() macro. =cut */ +static void +im_vloog(pIMCTX, int level, const char *fmt, va_list ap) { + time_t timi; + struct tm *str_tm; + char date_buffer[DTBUFF]; + + if (!aIMCTX || !aIMCTX->lg_file || level > aIMCTX->log_level) + return; + + i_mutex_lock(log_mutex); + + timi = time(NULL); + str_tm = localtime(&timi); + strftime(date_buffer, DTBUFF, LOG_DATE_FORMAT, str_tm); + fprintf(aIMCTX->lg_file, "[%s] %10s:%-5d %3d: ", date_buffer, + aIMCTX->filename, aIMCTX->line, level); + vfprintf(aIMCTX->lg_file, fmt, ap); + fflush(aIMCTX->lg_file); + + i_mutex_unlock(log_mutex); +} + void i_loog(int level,const char *fmt, ... ) { + dIMCTX; va_list ap; - if (level > log_level) return; - if (lg_file != NULL) { - fputs(data_buffer, lg_file); - fprintf(lg_file, "%3d: ",level); - va_start(ap,fmt); - vfprintf(lg_file, fmt, ap); - fflush(lg_file); - va_end(ap); - } + + if (!aIMCTX || !aIMCTX->lg_file || level > aIMCTX->log_level) + return; + + va_start(ap,fmt); + im_vloog(aIMCTX, level, fmt, ap); + va_end(ap); +} + +void +im_loog(pIMCTX, int level,const char *fmt, ... ) { + va_list ap; + + if (!aIMCTX || !aIMCTX->lg_file || level > aIMCTX->log_level) + return; + + va_start(ap,fmt); + im_vloog(aIMCTX, level, fmt, ap); + va_end(ap); } /* @@ -95,37 +150,46 @@ This is an internal function called by the mm_log() macro. */ void -i_lhead(const char *file, int line) { - time_t timi; - struct tm *str_tm; - - if (lg_file != NULL) { - timi = time(NULL); - str_tm = localtime(&timi); - strftime(date_buffer, DTBUFF, date_format, str_tm); - sprintf(data_buffer, "[%s] %10s:%-5d ", date_buffer, file, line); +im_lhead(pIMCTX, const char *file, int line) { + if (aIMCTX && aIMCTX->lg_file != NULL) { + aIMCTX->filename = file; + aIMCTX->line = line; } } +void i_lhead(const char *file, int line) { + dIMCTX; + + im_lhead(aIMCTX, file, line); +} + #else /* * Logging is inactive - insert dummy functions */ -int i_init_log(const char* name,int onoff) { +int im_init_log(pIMCTX, const char* name,int onoff) { i_clear_error(); i_push_error(0, "Logging disabled"); return 0; } void i_fatal(int exitcode,const char *fmt, ... ) { exit(exitcode); } +void im_fatal(pIMCTX, int exitcode,const char *fmt, ... ) { exit(exitcode); } void i_loog(int level,const char *fmt, ... ) { } +void +im_loog(pIMCTX, int level,const char *fmt, ... ) { +} + void i_lhead(const char *file, int line) { } +void +im_lhead(pIMCTX, const char *file, int line) { } + #endif