Fixed recursion problem with log_commands. Added Active flag to hook handlers
authorRick Bird <nveid@bender.theari.com>
Wed, 11 May 2011 22:11:31 +0000 (18:11 -0400)
committerRick Bird <nveid@bender.theari.com>
Wed, 11 May 2011 22:11:31 +0000 (18:11 -0400)
hdrs/modules.h
src/modules.c

index d6715dd64d7879d90f4d2bf2ae91a574d0bc54ba..a06dc0e754081f54ee0cb272951e999ffea4b1e5 100644 (file)
@@ -41,6 +41,7 @@ struct core_hook_t
 #define MODHOOK_AROUND         0x04    /* The call hook is an around method.. Take the highest priority & stop */
 #define MODHOOK_AFTER          0x08
 #define MODHOOK_BEFORE         0x10
+#define MODHOOK_ACTIVE         0x12    /* Is the hook active? */
 
 /* And now our table to load all our chooks at first */
 struct chook_table_t {
index ca727a752f482cdb15ee8bfb761943c28baca197..016de4fde39d5fc53f739572678a8e899694acf4 100644 (file)
@@ -23,7 +23,6 @@
 #include "match.h"
 #include "modules.h"
 
-static int cancel_hooks = 0;
 struct module_entry_t *module_list = NULL;
 HASHTAB chook_htab;
 HASHTAB chook_mevents;          /* MUSH Events aliased to Hooks */
@@ -279,8 +278,9 @@ CHook_Run(struct core_entry_t *entry, const char *format, ...)
   int rval;
   int (*module_func) (struct core_entry_t * entry, va_list argp);
 
-  if (cancel_hooks)
+  if (entry->up->flags & MODHOOK_ACTIVE)
     return -1;
+  entry->up->flags |= MODHOOK_ACTIVE;
   module_func = NULL;           /* Just for initialization purposes */
   va_start(argp, format);
   if (entry->flags & MODHOOK_SOFTCODE) {
@@ -289,14 +289,16 @@ CHook_Run(struct core_entry_t *entry, const char *format, ...)
   } else if (entry->flags & MODHOOK_MODULE) {
     /* We'll do this code later */
     va_end(argp);
+    entry->up->flags &= ~MODHOOK_ACTIVE;
     return -1;
   } else {
     va_end(argp);
+    entry->up->flags &= ~MODHOOK_ACTIVE;
     return -1;
   }
 
-  /* We get ehre something is wrong */
-  return -2;
+  entry->up->flags &= ~MODHOOK_ACTIVE;
+  return rval;
 
 }
 
@@ -371,11 +373,9 @@ CHook_SC(struct core_entry_t *entry, const char *format, va_list arguments)
         break;
       default:
         /* Bad Format.. don't run & return an error */
-        cancel_hooks = 1;       /* prevent recursions */
         do_rawlog(LT_ERR,
                   "%s:%d -> Unexpected format character '%c' in format \"%s\"",
                   __FILE__, __LINE__, *fptr, format);
-        cancel_hooks = 0;
         /* Restore Environment */
         copy_namedregs(&global_eval_context.namedregs, &preserve_namedregs);
         free_namedregs(&preserve_namedregs);