fixed last commit
[NeonServV5.git] / ChanNode.c
index 7d2c9a54315cecf11afa56083a665ff3184c735b..14ab084d43378595a7014712b653b8c80c739157 100644 (file)
@@ -1,6 +1,7 @@
 #include "ChanNode.h"
 #include "ChanUser.h"
 #include "UserNode.h"
+#include "modcmd.h"
 
 static struct ChanNode **chanList;
 static int modes_with_strarg, modes_with_intarg;
@@ -76,6 +77,24 @@ void init_ChanNode() {
     }
 }
 
+void free_ChanNode() {
+    //kamikaze free all channels and chanusers
+    int i;
+    struct ChanNode *chan, *next;
+    struct ChanUser *chanuser, *next_chanuser;
+    for(i = 0; i < 47; i++) {
+        for(chan = chanList[i]; chan; chan = next) {
+            next = chan->next;
+            for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = next_chanuser) {
+                next_chanuser = getChannelUsers(chan, chanuser);
+                free(chanuser);
+            }
+            freeChanNode(chan);
+        }
+    }
+    free(chanList);
+}
+
 int is_valid_chan(const char *name) {
     unsigned int ii;
     if (*name !='#')
@@ -142,6 +161,7 @@ struct ChanNode* addChannel(const char *name) {
     chan->flags = 0;
     /* mode lists */
     chan->modes = 0;
+    chan->trigger = NULL;
     chan->mode_str_args = calloc(modes_with_strarg, sizeof(char*));
     chan->mode_int_args = calloc(modes_with_intarg, sizeof(int));
     
@@ -184,6 +204,14 @@ void freeChanNode(struct ChanNode* chan) {
         if(chan->mode_str_args[i])
             free(chan->mode_str_args[i]);
     }
+    if(chan->trigger) {
+        struct trigger_cache *trigger, *next_trigger;
+        for(trigger = chan->trigger; trigger; trigger = next_trigger) {
+            next_trigger = trigger;
+            free(trigger->trigger);
+            free(trigger);
+        }
+    }
     free(chan->mode_str_args);
     free(chan->mode_int_args);
     free(chan);
@@ -346,4 +374,3 @@ void getModeString(struct ChanNode* chan, char *modesStr) {
     #undef MODE_VALUE
     #undef MODE_VALUE_INDEX
 }
-