]> jfr.im git - irc/quakenet/newserv.git/blobdiff - noperserv/noperserv_hooks.c
build: Clean up workspaces code a bit.
[irc/quakenet/newserv.git] / noperserv / noperserv_hooks.c
index efa1ae16802cc9ab295497508b3ee908e66eac24..3df5e8739c1a57a0f7226f4db160cfd95add499c 100644 (file)
@@ -19,8 +19,8 @@
 struct storedhook {
   CommandHandler old;
   sstring *name;
-  sstring *oldhelp;
-  sstring *newhelp;
+  cmdhelp *oldhelp;
+  cmdhelp *newhelp;
   struct storedhook *next;
 } storedhook;
 
@@ -32,6 +32,7 @@ nick *replynick = NULL;
 UserMessageHandler oldhandler;
 ControlMsg oldreply;
 ControlWall oldwall;
+ControlPermitted oldpermitted;
 
 void noperserv_trap_registration(int hooknum, void *arg);
 int noperserv_showcommands(void *sender, int cargc, char **cargv);
@@ -42,7 +43,7 @@ int noperserv_help(void *sender, int cargc, char **cargv);
 void noperserv_whois_handler(int hooknum, void *arg);
 void noperserv_whois_account_handler(int hooknum, void *arg);
 void noperserv_handle_messages(nick *target, int messagetype, void **args);
-void noperserv_reply(nick *np, char *format, ...);
+void noperserv_reply(nick *np, char *format, ...) __attribute__ ((format (printf, 2, 3)));
 void noperserv_wall(flag_t permissionlevel, flag_t noticelevel, char *format, ...);
 
 struct specialsched special;
@@ -57,6 +58,9 @@ void noperserv_setup_hooks(void) {
   oldwall = controlwall;
   controlwall = &noperserv_wall;
 
+  oldpermitted = controlpermitted;
+  controlpermitted = &noperserv_policy_command_permitted;
+
   memset(&special, 0, sizeof(struct specialsched));
 
   if(!mynick) {
@@ -87,14 +91,20 @@ int noperserv_hook_command(char *command, CommandHandler newcommand, char *newhe
 
   newhook->old = fetchcommand->handler;
   if(newhelp) {
-    newhook->newhelp = getsstring(newhelp, 512);
+    newhook->newhelp = (cmdhelp *)malloc(sizeof(cmdhelp));
+    memset(newhook->newhelp,0,sizeof(cmdhelp));
     if(!newhook->newhelp) {
       freesstring(newhook->name);
       free(newhook);
-      return 1;
+    } else {
+      int len = strlen(newhelp) + 1;
+      newhook->newhelp->helpstr = (char *)malloc(len);
+      if (newhook->newhelp->helpstr) {
+        strlcpy(newhook->newhelp->helpstr, newhelp, len);
+      } 
+      newhook->oldhelp = fetchcommand->ext;
+      fetchcommand->ext = newhook->newhelp;
     }
-    newhook->oldhelp = fetchcommand->help;
-    fetchcommand->help = newhook->newhelp;
   } else {
     newhook->newhelp = NULL;
   }
@@ -115,8 +125,10 @@ void noperserv_unhook_all_commands(void) {
     if(ch->old && (fetchcommand = findcommandintree(controlcmds, ch->name->content, 1))) {
       fetchcommand->handler = ch->old;
       if(ch->newhelp) {
-        fetchcommand->help = ch->oldhelp;
-        freesstring(ch->newhelp);
+        fetchcommand->ext = ch->oldhelp;
+        if ( ((cmdhelp *)ch->newhelp)->helpstr)
+          free( ((cmdhelp *)ch->newhelp)->helpstr);
+        free(ch->newhelp);
       }
     }
     nh = ch->next;
@@ -135,14 +147,19 @@ void noperserv_cleanup_hooks(void) {
     firsttime = 0;
   }
 
-  if(oldhandler)
+  if(oldhandler && mynick)
     hooklocaluserhandler(mynick, oldhandler);
 
   controlwall = oldwall;
   controlreply = oldreply;
+  controlpermitted = oldpermitted;
 }
 
 void noperserv_trap_registration(int hooknum, void *arg) {
+  nick *np = (nick *)arg;
+  if(!np)
+    return;
+
   oldhandler = hooklocaluserhandler((nick *)arg, &noperserv_handle_messages);
   if(!oldhandler)
     return;
@@ -274,7 +291,7 @@ int noperserv_showcommands(void *sender, int cargc, char **cargv) {
   
   for(i=0;i<n;i++)
     if(noperserv_policy_command_permitted(cmdlist[i]->level, np))
-      controlreply(np, "%s (%s)", cmdlist[i]->command->content, printflags(cmdlist[i]->level, no_commandflags));
+      controlreply(np, " %-25s %s", cmdlist[i]->command->content, printflags(cmdlist[i]->level, no_commandflags));
 
   controlreply(np, "End of list.");
   return CMD_OK;
@@ -382,14 +399,14 @@ void noperserv_handle_messages(nick *target, int messagetype, void **args) {
                
       cmd = findcommandintree(controlcmds,cargv[0],1);
       if(!cmd) {
-        controlreply(sender, "Unknown command.");
+        controlreply(sender, "Unknown command or access denied.");
         return;
       }
       
       /* If we were doing "authed user tracking" here we'd put a check in for authlevel */
       /* Here it is! */
       if (!noperserv_policy_command_permitted(cmd->level, sender)) {
-        controlreply(sender, "Access denied.");
+        controlreply(sender, "Unknown command or access denied.");
         return;
       }
 
@@ -435,13 +452,8 @@ int noperserv_help(void *sender, int cargc, char **cargv) {
     return CMD_USAGE;
 
   cmd = findcommandintree(controlcmds, cargv[0], 1);
-  if(!cmd) {
-    controlreply(np, "Unknown command.");
-    return CMD_ERROR;
-  }
-  
-  if(!noperserv_policy_command_permitted(cmd->level, np)) {
-    controlreply(np, "Access denied.");
+  if(!cmd || !noperserv_policy_command_permitted(cmd->level, np)) {
+    controlreply(np, "Unknown command or access denied.");
     return CMD_ERROR;
   }