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();
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);
}
deregistercontrolcmd("help",&controlhelpcmd);
destroycommandtree(controlcmds);
+
+ deregisterhook(HOOK_CORE_REHASH, &handlerehash);
}
void registercontrolhelpcmd(const char *name, int level, int maxparams, CommandHandler handler, char *help) {
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...");
+}
+
#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) {
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();
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()
*/
newserv_sigusr1_pending = 1;
}
+void sighuphandler(int sig) {
+ newserv_sighup_pending = 1;
+}
+
void sigsegvhandler(int sig) {
handlecore();
oldsegv(sig);
}
-