X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/74620ebafeb4a94b61a3747e39d27a4ec7a9fe5a..f4c9742568a27f565ebc2902491ef64038da20da:/core/error.c diff --git a/core/error.c b/core/error.c index a7d0d995..f7e554e3 100644 --- a/core/error.c +++ b/core/error.c @@ -7,6 +7,10 @@ #include "error.h" #include "hooks.h" +FILE *logfile; + +static corehandler *coreh, *coret; + char *sevtostring(int severity) { switch(severity) { case ERR_DEBUG: @@ -32,22 +36,55 @@ char *sevtostring(int severity) { } } +void reopen_logfile(int hooknum, void *arg) { + if (logfile) + fclose(logfile); + + logfile=fopen("logs/newserv.log","a"); +} + +void init_logfile() { + logfile=fopen("logs/newserv.log","a"); + if (!logfile) { + fprintf(stderr,"Failed to open logfile...\n"); + } + registerhook(HOOK_CORE_SIGUSR1, reopen_logfile); +} + +void fini_logfile() { + deregisterhook(HOOK_CORE_SIGUSR1, reopen_logfile); + if (logfile) + fclose(logfile); +} + void Error(char *source, int severity, char *reason, ... ) { char buf[512]; va_list va; struct tm *tm; time_t now; char timebuf[100]; - + struct error_event evt; + va_start(va,reason); vsnprintf(buf,512,reason,va); va_end(va); + evt.severity=severity; + evt.message=buf; + evt.source=source; + triggerhook(HOOK_CORE_ERROR, &evt); + if (severity>ERR_DEBUG) { now=time(NULL); tm=gmtime(&now); strftime(timebuf,100,"%Y-%m-%d %H:%M:%S",tm); fprintf(stderr,"[%s] %s(%s): %s\n",timebuf,sevtostring(severity),source,buf); + fflush(stderr); + + if (logfile) { + fprintf(logfile,"[%s] %s(%s): %s\n",timebuf,sevtostring(severity),source,buf); + fflush(logfile); + } } if (severity>=ERR_STOP) { @@ -56,3 +93,44 @@ void Error(char *source, int severity, char *reason, ... ) { exit(0); } } + +void handlecore(void) { + corehandler *n; + + /* no attempt is made to clean these up */ + for(n=coreh;coreh;n=coreh->next) + (n->fn)(n->arg); +} + +corehandler *registercorehandler(CoreHandlerFn fn, void *arg) { + corehandler *c = (corehandler *)malloc(sizeof(corehandler)); + /* core if we can't allocate!! */ + + c->fn = fn; + c->arg = arg; + c->next = NULL; + c->prev = coret; + coret = c->prev; + + if(!coreh) + coreh = c; + + return c; +} + +void deregistercorehandler(corehandler *c) { + if(!c->prev) { + coreh = c->next; + } else { + c->prev->next = c->next; + } + + if(!c->next) { + coret = c->prev; + } else { + c->next->prev = c->prev; + } + + free(c); +} +