00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <config.h>
00011
00012 #include <stdio.h>
00013 #include <stdlib.h>
00014 #include <stdarg.h>
00015 #include <string.h>
00016 #include <time.h>
00017 #include <errno.h>
00018 #include <unistd.h>
00019
00020 #include "log.h"
00021
00022 FILE *log_file;
00023
00024 int log_types_mask = LOG_ERROR | LOG_INFO;
00025
00026
00027 int log_debug_mask = 0;
00028
00029 #define BUFSIZE 512
00030
00031 static char *currentTS(void)
00032 {
00033 static char buf[BUFSIZE];
00034 time_t curtime;
00035
00036 bzero(buf, BUFSIZE);
00037 curtime = time(NULL);
00038 strftime(buf, BUFSIZE, "%Y-%m-%d %H:%M:%S", localtime(&curtime));
00039
00040 return buf;
00041 }
00042
00043 int log_printf(enum log_types type, const char *logmsg, ...)
00044 {
00045 va_list args;
00046 char buf[BUFSIZE];
00047
00048 if ((log_types_mask & type & LOG_MASK_MAJOR) == 0)
00049 return 0;
00050
00051 if ((type & LOG_DEBUG) && (log_debug_mask & type & LOG_MASK_MINOR) == 0)
00052 return 0;
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 bzero(buf, BUFSIZE);
00064 snprintf(buf, BUFSIZE, "%s %d %s", currentTS(), getpid(), logmsg);
00065 va_start(args, logmsg);
00066
00067 return vfprintf(log_file, buf, args);
00068 }
00069
00070 FILE *log_init(const char *filename, int verbose)
00071 {
00072 FILE *f;
00073
00074 if(!strcmp(filename, "stdout")){
00075 return stdout;
00076 }else if(!strcmp(filename, "stderr")){
00077 return stderr;
00078 }
00079
00080 if (verbose)
00081 printf("* Opening logfile '%s': ", filename);
00082
00083
00084 if ((f = fopen(filename, "a+")) == NULL)
00085 {
00086 if (verbose)
00087 printf("failed: %s\n", strerror(errno));
00088 exit(1);
00089 }
00090
00091 setbuf(f, NULL);
00092 if (verbose)
00093 printf(" OK\n");
00094
00095 return f;
00096 }
00097
00098 void log_finish(FILE *f)
00099 {
00100
00101 if(f == stdout || f == stderr){
00102 return;
00103 }
00104
00105 fclose(f);
00106 }
00107