From bcedd14069ecbce7f2884afcf58b7371f3e7196f Mon Sep 17 00:00:00 2001 From: brain Date: Fri, 16 Apr 2004 15:23:47 +0000 Subject: [PATCH] Fixed some SQUIT stuff git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@621 e03df62e-2008-0410-955e-edbf42e46eb7 --- include/inspircd.h | 1 + src/connection.cpp | 1 + src/inspircd.cpp | 47 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/include/inspircd.h b/include/inspircd.h index f0e92782b..36d902fbf 100644 --- a/include/inspircd.h +++ b/include/inspircd.h @@ -125,4 +125,5 @@ void NetSendToAllAlive(char* s); void NetSendToOne(char* target,char* s); void NetSendToAllExcept(const char* target,char* s); void NetSendMyRoutingTable(); +void DoSplit(const char* params); diff --git a/src/connection.cpp b/src/connection.cpp index 20695e873..514897ecb 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -364,6 +364,7 @@ bool connection::SendPacket(char *message, const char* host) snprintf(buffer,MAXBUF,"& %s",host); NetSendToAllExcept(host,buffer); log(DEBUG,"There are no routes to %s, we're gonna boot the server off!",host); + DoSplit(host); return false; } diff --git a/src/inspircd.cpp b/src/inspircd.cpp index 55a38a353..0aadf62ea 100644 --- a/src/inspircd.cpp +++ b/src/inspircd.cpp @@ -6560,6 +6560,53 @@ void handle_dollar(char token,char* params,serverrec* source,serverrec* reply, c log(DEBUG,"Warning! routing table received from nonexistent server!"); } + +void DoSplit(const char* params) +{ + bool go_again = true; + while (go_again) + { + go_again = false; + for (int i = 0; i < 32; i++) + { + if (me[i] != NULL) + { + for (vector::iterator j = me[i]->connectors.begin(); j != me[i]->connectors.end(); j++) + { + if (!strcasecmp(j->GetServerName().c_str(),params)) + { + j->routes.clear(); + j->CloseConnection(); + me[i]->connectors.erase(j); + go_again = true; + break; + } + } + } + } + } + log(DEBUG,"Removed server. Will remove clients..."); + // iterate through the userlist and remove all users on this server. + // because we're dealing with a mesh, we dont have to deal with anything + // "down-route" from this server (nice huh) + go_again = true; + char reason[MAXBUF]; + snprintf(reason,MAXBUF,"%s %s",ServerName,params); + while (go_again) + { + go_again = false; + for (user_hash::const_iterator u = clientlist.begin(); u != clientlist.end(); u++) + { + if (!strcasecmp(u->second->server,params)) + { + kill_link(u->second,reason); + go_again = true; + break; + } + } + } +} + void handle_amp(char token,char* params,serverrec* source,serverrec* reply, char* udp_host) { log(DEBUG,"Netsplit! %s split from mesh, removing!",params); -- 2.39.2