Merge branch 'development'
[NeonServV5.git] / src / BanNode.c
1 /* BanNode.c - NeonServ v5.6
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     SYNCHRONIZE(cache_sync);
27     ban->next = chan->bans;
28     chan->bans = ban;
29     DESYNCHRONIZE(cache_sync);
30     return ban;
31 }
32
33 struct BanNode* getMatchingChannelBan(struct ChanNode *chan, char *mask) {
34     SYNCHRONIZE(cache_sync);
35     struct BanNode *cban;
36     for(cban = chan->bans; cban; cban = cban->next) {
37         if(!match(cban->mask, mask)) {
38             DESYNCHRONIZE(cache_sync);
39             return cban;
40         }
41     }
42     DESYNCHRONIZE(cache_sync);
43     return NULL;
44 }
45
46 void removeChannelBanMask(struct ChanNode *chan, char *mask) {
47     SYNCHRONIZE(cache_sync);
48     struct BanNode *cban, *last = NULL;
49     for(cban = chan->bans; cban; cban = cban->next) {
50         if(!strcmp(cban->mask, mask)) {
51             if(last)
52                 last->next = cban->next;
53             else
54                 chan->bans = cban->next;
55             free(cban->mask);
56             free(cban);
57             break;
58         } else 
59             last = cban;
60     }
61     DESYNCHRONIZE(cache_sync);
62 }
63
64 void removeChannelBan(struct BanNode *ban) {
65     SYNCHRONIZE(cache_sync);
66     struct BanNode *cban, *last = NULL;
67     struct ChanNode *chan = ban->chan;
68     for(cban = chan->bans; cban; cban = cban->next) {
69         if(cban == ban) {
70             if(last)
71                 last->next = ban->next;
72             else
73                 chan->bans = ban->next;
74             free(ban->mask);
75             free(ban);
76             break;
77         } else 
78             last = cban;
79     }
80     DESYNCHRONIZE(cache_sync);
81 }
82
83 void removeChannelBans(struct ChanNode *chan) {
84     SYNCHRONIZE(cache_sync);
85     struct BanNode *ban, *next;
86     for(ban = chan->bans; ban; ban = next) {
87         next = ban->next;
88         free(ban->mask);
89         free(ban);
90     }
91     chan->bans = NULL;
92     DESYNCHRONIZE(cache_sync);
93 }