X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Flog.c;h=bcbce64b6115e010059e1788e16070f3f367e63a;hb=9f87c6fe6552ce8b2236a07307d2f825b0e4c439;hp=97b46713b86845e20fd89ca0ecb1fee9659e1656;hpb=8ea532bfd73db1b23d444dac3ebb2581a013a90a;p=libucw.git diff --git a/lib/log.c b/lib/log.c index 97b46713..bcbce64b 100644 --- a/lib/log.c +++ b/lib/log.c @@ -2,6 +2,9 @@ * Sherlock Library -- Logging * * (c) 1997--2001 Martin Mares + * + * This software may be freely distributed and used according to the terms + * of the GNU Lesser General Public License. */ #include "lib/lib.h" @@ -9,33 +12,71 @@ #include #include #include +#include #include #include -#include +#include -static byte *log_progname; +static char *log_progname, log_name_patt[64], log_name[64]; static pid_t log_pid; +static int log_params; + +void +log_fork(void) +{ + log_pid = getpid(); +} static void -vlog(unsigned int cat, byte *msg, va_list args) +log_switch(struct tm *tm) +{ + int fd; + char name[64]; + + if (!log_name_patt[0] || + log_name[0] && !log_params) + return; + strftime(name, sizeof(name), log_name_patt, tm); + if (!strcmp(name, log_name)) + return; + strcpy(log_name, name); + fd = open(name, O_WRONLY | O_CREAT | O_APPEND, 0666); + if (fd < 0) + die("Unable to open log file %s: %m", name); + close(2); + dup(fd); + close(fd); +} + +static void +vlog(unsigned int cat, const char *msg, va_list args) { time_t tim = time(NULL); struct tm *tm = localtime(&tim); char buf[32]; - if (!log_pid) - log_pid = getpid(); + log_switch(tm); strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", tm); fprintf(stderr, "%c %s ", cat, buf); if (log_progname) - fprintf(stderr, "[%s (%d)] ", log_progname, log_pid); + { + if (log_pid) + fprintf(stderr, "[%s (%d)] ", log_progname, log_pid); + else + fprintf(stderr, "[%s] ", log_progname); + } + else + { + if (log_pid) + fprintf(stderr, "[%d] ", log_pid); + } vfprintf(stderr, msg, args); fputc('\n', stderr); fflush(stderr); } void -log(unsigned int cat, byte *msg, ...) +log(unsigned int cat, const char *msg, ...) { va_list args; @@ -55,8 +96,23 @@ die(byte *msg, ...) exit(1); } +#ifdef DEBUG +void +assert_failed(char *assertion, char *file, int line) +{ + log(L_FATAL, "Assertion `%s' failed at %s:%d", assertion, file, line); + abort(); +} +#else +void +assert_failed(void) +{ + die("Internal error: Assertion failed."); +} +#endif + static byte * -basename(byte *n) +log_basename(byte *n) { byte *p = n; @@ -70,7 +126,7 @@ void log_init(byte *argv0) { if (argv0) - log_progname = basename(argv0); + log_progname = log_basename(argv0); } void @@ -78,11 +134,11 @@ log_file(byte *name) { if (name) { - int fd = open(name, O_WRONLY | O_CREAT | O_APPEND, 0666); - if (fd < 0) - die("Unable to open log file %s: %m", name); - close(2); - dup(fd); - close(fd); + time_t tim = time(NULL); + struct tm *tm = localtime(&tim); + strcpy(log_name_patt, name); + log_params = !!strchr(name, '%'); + log_name[0] = 0; + log_switch(tm); } }