]> jfr.im git - irc/quakenet/newserv.git/commitdiff
Add SIGHUP handler, by default it triggers HOOK_CORE_REHASH.
authorChris Porter <redacted>
Mon, 18 Aug 2008 17:40:39 +0000 (18:40 +0100)
committerChris Porter <redacted>
Mon, 18 Aug 2008 17:40:39 +0000 (18:40 +0100)
control/control.c
core/hooks.h
core/main.c

index 959303424b149ddcea0c78a5050dd5e0e4eb4bf6..31cdaaa427eaf8d367f661346be9493fafacc1e2 100644 (file)
@@ -50,6 +50,7 @@ int controlrehash(void *sender, int cargc, char **cargv);
 int controlreload(void *sender, int cargc, char **cargv);
 int controlhelpcmd(void *sender, int cargc, char **cargv);
 void controlnoticeopers(flag_t permissionlevel, flag_t noticelevel, char *format, ...);
+void handlerehash(int hooknum, void *arg);
 
 void _init() {
   controlcmds=newcommandtree();
@@ -68,7 +69,8 @@ void _init() {
   registercontrolhelpcmd("showcommands",NO_ACCOUNT,0,&controlshowcommands,"Usage: showcommands\nShows all registered commands.");
   registercontrolhelpcmd("reload",NO_DEVELOPER,1,&controlreload,"Usage: reload <module>\nReloads specified module.");
   registercontrolhelpcmd("help",NO_ANYONE,1,&controlhelpcmd,"Usage: help <command>\nShows help for specified command.");
-  
+  registerhook(HOOK_CORE_REHASH, &handlerehash); 
   scheduleoneshot(time(NULL)+1,&controlconnect,NULL);
 }
 
@@ -92,6 +94,8 @@ void _fini() {
   deregistercontrolcmd("help",&controlhelpcmd);
   
   destroycommandtree(controlcmds);
+
+  deregisterhook(HOOK_CORE_REHASH, &handlerehash); 
 }
 
 void registercontrolhelpcmd(const char *name, int level, int maxparams, CommandHandler handler, char *help) {
@@ -624,3 +628,9 @@ void controlnswall(int noticelevel, char *format, ...) {
   controlwall(NO_OPER, noticelevel, "%s", broadcast);
 }
 
+void handlerehash(int hooknum, void *arg) {
+  long hupped = (long)arg;
+  if(hupped)
+    controlwall(NO_OPER, NL_OPERATIONS, "SIGHUP received, rehashing...");
+}
+
index dedbd32cb1380442f4f8c9757737ecde425edb73..34171fc95a8f0c57b34b94de94e73ae58c05b81b 100644 (file)
@@ -7,7 +7,7 @@
 
 /* This is the authoritative registry of all known hook numbers */
 
-#define HOOK_CORE_REHASH             0
+#define HOOK_CORE_REHASH             0  /* Argument is an int */
 #define HOOK_CORE_STATSREQUEST       1
 #define HOOK_CORE_STATSREPLY         2
 #define HOOK_CORE_ENDOFHOOKSQUEUE    3
index 5dfcf27c33478c7dd4ba410c1cb434c5c3889b09..2752b8f473ab7818de1827d31196e96118678904 100644 (file)
 #include <sys/time.h>
 #include <signal.h>
 
-int newserv_shutdown_pending;
-int newserv_sigusr1_pending;
-
 void initseed();
 void init_logfile();
 void siginthandler(int sig);
 void sigusr1handler(int sig);
 void sigsegvhandler(int sig);
+void sighuphandler(int sig);
 void handlecore(void);
+void handlesignals(void);
 
+int newserv_shutdown_pending;
+static int newserv_sigusr1_pending, newserv_sighup_pending;
 static void (*oldsegv)(int);
 
 int main(int argc, char **argv) {
@@ -45,22 +46,20 @@ int main(int argc, char **argv) {
   initmodules();
   signal(SIGINT, siginthandler);
   signal(SIGUSR1, sigusr1handler);
+  signal(SIGHUP, sighuphandler);
   oldsegv = signal(SIGSEGV, sigsegvhandler);
 
   /* Main loop */
   for(;;) {
     handleevents(10);  
     doscheduledevents(time(NULL));
+
     if (newserv_shutdown_pending) {
       newserv_shutdown();
       break;
     }
 
-    if (newserv_sigusr1_pending) {
-      signal(SIGUSR1, sigusr1handler);
-      triggerhook(HOOK_CORE_SIGUSR1, NULL);
-      newserv_sigusr1_pending=0;
-    }
+    handlesignals();
   }  
 
   nsexit();
@@ -69,6 +68,22 @@ int main(int argc, char **argv) {
   finisstring();  
 }
 
+void handlesignals(void) {
+  if (newserv_sigusr1_pending) {
+    signal(SIGUSR1, sigusr1handler);
+    Error("core", ERR_INFO, "SIGUSR1 received.");
+    triggerhook(HOOK_CORE_SIGUSR1, NULL);
+    newserv_sigusr1_pending=0;
+   }
+
+  if (newserv_sighup_pending) {
+    signal(SIGHUP, sigusr1handler);
+    Error("core", ERR_INFO, "SIGHUP received, rehashing...");
+    triggerhook(HOOK_CORE_REHASH, (void *)1);
+    newserv_sighup_pending=0;
+  }
+}
+
 /*
  * seed the pseudo-random number generator, rand()
  */
@@ -87,9 +102,12 @@ void sigusr1handler(int sig) {
   newserv_sigusr1_pending = 1;
 }
 
+void sighuphandler(int sig) {
+  newserv_sighup_pending = 1;
+}
+
 void sigsegvhandler(int sig) {
   handlecore();
 
   oldsegv(sig);
 }
-