Module: ngircd.git Branch: master Commit: 2798a12444bce91613388ceb7ab52d1e97787687 URL: http://ngircd.barton.de/cgi-bin/gitweb.cgi?p=ngircd.git&a=commit;h=2798a...
Author: Alexander Barton alex@barton.de Date: Tue Oct 1 12:09:59 2013 +0200
Actually KILL clients on GLINE/KLINE
Kill all clients that match a new GLINE/KLINE mask and genrate apropriate KILL commands. These KILL commands can be superfluous, but are required when the IRC Operator isn't allowd to set remote G-Lines or if there are older servers in the network that don't kill clients on GLINE/KLINE.
Closes bug #156.
---
src/ngircd/irc-oper.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-)
diff --git a/src/ngircd/irc-oper.c b/src/ngircd/irc-oper.c index 74f17cc..4ccc76a 100644 --- a/src/ngircd/irc-oper.c +++ b/src/ngircd/irc-oper.c @@ -28,12 +28,14 @@ #include "conf.h" #include "channel.h" #include "class.h" +#include "parse.h" +#include "irc.h" #include "irc-macros.h" #include "irc-write.h" +#include "lists.h" #include "log.h" #include "match.h" #include "messages.h" -#include "parse.h" #include "op.h"
#include <exp.h> @@ -384,9 +386,10 @@ IRC_WALLOPS( CLIENT *Client, REQUEST *Req ) GLOBAL bool IRC_xLINE(CLIENT *Client, REQUEST *Req) { - CLIENT *from; + CLIENT *from, *c, *c_next; + char reason[COMMAND_LEN], class_c; + struct list_head *list; int class; - char class_c;
assert(Client != NULL); assert(Req != NULL); @@ -446,6 +449,20 @@ IRC_xLINE(CLIENT *Client, REQUEST *Req) Req->argv[0], Req->argv[1], Req->argv[2]); } + + /* Check currently connected clients */ + snprintf(reason, sizeof(reason), "%c-Line by "%s": "%s"", + class_c, Client_ID(from), Req->argv[2]); + list = Class_GetList(class); + c = Client_First(); + while (c) { + c_next = Client_Next(c); + if ((class == CLASS_GLINE || Client_Conn(c) > NONE) + && Lists_Check(list, c)) + IRC_KillClient(Client, NULL, + Client_ID(c), reason); + c = c_next; + } } }