From: Chris Porter Date: Mon, 18 Aug 2008 17:40:39 +0000 (+0100) Subject: Add SIGHUP handler, by default it triggers HOOK_CORE_REHASH. X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/commitdiff_plain/f69c0032f7438efe976e484cc315436e23dce243 Add SIGHUP handler, by default it triggers HOOK_CORE_REHASH. --- diff --git a/control/control.c b/control/control.c index 95930342..31cdaaa4 100644 --- a/control/control.c +++ b/control/control.c @@ -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 \nReloads specified module."); registercontrolhelpcmd("help",NO_ANYONE,1,&controlhelpcmd,"Usage: help \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..."); +} + diff --git a/core/hooks.h b/core/hooks.h index dedbd32c..34171fc9 100644 --- a/core/hooks.h +++ b/core/hooks.h @@ -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 diff --git a/core/main.c b/core/main.c index 5dfcf27c..2752b8f4 100644 --- a/core/main.c +++ b/core/main.c @@ -13,16 +13,17 @@ #include #include -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); } -