7b98d85a030fd0a6e7e78039579d7e2e447f518f
[NeonServV5.git] / src / BanNode.c
1 /* BanNode.c - NeonServ v5.3
2  * Copyright (C) 2011-2012  Philipp Kreil (pk910)
3  * 
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  * 
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  * 
14  * You should have received a copy of the GNU General Public License 
15  * along with this program. If not, see <http://www.gnu.org/licenses/>. 
16  */
17
18 #include "BanNode.h"
19 #include "ChanNode.h"
20 #include "tools.h"
21
22 struct BanNode* addChannelBan(struct ChanNode *chan, char *mask) {
23     struct BanNode *ban = malloc(sizeof(*ban));
24     ban->chan = chan;
25     ban->mask = strdup(mask);
26     ban->next = chan->bans;
27     chan->bans = ban;
28     return ban;
29 }
30
31 struct BanNode* getMatchingChannelBan(struct ChanNode *chan, char *mask) {
32     struct BanNode *cban;
33     for(cban = chan->bans; cban; cban = cban->next) {
34         if(!match(cban->mask, mask)) {
35             return cban;
36         }
37     }
38     return NULL;
39 }
40
41 void removeChannelBanMask(struct ChanNode *chan, char *mask) {
42     struct BanNode *cban, *last = NULL;
43     for(cban = chan->bans; cban; cban = cban->next) {
44         if(!strcmp(cban->mask, mask)) {
45             if(last)
46                 last->next = cban->next;
47             else
48                 chan->bans = cban->next;
49             free(cban->mask);
50             free(cban);
51             break;
52         } else 
53             last = cban;
54     }
55 }
56
57 void removeChannelBan(struct BanNode *ban) {
58     struct BanNode *cban, *last = NULL;
59     struct ChanNode *chan = ban->chan;
60     for(cban = chan->bans; cban; cban = cban->next) {
61         if(cban == ban) {
62             if(last)
63                 last->next = ban->next;
64             else
65                 chan->bans = ban->next;
66             free(ban->mask);
67             free(ban);
68             break;
69         } else 
70             last = cban;
71     }
72 }
73
74 void removeChannelBans(struct ChanNode *chan) {
75     struct BanNode *ban, *next;
76     for(ban = chan->bans; ban; ban = next) {
77         next = ban->next;
78         free(ban->mask);
79         free(ban);
80     }
81     chan->bans = NULL;
82 }