From: pk910 Date: Sun, 28 Aug 2011 13:55:59 +0000 (+0200) Subject: added simple channel ban cache X-Git-Tag: v5.3~469 X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=commitdiff_plain;h=b5a9fda198a004ed393c3214b640ce5a332b2ebf added simple channel ban cache --- diff --git a/BanNode.c b/BanNode.c new file mode 100644 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; +} diff --git a/BanNode.h b/BanNode.h new file mode 100644 index 0000000..56937e7 --- /dev/null +++ b/BanNode.h @@ -0,0 +1,19 @@ +#ifndef _BanNode_h +#define _BanNode_h +#include "main.h" + +struct ChanNode; + +struct BanNode { + char *mask; + struct ChanNode *chan; + + struct BanNode *next; +}; + +struct BanNode* addChannelBan(struct ChanNode *chan, char *mask); +void removeChannelBanMask(char *mask); +void removeChannelBan(struct BanNode *ban); +void removeChannelBans(struct ChanNode *chan); + +#endif \ No newline at end of file diff --git a/ChanNode.c b/ChanNode.c index e00acb6..7313bf3 100644 --- a/ChanNode.c +++ b/ChanNode.c @@ -156,6 +156,7 @@ struct ChanNode* addChannel(const char *name) { } strcpy(chan->name, name); chan->user = NULL; + chan->bans = NULL; chan->usercount = 0; chan->chanbot = NULL; chan->topic[0] = 0; @@ -278,7 +279,10 @@ static void parseModesUserPriv(struct ChanNode* chan, unsigned char flag, int ad } static void parseModesBan(struct ChanNode* chan, int add, char *mask) { - //to be continued... + if(add) + addChannelBan(chan, mask); + else + removeChannelBanMask(chan, mask); } void parseModes(struct ChanNode* chan, char *modeStr, char **argv, int argc) { diff --git a/ChanNode.h b/ChanNode.h index 8b8808c..213f8ae 100644 --- a/ChanNode.h +++ b/ChanNode.h @@ -18,8 +18,9 @@ struct ChanNode { unsigned int modes; char **mode_str_args; int *mode_int_args; - struct UserNode *chanbot; + struct BanNode *bans; + struct UserNode *chanbot; struct trigger_cache *trigger; int channel_id;