X-Git-Url: http://git.imager.perl.org/imager.git/blobdiff_plain/156699af0d2ede8cdf1a8c4bd7b4867a6e3118dd..e1c0692925:/log.c diff --git a/log.c b/log.c index 5f8b92a6..efc604c1 100644 --- a/log.c +++ b/log.c @@ -1,3 +1,4 @@ +#define IMAGER_NO_CONTEXT #include "imageri.h" #include "imconfig.h" #include "log.h" @@ -10,15 +11,13 @@ #define DTBUFF 50 #define DATABUFF DTBUFF+3+10+1+5+1+1 -#if 0 -static int log_level = 0; -static FILE *lg_file = NULL; -static char date_buffer[DTBUFF]; -static char data_buffer[DATABUFF]; -#endif - #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 */ @@ -26,47 +25,64 @@ static char data_buffer[DATABUFF]; int im_init_log(pIMCTX, const char* name,int level) { i_clear_error(); + + 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) { aIMCTX->lg_file = NULL; } else { if (name == NULL) { aIMCTX->lg_file = stderr; + aIMCTX->own_log = 0; } else { if (NULL == (aIMCTX->lg_file = fopen(name, "w+")) ) { - i_push_errorf(errno, "Cannot open file '%s': (%d)", name, errno); + 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 (aIMCTX->lg_file) { - setvbuf(aIMCTX->lg_file, NULL, _IONBF, BUFSIZ); - mm_log((0,"Imager - log started (level = %d)\n", level)); + im_log((aIMCTX, 0,"Imager - log started (level = %d)\n", level)); } return aIMCTX->lg_file != NULL; } -#if 0 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); } -#endif +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, ...) @@ -83,8 +99,10 @@ im_vloog(pIMCTX, int level, const char *fmt, va_list ap) { struct tm *str_tm; char date_buffer[DTBUFF]; - if (!aIMCTX->lg_file || level > aIMCTX->log_level) + if (!aIMCTX || !aIMCTX->lg_file || level > aIMCTX->log_level) return; + + i_mutex_lock(log_mutex); timi = time(NULL); str_tm = localtime(&timi); @@ -93,14 +111,16 @@ im_vloog(pIMCTX, int level, const char *fmt, va_list ap) { 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, ... ) { - pIMCTX = im_get_context(); + dIMCTX; va_list ap; - if (!aIMCTX->lg_file || level > aIMCTX->log_level) + if (!aIMCTX || !aIMCTX->lg_file || level > aIMCTX->log_level) return; va_start(ap,fmt); @@ -112,7 +132,7 @@ void im_loog(pIMCTX, int level,const char *fmt, ... ) { va_list ap; - if (!aIMCTX->lg_file || level > aIMCTX->log_level) + if (!aIMCTX || !aIMCTX->lg_file || level > aIMCTX->log_level) return; va_start(ap,fmt); @@ -131,14 +151,14 @@ This is an internal function called by the mm_log() macro. void im_lhead(pIMCTX, const char *file, int line) { - if (aIMCTX->lg_file != NULL) { + if (aIMCTX && aIMCTX->lg_file != NULL) { aIMCTX->filename = file; aIMCTX->line = line; } } void i_lhead(const char *file, int line) { - pIMCTX = im_get_context(); + dIMCTX; im_lhead(aIMCTX, file, line); } @@ -149,19 +169,27 @@ void i_lhead(const char *file, int line) { * 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