]>
Commit | Line | Data |
---|---|---|
1 | add opkick command, similar to opmode command, but then for kicking | |
2 | priv controlled by LOCAL_OPOPKICK and OPKICK | |
3 | feature controlled by OPKICK (disabled by default), new p10 token OK | |
4 | if implemented, it must not be enabled until ALL servers and services are upgraded | |
5 | generates HACK(4) snomask notice for accountability with oper as source | |
6 | probably needs some work (for one i simply copied the header from m_kick.c) | |
7 | ||
8 | diff -r a77bd3d09dec include/client.h | |
9 | --- a/include/client.h Tue Feb 03 18:16:21 2009 +0100 | |
10 | +++ b/include/client.h Tue Feb 03 18:40:09 2009 +0100 | |
11 | @@ -116,6 +116,8 @@ | |
12 | PRIV_LOCAL_JUPE, /**< oper can local JUPE */ | |
13 | PRIV_OPMODE, /**< oper can OP/CLEARMODE */ | |
14 | PRIV_LOCAL_OPMODE, /**< oper can local OP/CLEARMODE */ | |
15 | + PRIV_OPKICK, /**< oper can OPKICK */ | |
16 | + PRIV_LOCAL_OPKICK, /**< oper can local OPKICK */ | |
17 | PRIV_SET, /**< oper can SET */ | |
18 | PRIV_WHOX, /**< oper can use /who x */ | |
19 | PRIV_BADCHAN, /**< oper can BADCHAN */ | |
20 | diff -r a77bd3d09dec include/handlers.h | |
21 | --- a/include/handlers.h Tue Feb 03 18:16:21 2009 +0100 | |
22 | +++ b/include/handlers.h Tue Feb 03 18:40:09 2009 +0100 | |
23 | @@ -167,6 +167,7 @@ | |
24 | extern int mo_kill(struct Client*, struct Client*, int, char*[]); | |
25 | extern int mo_notice(struct Client*, struct Client*, int, char*[]); | |
26 | extern int mo_oper(struct Client*, struct Client*, int, char*[]); | |
27 | +extern int mo_opkick(struct Client*, struct Client*, int, char*[]); | |
28 | extern int mo_opmode(struct Client*, struct Client*, int, char*[]); | |
29 | extern int mo_ping(struct Client*, struct Client*, int, char*[]); | |
30 | extern int mo_privmsg(struct Client*, struct Client*, int, char*[]); | |
31 | @@ -216,6 +217,7 @@ | |
32 | extern int ms_nick(struct Client*, struct Client*, int, char*[]); | |
33 | extern int ms_notice(struct Client*, struct Client*, int, char*[]); | |
34 | extern int ms_oper(struct Client*, struct Client*, int, char*[]); | |
35 | +extern int ms_opkick(struct Client*, struct Client*, int, char*[]); | |
36 | extern int ms_opmode(struct Client*, struct Client*, int, char*[]); | |
37 | extern int ms_part(struct Client*, struct Client*, int, char*[]); | |
38 | extern int ms_ping(struct Client*, struct Client*, int, char*[]); | |
39 | diff -r a77bd3d09dec include/ircd_features.h | |
40 | --- a/include/ircd_features.h Tue Feb 03 18:16:21 2009 +0100 | |
41 | +++ b/include/ircd_features.h Tue Feb 03 18:40:09 2009 +0100 | |
42 | @@ -105,6 +105,7 @@ | |
43 | /* features that affect all operators */ | |
44 | FEAT_EXTENDED_CHECKCMD, | |
45 | FEAT_CONFIG_OPERCMDS, | |
46 | + FEAT_OPKICK, | |
47 | FEAT_SETHOST, | |
48 | FEAT_SETHOST_USER, | |
49 | FEAT_SETHOST_AUTO, | |
50 | diff -r a77bd3d09dec include/msg.h | |
51 | --- a/include/msg.h Tue Feb 03 18:16:21 2009 +0100 | |
52 | +++ b/include/msg.h Tue Feb 03 18:40:09 2009 +0100 | |
53 | @@ -236,6 +236,10 @@ | |
54 | #define TOK_KICK "K" | |
55 | #define CMD_KICK MSG_KICK, TOK_KICK | |
56 | ||
57 | +#define MSG_OPKICK "OPKICK" /* OPKICK */ | |
58 | +#define TOK_OPKICK "OK" | |
59 | +#define CMD_OPKICK MSG_OPKICK, TOK_OPKICK | |
60 | + | |
61 | #define MSG_USERHOST "USERHOST" /* USER -> USRH */ | |
62 | #define TOK_USERHOST "USERHOST" | |
63 | #define CMD_USERHOST MSG_USERHOST, TOK_USERHOST | |
64 | diff -r a77bd3d09dec ircd/Makefile.in | |
65 | --- a/ircd/Makefile.in Tue Feb 03 18:16:21 2009 +0100 | |
66 | +++ b/ircd/Makefile.in Tue Feb 03 18:40:09 2009 +0100 | |
67 | @@ -151,6 +151,7 @@ | |
68 | m_nick.c \ | |
69 | m_notice.c \ | |
70 | m_oper.c \ | |
71 | + m_opkick.c \ | |
72 | m_opmode.c \ | |
73 | m_part.c \ | |
74 | m_pass.c \ | |
75 | @@ -884,6 +885,14 @@ | |
76 | ../include/ircd_features.h ../include/s_conf.h ../include/client.h \ | |
77 | ../include/s_debug.h ../include/s_user.h ../include/s_misc.h \ | |
78 | ../include/send.h | |
79 | +m_opkick.o: m_opkick.c ../config.h ../include/channel.h \ | |
80 | + ../include/ircd_defs.h ../include/res.h ../config.h ../include/client.h \ | |
81 | + ../include/dbuf.h ../include/msgq.h ../include/ircd_events.h \ | |
82 | + ../include/ircd_handler.h ../include/capab.h ../include/hash.h \ | |
83 | + ../include/ircd.h ../include/struct.h ../include/ircd_log.h \ | |
84 | + ../include/ircd_reply.h ../include/ircd_string.h \ | |
85 | + ../include/ircd_chattr.h ../include/msg.h ../include/numeric.h \ | |
86 | + ../include/numnicks.h ../include/send.h ../include/ircd_features.h | |
87 | m_opmode.o: m_opmode.c ../config.h ../include/client.h \ | |
88 | ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \ | |
89 | ../include/ircd_events.h ../config.h ../include/ircd_handler.h \ | |
90 | diff -r a77bd3d09dec ircd/client.c | |
91 | --- a/ircd/client.c Tue Feb 03 18:16:21 2009 +0100 | |
92 | +++ b/ircd/client.c Tue Feb 03 18:40:09 2009 +0100 | |
93 | @@ -174,6 +174,7 @@ | |
94 | FlagSet(&privs_local, PRIV_LOCAL_GLINE); | |
95 | FlagSet(&privs_local, PRIV_LOCAL_JUPE); | |
96 | FlagSet(&privs_local, PRIV_LOCAL_OPMODE); | |
97 | + FlagSet(&privs_local, PRIV_LOCAL_OPKICK); | |
98 | FlagSet(&privs_local, PRIV_WHOX); | |
99 | FlagSet(&privs_local, PRIV_DISPLAY); | |
100 | FlagSet(&privs_local, PRIV_FORCE_LOCAL_OPMODE); | |
101 | @@ -222,6 +223,7 @@ | |
102 | ClrPriv(client, PRIV_GLINE); | |
103 | ClrPriv(client, PRIV_JUPE); | |
104 | ClrPriv(client, PRIV_OPMODE); | |
105 | + ClrPriv(client, PRIV_OPKICK); | |
106 | ClrPriv(client, PRIV_BADCHAN); | |
107 | } | |
108 | } | |
109 | @@ -237,7 +239,8 @@ | |
110 | P(SHOW_INVIS), P(SHOW_ALL_INVIS), P(UNLIMIT_QUERY), P(KILL), | |
111 | P(LOCAL_KILL), P(REHASH), P(RESTART), P(DIE), | |
112 | P(GLINE), P(LOCAL_GLINE), P(JUPE), P(LOCAL_JUPE), | |
113 | - P(OPMODE), P(LOCAL_OPMODE), P(SET), P(WHOX), | |
114 | + P(OPMODE), P(LOCAL_OPMODE), P(OPKICK), P(LOCAL_OPKICK), | |
115 | + P(SET), P(WHOX), | |
116 | P(BADCHAN), P(LOCAL_BADCHAN), P(SEE_CHAN), P(PROPAGATE), | |
117 | P(DISPLAY), P(SEE_OPERS), P(WIDE_GLINE), P(LIST_CHAN), | |
118 | P(FORCE_OPMODE), P(FORCE_LOCAL_OPMODE), P(APASS_OPMODE), | |
119 | diff -r a77bd3d09dec ircd/ircd_features.c | |
120 | --- a/ircd/ircd_features.c Tue Feb 03 18:16:21 2009 +0100 | |
121 | +++ b/ircd/ircd_features.c Tue Feb 03 18:40:09 2009 +0100 | |
122 | @@ -359,6 +359,7 @@ | |
123 | /* features that affect all operators */ | |
124 | F_B(EXTENDED_CHECKCMD, 0, 0, 0), | |
125 | F_B(CONFIG_OPERCMDS, 0, 0, 0), | |
126 | + F_B(OPKICK, 0, 1, 0), | |
127 | F_B(SETHOST, 0, 0, 0), | |
128 | F_B(SETHOST_USER, 0, 0, 0), | |
129 | F_B(SETHOST_AUTO, 0, 0, 0), | |
130 | diff -r a77bd3d09dec ircd/ircd_lexer.l | |
131 | --- a/ircd/ircd_lexer.l Tue Feb 03 18:16:21 2009 +0100 | |
132 | +++ b/ircd/ircd_lexer.l Tue Feb 03 18:40:09 2009 +0100 | |
133 | @@ -132,11 +132,13 @@ | |
134 | { "local_jupe", TPRIV_LOCAL_JUPE }, | |
135 | { "local_kill", TPRIV_LOCAL_KILL }, | |
136 | { "local_opmode", TPRIV_LOCAL_OPMODE }, | |
137 | + { "local_opkick", TPRIV_LOCAL_OPKICK }, | |
138 | { "mb", MBYTES }, | |
139 | { "megabytes", MBYTES }, | |
140 | { "mode_lchan", TPRIV_MODE_LCHAN }, | |
141 | { "operator", OPER }, | |
142 | { "opmode", TPRIV_OPMODE }, | |
143 | + { "opkick", TPRIV_OPKICK }, | |
144 | { "password", PASS }, | |
145 | { "propagate", TPRIV_PROPAGATE }, | |
146 | { "realname", REAL }, | |
147 | diff -r a77bd3d09dec ircd/ircd_parser.y | |
148 | --- a/ircd/ircd_parser.y Tue Feb 03 18:16:21 2009 +0100 | |
149 | +++ b/ircd/ircd_parser.y Tue Feb 03 18:40:09 2009 +0100 | |
150 | @@ -182,7 +182,8 @@ | |
151 | %token TPRIV_CHAN_LIMIT TPRIV_MODE_LCHAN TPRIV_DEOP_LCHAN TPRIV_WALK_LCHAN | |
152 | %token TPRIV_LOCAL_KILL TPRIV_REHASH TPRIV_RESTART TPRIV_DIE | |
153 | %token TPRIV_GLINE TPRIV_LOCAL_GLINE TPRIV_LOCAL_JUPE TPRIV_LOCAL_BADCHAN | |
154 | -%token TPRIV_LOCAL_OPMODE TPRIV_OPMODE TPRIV_SET TPRIV_WHOX TPRIV_BADCHAN | |
155 | +%token TPRIV_LOCAL_OPMODE TPRIV_OPMODE TPRIV_LOCAL_OPKICK TPRIV_OPKICK | |
156 | +%token TPRIV_SET TPRIV_WHOX TPRIV_BADCHAN | |
157 | %token TPRIV_SEE_CHAN TPRIV_SHOW_INVIS TPRIV_SHOW_ALL_INVIS TPRIV_PROPAGATE | |
158 | %token TPRIV_UNLIMIT_QUERY TPRIV_DISPLAY TPRIV_SEE_OPERS TPRIV_WIDE_GLINE | |
159 | %token TPRIV_FORCE_OPMODE TPRIV_FORCE_LOCAL_OPMODE TPRIV_APASS_OPMODE | |
160 | @@ -672,6 +673,8 @@ | |
161 | TPRIV_LOCAL_JUPE { $$ = PRIV_LOCAL_JUPE; } | | |
162 | TPRIV_LOCAL_OPMODE { $$ = PRIV_LOCAL_OPMODE; } | | |
163 | TPRIV_OPMODE { $$ = PRIV_OPMODE; }| | |
164 | + TPRIV_LOCAL_OPKICK { $$ = PRIV_LOCAL_OPKICK; }| | |
165 | + TPRIV_OPKICK { $$ = PRIV_OPKICK; }| | |
166 | TPRIV_SET { $$ = PRIV_SET; } | | |
167 | TPRIV_WHOX { $$ = PRIV_WHOX; } | | |
168 | TPRIV_BADCHAN { $$ = PRIV_BADCHAN; } | | |
169 | diff -r a77bd3d09dec ircd/m_opkick.c | |
170 | --- /dev/null Thu Jan 01 00:00:00 1970 +0000 | |
171 | +++ b/ircd/m_opkick.c Tue Feb 03 18:40:09 2009 +0100 | |
172 | @@ -0,0 +1,231 @@ | |
173 | +/* | |
174 | + * IRC - Internet Relay Chat, ircd/m_opkick.c | |
175 | + * Copyright (C) 1990 Jarkko Oikarinen and | |
176 | + * University of Oulu, Computing Center | |
177 | + * | |
178 | + * See file AUTHORS in IRC package for additional names of | |
179 | + * the programmers. | |
180 | + * | |
181 | + * This program is free software; you can redistribute it and/or modify | |
182 | + * it under the terms of the GNU General Public License as published by | |
183 | + * the Free Software Foundation; either version 1, or (at your option) | |
184 | + * any later version. | |
185 | + * | |
186 | + * This program is distributed in the hope that it will be useful, | |
187 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
188 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
189 | + * GNU General Public License for more details. | |
190 | + * | |
191 | + * You should have received a copy of the GNU General Public License | |
192 | + * along with this program; if not, write to the Free Software | |
193 | + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
194 | + * | |
195 | + */ | |
196 | + | |
197 | +/* | |
198 | + * m_functions execute protocol messages on this server: | |
199 | + * | |
200 | + * cptr is always NON-NULL, pointing to a *LOCAL* client | |
201 | + * structure (with an open socket connected!). This | |
202 | + * identifies the physical socket where the message | |
203 | + * originated (or which caused the m_function to be | |
204 | + * executed--some m_functions may call others...). | |
205 | + * | |
206 | + * sptr is the source of the message, defined by the | |
207 | + * prefix part of the message if present. If not | |
208 | + * or prefix not found, then sptr==cptr. | |
209 | + * | |
210 | + * (!IsServer(cptr)) => (cptr == sptr), because | |
211 | + * prefixes are taken *only* from servers... | |
212 | + * | |
213 | + * (IsServer(cptr)) | |
214 | + * (sptr == cptr) => the message didn't | |
215 | + * have the prefix. | |
216 | + * | |
217 | + * (sptr != cptr && IsServer(sptr) means | |
218 | + * the prefix specified servername. (?) | |
219 | + * | |
220 | + * (sptr != cptr && !IsServer(sptr) means | |
221 | + * that message originated from a remote | |
222 | + * user (not local). | |
223 | + * | |
224 | + * combining | |
225 | + * | |
226 | + * (!IsServer(sptr)) means that, sptr can safely | |
227 | + * taken as defining the target structure of the | |
228 | + * message in this server. | |
229 | + * | |
230 | + * *Always* true (if 'parse' and others are working correct): | |
231 | + * | |
232 | + * 1) sptr->from == cptr (note: cptr->from == cptr) | |
233 | + * | |
234 | + * 2) MyConnect(sptr) <=> sptr == cptr (e.g. sptr | |
235 | + * *cannot* be a local connection, unless it's | |
236 | + * actually cptr!). [MyConnect(x) should probably | |
237 | + * be defined as (x == x->from) --msa ] | |
238 | + * | |
239 | + * parc number of variable parameter strings (if zero, | |
240 | + * parv is allowed to be NULL) | |
241 | + * | |
242 | + * parv a NULL terminated list of parameter pointers, | |
243 | + * | |
244 | + * parv[0], sender (prefix string), if not present | |
245 | + * this points to an empty string. | |
246 | + * parv[1]...parv[parc-1] | |
247 | + * pointers to additional parameters | |
248 | + * parv[parc] == NULL, *always* | |
249 | + * | |
250 | + * note: it is guaranteed that parv[0]..parv[parc-1] are all | |
251 | + * non-NULL pointers. | |
252 | + */ | |
253 | +#include "config.h" | |
254 | + | |
255 | +#include "channel.h" | |
256 | +#include "client.h" | |
257 | +#include "hash.h" | |
258 | +#include "ircd.h" | |
259 | +#include "ircd_log.h" | |
260 | +#include "ircd_reply.h" | |
261 | +#include "ircd_string.h" | |
262 | +#include "msg.h" | |
263 | +#include "numeric.h" | |
264 | +#include "numnicks.h" | |
265 | +#include "send.h" | |
266 | +#include "ircd_features.h" | |
267 | + | |
268 | +/* #include <assert.h> -- Now using assert in ircd_log.h */ | |
269 | + | |
270 | +/* | |
271 | + * mo_opkick - oper message handler | |
272 | + * | |
273 | + * parv[0] = sender prefix | |
274 | + * parv[1] = channel | |
275 | + * parv[2] = client to kick | |
276 | + * parv[parc-1] = kick comment | |
277 | + */ | |
278 | +int mo_opkick(struct Client *cptr, struct Client *sptr, int parc, char *parv[]) | |
279 | +{ | |
280 | + struct Client *who; | |
281 | + struct Channel *chptr; | |
282 | + struct Membership *member = 0; | |
283 | + struct Membership* member2; | |
284 | + char *name, *comment; | |
285 | + | |
286 | + ClrFlag(sptr, FLAG_TS8); | |
287 | + | |
288 | + if (!feature_bool(FEAT_OPKICK)) | |
289 | + return send_reply(sptr, ERR_DISABLED, "OPKICK"); | |
290 | + | |
291 | + if (parc < 3 || *parv[1] == '\0') | |
292 | + return need_more_params(sptr, "OPKICK"); | |
293 | + | |
294 | + name = parv[1]; | |
295 | + | |
296 | + /* simple checks */ | |
297 | + if (!(chptr = get_channel(sptr, name, CGT_NO_CREATE))) | |
298 | + return send_reply(sptr, ERR_NOSUCHCHANNEL, name); | |
299 | + | |
300 | + if (!HasPriv(sptr, IsLocalChannel(chptr->chname) ? PRIV_LOCAL_OPKICK : PRIV_OPKICK)) | |
301 | + return send_reply(sptr, ERR_NOPRIVILEGES); | |
302 | + | |
303 | + if (!(who = find_chasing(sptr, parv[2], 0, 1))) | |
304 | + return 0; /* find_chasing sends the reply for us */ | |
305 | + | |
306 | + /* Don't allow the channel service to be kicked */ | |
307 | + if (IsChannelService(who) && IsService(cli_user(who)->server)) | |
308 | + return send_reply(sptr, ERR_ISREALSERVICE, cli_name(who), chptr->chname); | |
309 | + | |
310 | + /* check if kicked user is actually on the channel */ | |
311 | + if (!(member = find_member_link(chptr, who)) || IsZombie(member)) | |
312 | + return send_reply(sptr, ERR_USERNOTINCHANNEL, cli_name(who), chptr->chname); | |
313 | + | |
314 | + /* We rely on ircd_snprintf to truncate the comment */ | |
315 | + comment = EmptyString(parv[parc - 1]) ? parv[2] : parv[parc - 1]; | |
316 | + | |
317 | + /* propagate it */ | |
318 | + if (!IsLocalChannel(name)) | |
319 | + sendcmdto_serv_butone(sptr, CMD_OPKICK, cptr, "%H %C :%s", chptr, who, comment); | |
320 | + | |
321 | + /* If it's a delayed join, only send the KICK to the person doing | |
322 | + * the kicking and the victim | |
323 | + */ | |
324 | + if (IsDelayedJoin(member)) { | |
325 | + if (MyUser(who)) | |
326 | + sendcmdto_one(feature_bool(FEAT_HIS_MODEWHO) ? &his : sptr, CMD_KICK, who, "%H %C :%s", chptr, who, comment); | |
327 | + /* operator using OPKICK is on the channel */ | |
328 | + if ((member2 = find_member_link(chptr, sptr)) && !IsZombie(member2)) { | |
329 | + sendcmdto_one(who, CMD_JOIN, sptr, "%H", chptr); | |
330 | + sendcmdto_one(feature_bool(FEAT_HIS_MODEWHO) ? &his : sptr, CMD_KICK, sptr, "%H %C :%s", chptr, who, comment); | |
331 | + } | |
332 | + CheckDelayedJoins(chptr); | |
333 | + } else | |
334 | + sendcmdto_channel_butserv_butone(feature_bool(FEAT_HIS_MODEWHO) ? &his : sptr, | |
335 | + CMD_KICK, chptr, NULL, 0, "%H %C :%s", chptr, who, comment); | |
336 | + | |
337 | + /* Send HACK notice and log it */ | |
338 | + sendto_opmask_butone(0, SNO_HACK4, "HACK(4): %C KICK %H %C %s", sptr, chptr, who, comment); | |
339 | + log_write(LS_OPERMODE, L_INFO, LOG_NOSNOTICE, "%#C OPKICK %H %C %s", sptr, chptr, who, comment); | |
340 | + | |
341 | + make_zombie(member, who, cptr, sptr, chptr); | |
342 | + | |
343 | + return 0; | |
344 | +} | |
345 | + | |
346 | +/* | |
347 | + * ms_opkick - server message handler | |
348 | + * | |
349 | + * parv[0] = sender prefix | |
350 | + * parv[1] = channel | |
351 | + * parv[2] = client to kick | |
352 | + * parv[parc-1] = kick comment | |
353 | + */ | |
354 | +int ms_opkick(struct Client *cptr, struct Client *sptr, int parc, char *parv[]) | |
355 | +{ | |
356 | + struct Client *who; | |
357 | + struct Channel *chptr; | |
358 | + struct Membership *member = 0; | |
359 | + char *name, *comment; | |
360 | + | |
361 | + ClrFlag(sptr, FLAG_TS8); | |
362 | + | |
363 | + if (parc < 3 || *parv[1] == '\0') | |
364 | + return need_more_params(sptr, "OPKICK"); | |
365 | + | |
366 | + name = parv[1]; | |
367 | + comment = parv[parc - 1]; | |
368 | + | |
369 | + /* figure out who gets kicked from what */ | |
370 | + if (IsLocalChannel(name) || | |
371 | + !(chptr = get_channel(sptr, name, CGT_NO_CREATE)) || | |
372 | + !(who = findNUser(parv[2]))) | |
373 | + return 0; | |
374 | + | |
375 | + /* We go ahead and pass on the KICK for users not on the channel */ | |
376 | + if (!(member = find_member_link(chptr, who)) || IsZombie(member)) { | |
377 | + if (member) { | |
378 | + make_zombie(member, who, cptr, sptr, chptr); | |
379 | + member=0; | |
380 | + } | |
381 | + } | |
382 | + | |
383 | + /* Propagate kick... */ | |
384 | + sendcmdto_serv_butone(sptr, CMD_OPKICK, cptr, "%H %C :%s", chptr, who, comment); | |
385 | + | |
386 | + if (member) { /* and tell the channel about it */ | |
387 | + if (IsDelayedJoin(member)) { | |
388 | + if (MyUser(who)) | |
389 | + sendcmdto_one((IsServer(sptr) || feature_bool(FEAT_HIS_MODEWHO)) ? &his : sptr, | |
390 | + CMD_KICK, who, "%H %C :%s", chptr, who, comment); | |
391 | + } else { | |
392 | + sendcmdto_channel_butserv_butone((IsServer(sptr) || feature_bool(FEAT_HIS_MODEWHO)) ? &his : sptr, | |
393 | + CMD_KICK, chptr, NULL, 0, "%H %C :%s", chptr, who, comment); | |
394 | + } | |
395 | + | |
396 | + /* Send HACK notice and log it */ | |
397 | + sendto_opmask_butone(0, SNO_HACK4, "HACK(4): %C KICK %H %C %s", sptr, chptr, who, comment); | |
398 | + log_write(LS_OPERMODE, L_INFO, LOG_NOSNOTICE, "%#C OPKICK %H %C %s", sptr, chptr, who, comment); | |
399 | + | |
400 | + make_zombie(member, who, cptr, sptr, chptr); | |
401 | + } | |
402 | + return 0; | |
403 | +} | |
404 | diff -r a77bd3d09dec ircd/parse.c | |
405 | --- a/ircd/parse.c Tue Feb 03 18:16:21 2009 +0100 | |
406 | +++ b/ircd/parse.c Tue Feb 03 18:40:09 2009 +0100 | |
407 | @@ -656,6 +656,17 @@ | |
408 | 0, MAXPARA, MFLG_SLOW, 0, NULL, | |
409 | { m_unregistered, m_not_oper, m_check, m_check, m_ignore } | |
410 | }, | |
411 | + | |
412 | + /* | |
413 | + * Add the command for OPKICK. | |
414 | + */ | |
415 | + { | |
416 | + MSG_OPKICK, | |
417 | + TOK_OPKICK, | |
418 | + 0, MAXPARA, MFLG_SLOW, 0, NULL, | |
419 | + /* UNREG, CLIENT, SERVER, OPER, SERVICE */ | |
420 | + { m_unregistered, m_not_oper, ms_opkick, mo_opkick, m_ignore } | |
421 | + }, | |
422 | ||
423 | /* This command is an alias for QUIT during the unregistered part of | |
424 | * of the server. This is because someone jumping via a broken web |