ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid-8/modules/m_accept.c
Revision: 1309
Committed: Sun Mar 25 11:24:18 2012 UTC (12 years ago) by michael
Content type: text/x-csrc
File size: 6165 byte(s)
Log Message:
- renaming files:

  ircd_parser.y -> conf_parser.y
  ircd_lexer.l  -> conf_lexer.l
  s_conf.c      -> conf.c
  s_conf.h      -> conf.h
  s_log.c       -> log.c
  s_log.h       -> log.h

File Contents

# Content
1 /*
2 * ircd-hybrid: an advanced Internet Relay Chat Daemon(ircd).
3 *
4 * Copyright (C) 2002 by the past and present ircd coders, and others.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
19 * USA
20 */
21
22 /*! \file m_accept.c
23 * \brief Includes required functions for processing the ACCEPT command.
24 * \version $Id$
25 */
26
27 #include "stdinc.h"
28 #include "client.h"
29 #include "irc_string.h"
30 #include "sprintf_irc.h"
31 #include "ircd.h"
32 #include "list.h"
33 #include "numeric.h"
34 #include "conf.h"
35 #include "s_serv.h"
36 #include "send.h"
37 #include "parse.h"
38 #include "modules.h"
39
40
41 /*! \brief Creates and sends a list of nick!user\@host masks a Client
42 * has on its acceptlist.
43 *
44 * \param source_p The actual Client the list will be sent to.
45 */
46 static void
47 list_accepts(struct Client *source_p)
48 {
49 int len = 0;
50 char nicks[IRCD_BUFSIZE] = { '\0' };
51 char *t = nicks;
52 const dlink_node *ptr = NULL;
53
54 len = strlen(me.name) + strlen(source_p->name) + 12;
55
56 DLINK_FOREACH(ptr, source_p->localClient->acceptlist.head)
57 {
58 const struct split_nuh_item *accept_p = ptr->data;
59 size_t masklen = strlen(accept_p->nickptr) +
60 strlen(accept_p->userptr) +
61 strlen(accept_p->hostptr) + 2 /* !@ */ ;
62
63 if ((t - nicks) + masklen + len > IRCD_BUFSIZE)
64 {
65 *(t - 1) = '\0';
66 sendto_one(source_p, form_str(RPL_ACCEPTLIST),
67 me.name, source_p->name, nicks);
68 t = nicks;
69 }
70
71 t += ircsprintf(t, "%s!%s@%s ",
72 accept_p->nickptr,
73 accept_p->userptr, accept_p->hostptr);
74 }
75
76 if (nicks[0] != '\0')
77 {
78 *(t - 1) = '\0';
79 sendto_one(source_p, form_str(RPL_ACCEPTLIST),
80 me.name, source_p->name, nicks);
81 }
82
83 sendto_one(source_p, form_str(RPL_ENDOFACCEPT),
84 me.name, source_p->name);
85 }
86
87 /*! \brief Allocates and adds a split_nuh_item holding a nick!user\@host
88 * mask to a Client's acceptlist.
89 *
90 * \param nuh A split_nuh_item already prepared with required masks.
91 * \param source_p The actual Client the new accept is added to.
92 */
93 static void
94 add_accept(const struct split_nuh_item *nuh, struct Client *source_p)
95 {
96 struct split_nuh_item *accept_p = MyMalloc(sizeof(*accept_p));
97
98 DupString(accept_p->nickptr, nuh->nickptr);
99 DupString(accept_p->userptr, nuh->userptr);
100 DupString(accept_p->hostptr, nuh->hostptr);
101
102 dlinkAdd(accept_p, &accept_p->node, &source_p->localClient->acceptlist);
103
104 list_accepts(source_p);
105 }
106
107 /*! \brief ACCEPT command handler
108 *
109 * \param client_p Pointer to allocated Client struct with physical connection
110 * to this server, i.e. with an open socket connected.
111 * \param source_p Pointer to allocated Client struct from which the message
112 * originally comes from. This can be a local or remote client.
113 * \param parc Integer holding the number of supplied arguments.
114 * \param parv Argument vector where parv[0] .. parv[parc-1] are non-NULL
115 * pointers.
116 * \note Valid arguments for this command are:
117 * - parv[0] = sender prefix
118 * - parv[1] = list of masks to be accepted or removed (optional)
119 */
120 static void
121 m_accept(struct Client *client_p, struct Client *source_p,
122 int parc, char *parv[])
123 {
124 char *mask = NULL;
125 char *p = NULL;
126 char nick[NICKLEN + 1];
127 char user[USERLEN + 1];
128 char host[HOSTLEN + 1];
129 struct split_nuh_item nuh;
130 struct split_nuh_item *accept_p = NULL;
131
132 if (EmptyString(parv[1]) || !irccmp(parv[1], "*"))
133 {
134 list_accepts(source_p);
135 return;
136 }
137
138 for (mask = strtoken(&p, parv[1], ","); mask != NULL;
139 mask = strtoken(&p, NULL, ","))
140 {
141 if (*mask == '-' && *++mask != '\0')
142 {
143 nuh.nuhmask = mask;
144 nuh.nickptr = nick;
145 nuh.userptr = user;
146 nuh.hostptr = host;
147
148 nuh.nicksize = sizeof(nick);
149 nuh.usersize = sizeof(user);
150 nuh.hostsize = sizeof(host);
151
152 split_nuh(&nuh);
153
154 if ((accept_p = find_accept(nick, user, host, source_p, 0)) == NULL)
155 {
156 sendto_one(source_p, form_str(ERR_ACCEPTNOT),
157 me.name, source_p->name, nick, user, host);
158 continue;
159 }
160
161 del_accept(accept_p, source_p);
162 }
163 else if (*mask != '\0')
164 {
165 if (dlink_list_length(&source_p->localClient->acceptlist) >=
166 ConfigFileEntry.max_accept)
167 {
168 sendto_one(source_p, form_str(ERR_ACCEPTFULL),
169 me.name, source_p->name);
170 return;
171 }
172
173 nuh.nuhmask = mask;
174 nuh.nickptr = nick;
175 nuh.userptr = user;
176 nuh.hostptr = host;
177
178 nuh.nicksize = sizeof(nick);
179 nuh.usersize = sizeof(user);
180 nuh.hostsize = sizeof(host);
181
182 split_nuh(&nuh);
183
184 if ((accept_p = find_accept(nick, user, host, source_p, 0)) != NULL)
185 {
186 sendto_one(source_p, form_str(ERR_ACCEPTEXIST),
187 me.name, source_p->name, nick, user, host);
188 continue;
189 }
190
191 add_accept(&nuh, source_p);
192 }
193 }
194 }
195
196 static struct Message accept_msgtab = {
197 "ACCEPT", 0, 0, 0, MAXPARA, MFLG_SLOW, 0,
198 { m_unregistered, m_accept, m_ignore, m_ignore, m_accept, m_ignore }
199 };
200
201 static void
202 module_init(void)
203 {
204 mod_add_cmd(&accept_msgtab);
205 }
206
207 static void
208 module_exit(void)
209 {
210 mod_del_cmd(&accept_msgtab);
211 }
212
213 struct module module_entry = {
214 .node = { NULL, NULL, NULL },
215 .name = NULL,
216 .version = "$Revision$",
217 .handle = NULL,
218 .modinit = module_init,
219 .modexit = module_exit,
220 .flags = 0
221 };

Properties

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