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

File Contents

# User Rev Content
1 adx 30 /*
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 knight 31 * $Id$
23 adx 30 */
24    
25     #include "stdinc.h"
26 michael 1011 #include "list.h"
27 adx 30 #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 michael 1646 #include "s_misc.h"
37 michael 1309 #include "conf.h"
38 michael 1622 #include "conf_db.h"
39 michael 1858 #include "channel.h"
40     #include "hostmask.h"
41 adx 30
42     dlink_list resv_channel_list = { NULL, NULL, 0 };
43    
44    
45 michael 1858 /* create_resv()
46 adx 30 *
47 michael 1858 * inputs - name of nick to create resv for
48 adx 30 * - reason for resv
49 michael 1858 * - 1 if from ircd.conf, 0 if from elsewhere
50     * output - pointer to struct ResvNick
51 adx 30 * side effects -
52     */
53 michael 1632 struct MaskItem *
54 michael 1858 create_resv(const char *name, const char *reason, const dlink_list *list)
55 adx 30 {
56 michael 1860 dlink_node *ptr = NULL;
57 michael 1632 struct MaskItem *conf = NULL;
58 michael 1858 enum maskitem_type type;
59 adx 30
60     if (name == NULL || reason == NULL)
61     return NULL;
62    
63 michael 1858 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 adx 30 return NULL;
70    
71 michael 1858 conf = conf_make(type);
72 michael 1646 conf->name = xstrdup(name);
73     conf->reason = xstrndup(reason, IRCD_MIN(strlen(reason), REASONLEN));
74 adx 30
75 michael 1858 if (list)
76     {
77 michael 1860 DLINK_FOREACH(ptr, list->head)
78 michael 1858 {
79 michael 1860 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 michael 1858
86 michael 1860 if (strlen(s) == 2 && IsAlpha(*(s + 1) && IsAlpha(*(s + 2))))
87 michael 1858 {
88 michael 1860 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 michael 1858 nuh.nickptr = nick;
97     nuh.userptr = user;
98     nuh.hostptr = host;
99    
100 michael 1859 nuh.nicksize = sizeof(nick);
101 michael 1858 nuh.usersize = sizeof(user);
102     nuh.hostsize = sizeof(host);
103    
104     split_nuh(&nuh);
105    
106     exptr = MyMalloc(sizeof(*exptr));
107 michael 1860 exptr->name = xstrdup(nick);
108 michael 1858 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 adx 30 return conf;
117     }
118    
119 michael 1858 int
120     resv_find_exempt(const struct Client *who, const struct MaskItem *conf)
121 adx 30 {
122 michael 1858 const dlink_node *ptr = NULL;
123 adx 30
124 michael 1858 DLINK_FOREACH(ptr, conf->exempt_list.head)
125     {
126     const struct exempt *exptr = ptr->data;
127 adx 30
128 michael 1858 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 adx 30
159 michael 1858 return 0;
160 adx 30 }
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 michael 1632 struct MaskItem *
170 adx 30 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 michael 1632 struct MaskItem *conf = ptr->data;
180 adx 30
181 michael 1825 if (!match(conf->name, name))
182 michael 1632 return conf;
183 adx 30 }
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 michael 1632 dlink_node *ptr = NULL;
198     struct MaskItem *conf = NULL;
199 adx 30
200     DLINK_FOREACH(ptr, resv_channel_list.head)
201     {
202 michael 1632 conf = ptr->data;
203 michael 1834 sendto_one(source_p, form_str(RPL_STATSQLINE),
204 adx 30 me.name, source_p->name,
205 michael 1687 conf->until ? 'q' : 'Q', conf->count,
206 michael 1632 conf->name, conf->reason);
207 adx 30 }
208    
209     DLINK_FOREACH(ptr, nresv_items.head)
210     {
211 michael 1649 conf = ptr->data;
212 michael 1834 sendto_one(source_p, form_str(RPL_STATSQLINE),
213 adx 30 me.name, source_p->name,
214 michael 1687 conf->until ? 'q' : 'Q', conf->count,
215 michael 1632 conf->name, conf->reason);
216 adx 30 }
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