added simple channel ban cache
[NeonServV5.git] / BanNode.c
diff --git a/BanNode.c b/BanNode.c
new file mode 100644 (file)
index 0000000..45ba199
--- /dev/null
+++ b/BanNode.c
@@ -0,0 +1,54 @@
+
+#include "BanNode.h"
+#include "ChanNode.h"
+
+struct BanNode* addChannelBan(struct ChanNode *chan, char *mask) {
+    struct BanNode *ban = malloc(sizeof(*ban));
+    ban->chan = chan;
+    ban->mask = strdup(mask);
+    ban->next = chan->bans;
+    chan->bans = ban;
+}
+
+void removeChannelBanMask(struct ChanNode *chan, char *mask) {
+    struct BanNode *cban, *last = NULL;
+    for(cban = chan->bans; cban; cban = cban->next) {
+        if(!strcmp(cban->mask, mask)) {
+            if(last)
+                last->next = ban->next;
+            else
+                chan->bans = ban->next;
+            free(ban->mask);
+            free(ban);
+            break;
+        } else 
+            last = ban;
+    }
+}
+
+void removeChannelBan(struct BanNode *ban) {
+    struct BanNode *cban, *last = NULL;
+    struct ChanNode *chan = ban->chan;
+    for(cban = chan->bans; cban; cban = cban->next) {
+        if(cban == ban) {
+            if(last)
+                last->next = ban->next;
+            else
+                chan->bans = ban->next;
+            free(ban->mask);
+            free(ban);
+            break;
+        } else 
+            last = ban;
+    }
+}
+
+void removeChannelBans(struct ChanNode *chan) {
+    struct BanNode *ban, *next;
+    for(ban = chan->bans; ban; ban = next) {
+        next = ban->next;
+        free(ban->mask);
+        free(ban);
+    }
+    channel->bans = NULL;
+}