+ void ConnectServer(Link* x)
+ {
+ insp_inaddr binip;
+
+ /* Do we already have an IP? If so, no need to resolve it. */
+ if (insp_aton(x->IPAddr.c_str(), &binip) > 0)
+ {
+ TreeSocket* newsocket = new TreeSocket(ServerInstance, x->IPAddr,x->Port,false,10,x->Name.c_str());
+ if (newsocket->GetFd() > -1)
+ {
+ /* Handled automatically on success */
+ }
+ else
+ {
+ ServerInstance->SNO->WriteToSnoMask('l',"CONNECT: Error connecting \002%s\002: %s.",x->Name.c_str(),strerror(errno));
+ delete newsocket;
+ this->DoFailOver(x);
+ }
+ }
+ else
+ {
+ try
+ {
+ ServernameResolver* snr = new ServernameResolver(ServerInstance,x->IPAddr, *x);
+ ServerInstance->AddResolver(snr);
+ }
+ catch (ModuleException& e)
+ {
+ ServerInstance->Log(DEBUG,"Error in resolver: %s",e.GetReason());
+ this->DoFailOver(x);
+ }
+ }
+ }
+
+ void DoFailOver(Link* x)
+ {
+ if (x->FailOver.length())
+ {
+ if (x->FailOver == x->Name)
+ {
+ ServerInstance->SNO->WriteToSnoMask('l',"FAILOVER: Some muppet configured the failover for server \002%s\002 to point at itself. Not following it!", x->Name.c_str());
+ return;
+ }
+ Link* TryThisOne = this->FindLink(x->FailOver.c_str());
+ if (TryThisOne)
+ {
+ ServerInstance->SNO->WriteToSnoMask('l',"FAILOVER: Trying failover link for \002%s\002: \002%s\002...", x->Name.c_str(), TryThisOne->Name.c_str());
+ ConnectServer(TryThisOne);
+ }
+ else
+ {
+ ServerInstance->SNO->WriteToSnoMask('l',"FAILOVER: Invalid failover server specified for server \002%s\002, will not follow!", x->Name.c_str());
+ }
+ }
+ }
+
+ Link* FindLink(const std::string& name)
+ {
+ for (std::vector<Link>::iterator x = LinkBlocks.begin(); x < LinkBlocks.end(); x++)
+ {
+ if (ServerInstance->MatchText(x->Name.c_str(), name.c_str()))
+ {
+ return &(*x);
+ }
+ }
+ return NULL;
+ }
+