diff options
Diffstat (limited to 'accel-pptpd/log.c')
-rw-r--r-- | accel-pptpd/log.c | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/accel-pptpd/log.c b/accel-pptpd/log.c new file mode 100644 index 00000000..454e9975 --- /dev/null +++ b/accel-pptpd/log.c @@ -0,0 +1,111 @@ +/* +* C Implementation: log +* +* Description: +* +* +* Author: <xeb@mail.ru>, (C) 2009 +* +* Copyright: See COPYING file that comes with this distribution +* +*/ + +#include <unistd.h> +#include <stdlib.h> +#include <stdio.h> +#include <pthread.h> +#include <stdarg.h> +#include <errno.h> +#include <string.h> +#include <pthread.h> +#include <sys/time.h> + +#include "log.h" + +#define RED_COLOR "\033[1;31m" +#define GREEN_COLOR "\033[1;32m" +#define YELLOW_COLOR "\033[1;33m" +#define BLUE_COLOR "\033[1;34m" +#define NORMAL_COLOR "\033[0;39m" + +#define LOG_ERROR 0 +#define LOG_WARN 1 +#define LOG_INFO 2 +#define LOG_DEBUG 3 + +static FILE *log_file=NULL; +static int log_level=1; +static int log_color=1; +static const char* level_name[]={"error","warning","info","debug"}; +static const char* level_color[]={RED_COLOR,YELLOW_COLOR,GREEN_COLOR,BLUE_COLOR}; +static pthread_mutex_t lock=PTHREAD_MUTEX_INITIALIZER; + +static int msg_completed=1; + +static void do_log(int level,const char *fmt,va_list ap) +{ + struct timeval tv; + + pthread_mutex_lock(&lock); + gettimeofday(&tv,NULL); + if (log_color) fprintf(log_file,"[%s%li.%03li] [%s]%s ",level_color[level],tv.tv_sec,tv.tv_usec/1000,NORMAL_COLOR,level_name[level]); + else fprintf(log_file,"[%li.%03li] [%s] ",tv.tv_sec,tv.tv_usec/1000,level_name[level]); + + vfprintf(log_file,fmt,ap); + + msg_completed=fmt[strlen(fmt)-1]=='\n'; + if (msg_completed) pthread_mutex_unlock(&lock); +} +void log_error(const char *fmt,...) +{ + if (log_level>=1) + { + va_list ap; + va_start(ap,fmt); + do_log(LOG_ERROR,fmt,ap); + } +} +void log_warn(const char *fmt,...) +{ + if (log_level>=2) + { + va_list ap; + va_start(ap,fmt); + do_log(LOG_WARN,fmt,ap); + } +} +void log_info(const char *fmt,...) +{ + if (log_level>=3) + { + va_list ap; + va_start(ap,fmt); + do_log(LOG_INFO,fmt,ap); + } +} +void log_debug(const char *fmt,...) +{ + if (log_level>=4) + { + va_list ap; + va_start(ap,fmt); + do_log(LOG_DEBUG,fmt,ap); + } +} + +void log_msg(const char *fmt,...) +{ + va_list ap; + if (msg_completed) return; + va_start(ap,fmt); + vfprintf(log_file,fmt,ap); + msg_completed=fmt[strlen(fmt)-1]=='\n'; + if (msg_completed) pthread_mutex_unlock(&lock); +} + +void log_init(FILE *f,int level,int color) +{ + log_file=f; + log_level=level; + log_color=color; +} |