diff options
Diffstat (limited to 'broken/propagate/src/log.c')
-rw-r--r-- | broken/propagate/src/log.c | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/broken/propagate/src/log.c b/broken/propagate/src/log.c new file mode 100644 index 0000000..bf494fe --- /dev/null +++ b/broken/propagate/src/log.c @@ -0,0 +1,108 @@ +#include <stdlib.h> +#include <unistd.h> +#include <stdio.h> +#include <fcntl.h> +#include <time.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <stdarg.h> + +FILE *logfile = NULL; +int loglevel; + +#define LOG_FATAL 0 +#define LOG_WARN 1 +#define LOG_INFO 2 +#define LOG_DEBUG 3 + +static void logit(int, const char *, va_list); + +void +log_init(int level, int logstdout) +{ + char name[128]; + + if (logstdout == 1) { + logfile = stderr; + } else { + snprintf(name, sizeof(name), "pg.log"); + logfile = fopen(name, "a+"); + if (!logfile) { + printf("cannot open log file %s!\n", name); + exit(1); + } + } + loglevel = level; +} + +void +log_tmp(const char *msg, ...) +{ + va_list ap; + + va_start(ap, msg); + vfprintf(logfile, msg, ap); + fprintf(logfile, "\n"); + fflush(logfile); + va_end(ap); +} +void +log_debug(const char *msg, ...) +{ + va_list ap; + + va_start(ap, msg); + logit(LOG_DEBUG, msg, ap); + va_end(ap); +} +void +log_info(const char *msg, ...) +{ + va_list ap; + + va_start(ap, msg); + logit(LOG_INFO, msg, ap); + va_end(ap); +} +void +log_warn(const char *msg, ...) +{ + va_list ap; + + va_start(ap, msg); + logit(LOG_WARN, msg, ap); + va_end(ap); +} +void +fatal(const char *msg, ...) +{ + va_list ap; + + va_start(ap, msg); + logit(LOG_FATAL, msg, ap); + va_end(ap); + + exit(1); +} + +static void +logit(int level, const char *msg, va_list ap) +{ + time_t clock; + char type; + + if (level <= loglevel) { + switch (level) { + case LOG_FATAL: type='X'; break; + case LOG_WARN: type='W'; break; + case LOG_INFO: type='.'; break; + case LOG_DEBUG: type=' '; break; + } + time(&clock); + fprintf(logfile, "%d %c ", (int)clock, type); + vfprintf(logfile, msg, ap); + fprintf(logfile, "\n"); + fflush(logfile); + } +} + |