]> jfr.im git - irc/quakenet/newserv.git/blobdiff - core/error.c
CHANSERV: remove E type escapes
[irc/quakenet/newserv.git] / core / error.c
index 97395494c13dd6da25fb75a57ca893af934355c6..f7e554e3f8f97d356cd96460513c03d6d30408ad 100644 (file)
@@ -9,6 +9,8 @@
 
 FILE *logfile;
 
+static corehandler *coreh, *coret;
+
 char *sevtostring(int severity) {
   switch(severity) {
     case ERR_DEBUG:
@@ -34,8 +36,25 @@ 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("newserv.log","a");
+  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, ... ) {
@@ -52,6 +71,7 @@ void Error(char *source, int severity, char *reason, ... ) {
   
   evt.severity=severity;
   evt.message=buf;
+  evt.source=source;
   triggerhook(HOOK_CORE_ERROR, &evt);
   
   if (severity>ERR_DEBUG) {
@@ -59,8 +79,12 @@ void Error(char *source, int severity, char *reason, ... ) {
     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);
-    if (logfile) 
+    fflush(stderr);
+
+    if (logfile)  {
       fprintf(logfile,"[%s] %s(%s): %s\n",timebuf,sevtostring(severity),source,buf);
+      fflush(logfile);
+    }
   }
   
   if (severity>=ERR_STOP) {
@@ -69,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);
+}
+