00001 #include "errmanager.h"
00002 #include "dbug_mem.h"
00003
00004
00005 emData emd;
00006
00007 int emInit(int logLevel,
00008 int logType,
00009 void (*cb)(void *ctxt, char *pFile, char *pFunc, int iLine, int level, char *fmt),
00010 void *ctxt,
00011 char *filename)
00012 {
00013 memset(&emd, 0, sizeof(emData));
00014
00015 switch(logType) {
00016 case EM_TYPE_SYSLOG:
00017 emd.logLevel = logLevel;
00018 emd.logType = logType;
00019 emd.errCallBack = NULL;
00020 emd.ctxt = NULL;
00021 emd.filename = NULL;
00022 openlog(PACKAGE, LOG_CONS|LOG_PID, LOG_USER);
00023 break;
00024 case EM_TYPE_STDERR:
00025 emd.logLevel = logLevel;
00026 emd.logType = logType;
00027 emd.errCallBack = NULL;
00028 emd.ctxt = NULL;
00029 emd.filename = NULL;
00030 openlog(PACKAGE, LOG_CONS|LOG_PERROR, LOG_USER);
00031 break;
00032 case EM_TYPE_CALLBACK:
00033 emd.logLevel = logLevel;
00034 emd.logType = logType;
00035 if(cb == NULL) {
00036 printf("Need a callback funtion by EM_TYPE_CALLBACK");
00037 return -1;
00038 } else {
00039 emd.errCallBack = cb;
00040 emd.ctxt = ctxt;
00041 }
00042 emd.filename = NULL;
00043 break;
00044 default:
00045 printf("Not Supported");
00046 return -1;
00047 break;
00048 }
00049
00050 return 0;
00051 }
00052
00053 int reentrant=0;
00054 void emManager(char* pFile, char* pFunc, int iLine, int level, char* fmt, ...)
00055 {
00056 va_list arglist;
00057 char msgbuf[MAX_STRLEN];
00058 char debuginfos[LOG_DEBUG+1][20] = {
00059 "EMERG:",
00060 "ALERT:",
00061 "CRIT:",
00062 "ERROR:",
00063 "WARNING:",
00064 "NOTICE:",
00065 "INFO:",
00066 "DEBUG:"
00067 };
00068
00069 if (reentrant > 0){
00070 return;
00071 }
00072 reentrant++;
00073
00074 va_start(arglist, fmt);
00075 vsnprintf(msgbuf, MAX_STRLEN, fmt, arglist);
00076 va_end(arglist);
00077
00078 if(emd.logLevel >= level) {
00079 if(emd.logLevel == LOG_DEBUG && emd.logType != EM_TYPE_CALLBACK) {
00080 syslog(level, "%-9s%s:%d: %s", debuginfos[level], pFile, iLine, msgbuf);
00081
00082
00083
00084 } else if(emd.logType != EM_TYPE_CALLBACK) {
00085 syslog(level, "%-9s%s", debuginfos[level], msgbuf);
00086
00087 } else {
00088 emd.errCallBack(emd.ctxt, pFile, pFunc, iLine, level, msgbuf);
00089 }
00090 }
00091 reentrant--;
00092 }