ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/conf_resv.c
Revision: 1860
Committed: Thu Apr 25 15:19:00 2013 UTC (12 years, 4 months ago) by michael
Content type: text/x-csrc
Original Path: ircd-hybrid/trunk/src/resv.c
File size: 5914 byte(s)
Log Message:
- God Damn It; resv exempts should be working now

File Contents

# Content
1 /*
2 * ircd-hybrid: an advanced Internet Relay Chat Daemon(ircd).
3 * resv.c: Functions to reserve(jupe) a nick/channel.
4 *
5 * Copyright (C) 2001-2002 Hybrid Development Team
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
20 * USA
21 *
22 * $Id$
23 */
24
25 #include "stdinc.h"
26 #include "list.h"
27 #include "ircd.h"
28 #include "send.h"
29 #include "client.h"
30 #include "memory.h"
31 #include "numeric.h"
32 #include "resv.h"
33 #include "hash.h"
34 #include "irc_string.h"
35 #include "ircd_defs.h"
36 #include "s_misc.h"
37 #include "conf.h"
38 #include "conf_db.h"
39 #include "channel.h"
40 #include "hostmask.h"
41
42 dlink_list resv_channel_list = { NULL, NULL, 0 };
43
44
45 /* create_resv()
46 *
47 * inputs - name of nick to create resv for
48 * - reason for resv
49 * - 1 if from ircd.conf, 0 if from elsewhere
50 * output - pointer to struct ResvNick
51 * side effects -
52 */
53 struct MaskItem *
54 create_resv(const char *name, const char *reason, const dlink_list *list)
55 {
56 dlink_node *ptr = NULL;
57 struct MaskItem *conf = NULL;
58 enum maskitem_type type;
59
60 if (name == NULL || reason == NULL)
61 return NULL;
62
63 if (IsChanPrefix(*name))
64 type = CONF_CRESV;
65 else
66 type = CONF_NRESV;
67
68 if (find_exact_name_conf(type, NULL, name, NULL, NULL))
69 return NULL;
70
71 conf = conf_make(type);
72 conf->name = xstrdup(name);
73 conf->reason = xstrndup(reason, IRCD_MIN(strlen(reason), REASONLEN));
74
75 if (list)
76 {
77 DLINK_FOREACH(ptr, list->head)
78 {
79 char nick[NICKLEN + 1];
80 char user[USERLEN + 1];
81 char host[HOSTLEN + 1];
82 struct split_nuh_item nuh;
83 struct exempt *exptr = NULL;
84 char *s = ptr->data;
85
86 if (strlen(s) == 2 && IsAlpha(*(s + 1) && IsAlpha(*(s + 2))))
87 {
88 exptr = MyMalloc(sizeof(*exptr));
89 exptr->name = xstrdup(s);
90 exptr->coid = GeoIP_id_by_code(s);
91 dlinkAdd(exptr, &exptr->node, &conf->exempt_list);
92 }
93 else
94 {
95 nuh.nuhmask = s;
96 nuh.nickptr = nick;
97 nuh.userptr = user;
98 nuh.hostptr = host;
99
100 nuh.nicksize = sizeof(nick);
101 nuh.usersize = sizeof(user);
102 nuh.hostsize = sizeof(host);
103
104 split_nuh(&nuh);
105
106 exptr = MyMalloc(sizeof(*exptr));
107 exptr->name = xstrdup(nick);
108 exptr->user = xstrdup(user);
109 exptr->host = xstrdup(host);
110 exptr->type = parse_netmask(host, &exptr->addr, &exptr->bits);
111 dlinkAdd(exptr, &exptr->node, &conf->exempt_list);
112 }
113 }
114 }
115
116 return conf;
117 }
118
119 int
120 resv_find_exempt(const struct Client *who, const struct MaskItem *conf)
121 {
122 const dlink_node *ptr = NULL;
123
124 DLINK_FOREACH(ptr, conf->exempt_list.head)
125 {
126 const struct exempt *exptr = ptr->data;
127
128 if (exptr->coid)
129 {
130 if (exptr->coid == who->localClient->country_id)
131 return 1;
132 }
133 else if (!match(exptr->name, who->name) && !match(exptr->user, who->username))
134 {
135 switch (exptr->type)
136 {
137 case HM_HOST:
138 if (!match(exptr->host, who->host) || !match(exptr->host, who->sockhost))
139 return 1;
140 break;
141 case HM_IPV4:
142 if (who->localClient->aftype == AF_INET)
143 if (match_ipv4(&who->localClient->ip, &exptr->addr, exptr->bits))
144 return 1;
145 break;
146 #ifdef IPV6
147 case HM_IPV6:
148 if (who->localClient->aftype == AF_INET6)
149 if (match_ipv6(&who->localClient->ip, &exptr->addr, exptr->bits))
150 return 1;
151 break;
152 #endif
153 default:
154 assert(0);
155 }
156 }
157 }
158
159 return 0;
160 }
161
162 /* match_find_resv()
163 *
164 * inputs - pointer to name
165 * output - pointer to a struct ResvChannel
166 * side effects - Finds a reserved channel whose name matches 'name',
167 * if can't find one returns NULL.
168 */
169 struct MaskItem *
170 match_find_resv(const char *name)
171 {
172 dlink_node *ptr = NULL;
173
174 if (EmptyString(name))
175 return NULL;
176
177 DLINK_FOREACH(ptr, resv_channel_list.head)
178 {
179 struct MaskItem *conf = ptr->data;
180
181 if (!match(conf->name, name))
182 return conf;
183 }
184
185 return NULL;
186 }
187
188 /* report_resv()
189 *
190 * inputs - pointer to client pointer to report to.
191 * output - NONE
192 * side effects - report all resvs to client.
193 */
194 void
195 report_resv(struct Client *source_p)
196 {
197 dlink_node *ptr = NULL;
198 struct MaskItem *conf = NULL;
199
200 DLINK_FOREACH(ptr, resv_channel_list.head)
201 {
202 conf = ptr->data;
203 sendto_one(source_p, form_str(RPL_STATSQLINE),
204 me.name, source_p->name,
205 conf->until ? 'q' : 'Q', conf->count,
206 conf->name, conf->reason);
207 }
208
209 DLINK_FOREACH(ptr, nresv_items.head)
210 {
211 conf = ptr->data;
212 sendto_one(source_p, form_str(RPL_STATSQLINE),
213 me.name, source_p->name,
214 conf->until ? 'q' : 'Q', conf->count,
215 conf->name, conf->reason);
216 }
217 }
218
219 /* valid_wild_card_simple()
220 *
221 * inputs - data to check for sufficient non-wildcard characters
222 * outputs - 1 if valid, else 0
223 * side effects - none
224 */
225 int
226 valid_wild_card_simple(const char *data)
227 {
228 const unsigned char *p = (const unsigned char *)data;
229 int nonwild = 0;
230
231 while (*p != '\0')
232 {
233 if ((*p == '\\' && *++p) || (*p && !IsMWildChar(*p)))
234 if (++nonwild == ConfigFileEntry.min_nonwildcard_simple)
235 return 1;
236 if (*p != '\0')
237 ++p;
238 }
239
240 return 0;
241 }

Properties

Name Value
svn:eol-style native
svn:keywords Id Revision