+void _fini() {
+ deleteallschedules(&controlconnect);
+ if (mynick) {
+ deregisterlocaluser(mynick,"Leaving");
+ }
+
+ deregistercontrolcmd("status",&controlstatus);
+ deregistercontrolcmd("whois",&controlwhois);
+ deregistercontrolcmd("channel",&controlchannel);
+ deregistercontrolcmd("relink",&relink);
+ deregistercontrolcmd("die",&die);
+ deregistercontrolcmd("insmod",&controlinsmod);
+ deregistercontrolcmd("rmmod",&controlrmmod);
+ deregistercontrolcmd("lsmod",&controllsmod);
+ deregistercontrolcmd("rehash",&controlrehash);
+ deregistercontrolcmd("showcommands",&controlshowcommands);
+ deregistercontrolcmd("reload",&controlreload);
+ deregistercontrolcmd("help",&controlhelpcmd);
+
+ destroycommandtree(controlcmds);
+
+ deregisterhook(HOOK_CORE_REHASH, &handlesignal);
+ deregisterhook(HOOK_CORE_SIGINT, &handlesignal);
+}
+
+void registercontrolhelpcmd(const char *name, int level, int maxparams, CommandHandler handler, char *helpstr) {
+ cmdhelp *help;
+ Command *newcmd;
+
+ newcmd = addcommandtotree(controlcmds,name,level,maxparams,handler);
+
+ if (helpstr) {
+ /* Allocate a help record */
+ help=(cmdhelp *)malloc(sizeof(cmdhelp));
+ if(!help) {
+ Error("control",ERR_ERROR,"Malloc failed: registercontrolhelpcmd");
+ return;
+ }
+ memset((void *)help,0,sizeof(cmdhelp));
+
+ /* this isn't an sstring atm, as sstring has a max length (512) */
+ int len=strlen(helpstr);
+ help->helpstr=(char *)malloc(len+1);
+ if(help->helpstr) {
+ strncpy(help->helpstr, helpstr, len);
+ help->helpstr[len] = '\0';
+ }
+ newcmd->ext=(void *)help;
+ newcmd->destroyext=controldestroyext;
+ }
+}
+
+void registercontrolhelpfunccmd(const char *name, int level, int maxparams, CommandHandler handler, CommandHelp helpcmd) {
+ cmdhelp *help;
+ Command *newcmd;
+
+ /* Allocate a help record */
+ help=(cmdhelp *)malloc(sizeof(cmdhelp));
+ if (!help) {
+ Error("control",ERR_ERROR,"Malloc failed: registercontrolhelpfunccmd");
+ return;
+ }
+ memset((void *)help,0,sizeof(cmdhelp));
+
+ help->helpcmd=helpcmd;
+
+ newcmd = addcommandexttotree(controlcmds,name,level,maxparams,handler, (void *)help);
+ newcmd->destroyext=controldestroyext;