X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_spanningtree.cpp;h=654c524420f219f7fa877b926c398aa05ac41414;hb=bdbd4f41a8c00539507b210be07f14baf88b6114;hp=302d963b175641ca5955186b58839031c0b59226;hpb=136304ecccaf7856ad7a71f3af0e25d4264c182a;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_spanningtree.cpp b/src/modules/m_spanningtree.cpp index 302d963b1..654c52442 100644 --- a/src/modules/m_spanningtree.cpp +++ b/src/modules/m_spanningtree.cpp @@ -114,6 +114,8 @@ void ReadConfiguration(bool rebind); bool FlatLinks; /* Hide U-Lined servers in /MAP and /LINKS */ bool HideULines; +/* Announce TS changes to channels on merge */ +bool AnnounceTSChange; std::vector ValidIPs; @@ -1147,6 +1149,9 @@ class TreeSocket : public InspSocket { ourTS = chan->age; } + else + /* Oops, channel doesnt exist! */ + return true; } /* TS is equal: Merge the mode changes, use voooodoooooo on modes @@ -1603,7 +1608,10 @@ class TreeSocket : public InspSocket if (chan) chan->age = TS; - /* XXX: Lower the TS here */ + /* Lower the TS here */ + if (AnnounceTSChange && chan) + chan->WriteChannelWithServ(Instance->Config->ServerName, + "TS for %s changed from %lu to %lu", chan->name, ourTS, TS); ourTS = TS; param_list.push_back(channel); @@ -1818,6 +1826,7 @@ class TreeSocket : public InspSocket // nick collision Instance->Log(DEBUG,"Nick collision on %s!%s@%s: %lu %lu",tempnick,params[4].c_str(),params[2].c_str(),(unsigned long)age,(unsigned long)iter->second->age); this->WriteLine(std::string(":")+this->Instance->Config->ServerName+" KILL "+tempnick+" :Nickname collision"); + userrec::QuitUser(this->Instance, iter->second, "Nickname collision"); return true; } @@ -2080,14 +2089,12 @@ class TreeSocket : public InspSocket char result[1024]; memset(result,0,1024); memset(out,0,1024); - Instance->Log(DEBUG,"Original string '%s'",ret.c_str()); /* ERROR + CAPAB is still allowed unencryped */ if ((ret.substr(0,7) != "ERROR :") && (ret.substr(0,6) != "CAPAB ")) { int nbytes = from64tobits(out, ret.c_str(), 1024); if ((nbytes > 0) && (nbytes < 1024)) { - Instance->Log(DEBUG,"m_spanningtree: decrypt %d bytes",nbytes); ctx_in->Decrypt(out, result, nbytes, 0); for (int t = 0; t < nbytes; t++) if (result[t] == '\7') result[t] = 0; @@ -2121,16 +2128,12 @@ class TreeSocket : public InspSocket // pad it to the key length int n = this->keylength - (line.length() % this->keylength); if (n) - { - Instance->Log(DEBUG,"Append %d chars to line to make it %d long from %d, key length %d",n,n+line.length(),line.length(),this->keylength); line.append(n,'\7'); - } } unsigned int ll = line.length(); ctx_out->Encrypt(line.c_str(), result, ll, 0); to64frombits((unsigned char*)result64,(unsigned char*)result,ll); line = result64; - //int from64tobits(char *out, const char *in, int maxlen); } return this->Write(line + "\r\n"); } @@ -3726,9 +3729,10 @@ void ReadConfiguration(bool rebind) { std::string Type = Conf->ReadValue("bind","type",j); std::string IP = Conf->ReadValue("bind","address",j); - long Port = Conf->ReadInteger("bind","port",j,true); + int Port = Conf->ReadInteger("bind","port",j,true); if (Type == "servers") { + ServerInstance->Log(DEBUG,"m_spanningtree: Binding server port %s:%d", IP.c_str(), Port); if (IP == "*") { IP = ""; @@ -3736,6 +3740,7 @@ void ReadConfiguration(bool rebind) TreeSocket* listener = new TreeSocket(ServerInstance, IP.c_str(),Port,true,10); if (listener->GetState() == I_LISTENING) { + ServerInstance->Log(DEFAULT,"m_spanningtree: Binding server port %s:%d successful!", IP.c_str(), Port); Bindings.push_back(listener); } else @@ -3744,11 +3749,13 @@ void ReadConfiguration(bool rebind) listener->Close(); DELETE(listener); } + ServerInstance->Log(DEBUG,"Done with this binding"); } } } FlatLinks = Conf->ReadFlag("options","flatlinks",0); HideULines = Conf->ReadFlag("options","hideulines",0); + AnnounceTSChange = Conf->ReadFlag("options","announcets",0); LinkBlocks.clear(); ValidIPs.clear(); for (int j =0; j < Conf->Enumerate("link"); j++) @@ -3828,7 +3835,6 @@ void ReadConfiguration(bool rebind) class ModuleSpanningTree : public Module { - std::vector Bindings; int line; int NumServers; unsigned int max_local; @@ -4987,11 +4993,33 @@ class ModuleSpanningTree : public Module virtual ~ModuleSpanningTree() { + ServerInstance->Log(DEBUG,"Performing unload of spanningtree!"); + ServerInstance->Log(DEBUG,"Freeing %d bindings...",Bindings.size()); + for (unsigned int i = 0; i < Bindings.size(); i++) + { + ServerInstance->Log(DEBUG,"Freeing binding %d of %d",i, Bindings.size()); + ServerInstance->SE->DelFd(Bindings[i]); + Bindings[i]->Close(); + DELETE(Bindings[i]); + } + ServerInstance->Log(DEBUG,"Freeing connected servers..."); + while (TreeRoot->ChildCount()) + { + TreeServer* child_server = TreeRoot->GetChild(0); + ServerInstance->Log(DEBUG,"Freeing connected server %s", child_server->GetName().c_str()); + if (child_server) + { + TreeSocket* sock = child_server->GetSocket(); + ServerInstance->SE->DelFd(sock); + sock->Close(); + DELETE(sock); + } + } } virtual Version GetVersion() { - return Version(1,1,0,2,VF_STATIC|VF_VENDOR,API_VERSION); + return Version(1,1,0,2,VF_VENDOR,API_VERSION); } void Implements(char* List)