00001
00007 #include <assert.h>
00008 #include <stdarg.h>
00009 #include <stdbool.h>
00010 #include <stdio.h>
00011
00012 #include "logger.h"
00013 #include "utf8.h"
00014
00016 static const char *log_levels[] =
00017 {
00018 "emerg",
00019 "alert",
00020 "critic",
00021 "error",
00022 "warning",
00023 "notice",
00024 "info",
00025 "debug",
00026 "dump"
00027 };
00028
00030 static FILE *log_filename;
00031
00032 void open_log()
00033 {
00034 log_filename = fopen(CONFIG_LOG_FILENAME, "wt");
00035 }
00036
00037 bool log_dump_latin1(const char *var, const char *value)
00038 {
00039 char utf8[256];
00040
00041 assert(var != NULL);
00042 assert(value != NULL);
00043
00044 iso8859_utf8(value, utf8, sizeof(utf8));
00045
00046 return add_log(ADDLOG_DUMP, "[log]dump", "%s(latin1): '%s'\n", var, utf8);
00047 }
00048
00049 bool log_dump(const char *var, const char *value)
00050 {
00051 assert(var != NULL);
00052 assert(value != NULL);
00053
00054 return add_log(ADDLOG_DUMP, "[log]dump", "%s(utf8): '%s'\n", var, value);
00055 }
00056
00057 bool add_log(int level, const char *context, const char *format, ...)
00058 {
00059 va_list ap;
00060
00061 assert(context != NULL);
00062 assert(format != NULL);
00063 assert(log_filename != NULL);
00064 assert((level >= LOG_EMERG) && (level <= LOG_DEBUG));
00065
00066
00067 if (level > CONFIG_LOG_LEVEL)
00068 {
00069 return true;
00070 }
00071
00072
00073 if (log_filename == NULL)
00074 {
00075 log_filename = fopen(CONFIG_LOG_FILENAME, "at");
00076 if (log_filename == NULL)
00077 {
00078 return false;
00079 }
00080 }
00081
00082
00083 if (fprintf(log_filename, "%s.%s: ", context, log_levels[level]) < 0)
00084 {
00085 return false;
00086 }
00087
00088
00089 va_start(ap, format);
00090 if (vfprintf(log_filename, format, ap) >= 0)
00091 {
00092 va_end (ap);
00093 fflush(log_filename);
00094
00095 return true;
00096 }
00097 va_end (ap);
00098
00099 return false;
00100 }
00101
00102 void close_log()
00103 {
00104 assert(log_filename != NULL);
00105 fclose(log_filename);
00106
00107 log_filename = NULL;
00108 }