From 956328e80741c88cdae6d98b07be4171c98f4e26 Mon Sep 17 00:00:00 2001 From: brain Date: Mon, 30 May 2005 05:23:22 +0000 Subject: Added docs for base: BoolSet git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@1565 e03df62e-2008-0410-955e-edbf42e46eb7 --- docs/module-doc/classserverrec.html | 501 ++++++++++++++++++++---------------- 1 file changed, 272 insertions(+), 229 deletions(-) (limited to 'docs/module-doc/classserverrec.html') diff --git a/docs/module-doc/classserverrec.html b/docs/module-doc/classserverrec.html index 4eab4d420..87775403b 100644 --- a/docs/module-doc/classserverrec.html +++ b/docs/module-doc/classserverrec.html @@ -384,7 +384,7 @@ Begin an outbound link to another ircd at targethost.

Definition at line 142 of file servers.cpp.

-References connectors, connection::fd, FindHost(), ircd_connector::MakeOutboundConnection(), SendPacket(), ircd_connector::SetHostAndPort(), ircd_connector::SetServerName(), ircd_connector::SetState(), STATE_DISCONNECTED, and STATE_NOAUTH_OUTBOUND. +References connectors, connection::fd, FindHost(), ircd_connector::MakeOutboundConnection(), SendPacket(), ircd_connector::SetHostAndPort(), ircd_connector::SetServerName(), ircd_connector::SetState(), STATE_DISCONNECTED, and STATE_NOAUTH_OUTBOUND.

00143 {
 00144         char connect[MAXBUF];
@@ -564,7 +564,7 @@ Definition at line 242
 

References connectors.

-Referenced by BeginLink(), IsRoutable(), and SendPacket(). +Referenced by BeginLink(), and SendPacket().

00243 {
 00244         for (int i = 0; i < this->connectors.size(); i++)
@@ -608,60 +608,84 @@ Flushes all data waiting to be written for all of this server's connections.
 

-Definition at line 284 of file servers.cpp. +Definition at line 274 of file servers.cpp.

References connectors, has_been_netsplit, IsRoutable(), STATE_DISCONNECTED, STATE_NOAUTH_INBOUND, STATE_NOAUTH_OUTBOUND, and TIME.

-

00285 {
-00286         for (int i = 0; i < this->connectors.size(); i++)
-00287         {
-00288                 // don't try and ping a NOAUTH_OUTBOUND state, its not authed yet!
-00289                 if ((this->connectors[i].GetState() == STATE_NOAUTH_OUTBOUND) && (TIME > this->connectors[i].age+30))
+
00275 {
+00276         char buffer[MAXBUF];
+00277         for (int i = 0; i < this->connectors.size(); i++)
+00278         {
+00279                 // don't try and ping a NOAUTH_OUTBOUND state, its not authed yet!
+00280                 if ((this->connectors[i].GetState() == STATE_NOAUTH_OUTBOUND) && (TIME > this->connectors[i].age+30))
+00281                 {
+00282                         // however if we reach this timer its connected timed out :)
+00283                         WriteOpers("*** Connection to %s timed out",this->connectors[i].GetServerName().c_str());
+00284                         snprintf(buffer,MAXBUF,"& %s",this->connectors[i].GetServerName().c_str());
+00285                         NetSendToAllExcept(this->connectors[i].GetServerName().c_str(),buffer);
+00286                         DoSplit(this->connectors[i].GetServerName().c_str());
+00287                         return;
+00288                 }
+00289                 if ((this->connectors[i].GetState() == STATE_NOAUTH_INBOUND) && (TIME > this->connectors[i].age+30))
 00290                 {
-00291                         // however if we reach this timer its connected timed out :)
-00292                         WriteOpers("*** Connection to %s timed out",this->connectors[i].GetServerName().c_str());
-00293                         DoSplit(this->connectors[i].GetServerName().c_str());
-00294                         return;
-00295                 }
-00296                 else if ((this->connectors[i].GetState() == STATE_NOAUTH_INBOUND) && (TIME > this->connectors[i].age+30))
-00297                 {
-00298                         WriteOpers("*** Connection from %s timed out",this->connectors[i].GetServerName().c_str());
-00299                         DoSplit(this->connectors[i].GetServerName().c_str());
-00300                         return;
-00301                 }
-00302                 else if (this->connectors[i].GetState() != STATE_DISCONNECTED)
-00303                 {
-00304                         if (!this->connectors[i].CheckPing())
-00305                         {
-00306                                 WriteOpers("*** Lost single connection to %s: Ping timeout",this->connectors[i].GetServerName().c_str());
-00307                                 this->connectors[i].CloseConnection();
-00308                                 this->connectors[i].SetState(STATE_DISCONNECTED);
-00309                                 if (!IsRoutable(this->connectors[i].GetServerName()))
-00310                                 {
-00311                                         WriteOpers("*** Server %s is no longer routable, disconnecting.",this->connectors[i].GetServerName().c_str());
-00312                                         DoSplit(this->connectors[i].GetServerName().c_str());
-00313                                 }
-00314                                 has_been_netsplit = true;
-00315                         }
-00316                 }
-00317                 if (this->connectors[i].HasBufferedOutput())
-00318                 {
-00319                         if (!this->connectors[i].FlushWriteBuf())
-00320                         {
-00321                                 // if we're here the write() caused an error, we cannot proceed
-00322                                 WriteOpers("*** Lost single connection to %s, link inactive and retrying: %s",this->connectors[i].GetServerName().c_str(),this->connectors[i].GetWriteError().c_str());
-00323                                 this->connectors[i].CloseConnection();
-00324                                 this->connectors[i].SetState(STATE_DISCONNECTED);
-00325                                 if (!IsRoutable(this->connectors[i].GetServerName()))
-00326                                 {
-00327                                         WriteOpers("*** Server %s is no longer routable, disconnecting.",this->connectors[i].GetServerName().c_str());
-00328                                         DoSplit(this->connectors[i].GetServerName().c_str());
-00329                                 }
-00330                                 has_been_netsplit = true;
-00331                         }
-00332                 }
-00333         }
-00334 }
+00291                         WriteOpers("*** Connection from %s timed out",this->connectors[i].GetServerName().c_str());
+00292                         snprintf(buffer,MAXBUF,"& %s",this->connectors[i].GetServerName().c_str());
+00293                         NetSendToAllExcept(this->connectors[i].GetServerName().c_str(),buffer);
+00294                         DoSplit(this->connectors[i].GetServerName().c_str());
+00295                         return;
+00296                 }
+00297                 if (this->connectors[i].GetState() != STATE_DISCONNECTED)
+00298                 {
+00299                         if (!this->connectors[i].CheckPing())
+00300                         {
+00301                                 WriteOpers("*** Lost single connection to %s: Ping timeout",this->connectors[i].GetServerName().c_str());
+00302                                 this->connectors[i].CloseConnection();
+00303                                 this->connectors[i].SetState(STATE_DISCONNECTED);
+00304                                 if (!IsRoutable(this->connectors[i].GetServerName()))
+00305                                 {
+00306                                         WriteOpers("*** Server %s is no longer routable, disconnecting.",this->connectors[i].GetServerName().c_str());
+00307                                         snprintf(buffer,MAXBUF,"& %s",this->connectors[i].GetServerName().c_str());
+00308                                         NetSendToAllExcept(this->connectors[i].GetServerName().c_str(),buffer);
+00309                                         DoSplit(this->connectors[i].GetServerName().c_str());
+00310                                 }
+00311                                 has_been_netsplit = true;
+00312                         }
+00313                 }
+00314                 if ((this->connectors[i].GetWriteError() !="") && (this->connectors[i].GetState() != STATE_DISCONNECTED))
+00315                 {
+00316                         // if we're here the write() caused an error, we cannot proceed
+00317                         WriteOpers("*** Lost single connection to %s, link inactive and retrying: %s",this->connectors[i].GetServerName().c_str(),this->connectors[i].GetWriteError().c_str());
+00318                         this->connectors[i].CloseConnection();
+00319                         this->connectors[i].SetState(STATE_DISCONNECTED);
+00320                         if (!IsRoutable(this->connectors[i].GetServerName()))
+00321                         {
+00322                                 WriteOpers("*** Server %s is no longer routable, disconnecting.",this->connectors[i].GetServerName().c_str());
+00323                                 snprintf(buffer,MAXBUF,"& %s",this->connectors[i].GetServerName().c_str());
+00324                                 NetSendToAllExcept(this->connectors[i].GetServerName().c_str(),buffer);
+00325                                 DoSplit(this->connectors[i].GetServerName().c_str());
+00326                         }
+00327                         has_been_netsplit = true;
+00328                 }
+00329                 if ((this->connectors[i].HasBufferedOutput()) && (this->connectors[i].GetState() != STATE_DISCONNECTED))
+00330                 {
+00331                         if (!this->connectors[i].FlushWriteBuf())
+00332                         {
+00333                                 // if we're here the write() caused an error, we cannot proceed
+00334                                 WriteOpers("*** Lost single connection to %s, link inactive and retrying: %s",this->connectors[i].GetServerName().c_str(),this->connectors[i].GetWriteError().c_str());
+00335                                 this->connectors[i].CloseConnection();
+00336                                 this->connectors[i].SetState(STATE_DISCONNECTED);
+00337                                 if (!IsRoutable(this->connectors[i].GetServerName()))
+00338                                 {
+00339                                         WriteOpers("*** Server %s is no longer routable, disconnecting.",this->connectors[i].GetServerName().c_str());
+00340                                         snprintf(buffer,MAXBUF,"& %s",this->connectors[i].GetServerName().c_str());
+00341                                         NetSendToAllExcept(this->connectors[i].GetServerName().c_str(),buffer);
+00342                                         DoSplit(this->connectors[i].GetServerName().c_str());
+00343                                 }
+00344                                 has_been_netsplit = true;
+00345                         }
+00346                 }
+00347         }
+00348 }
 
@@ -718,7 +742,7 @@ Begin an outbound mesh link to another ircd on a network you are already an auth

Definition at line 182 of file servers.cpp.

-References connectors, connection::fd, ircd_connector::MakeOutboundConnection(), SendPacket(), ircd_connector::SetHostAndPort(), ircd_connector::SetServerName(), ircd_connector::SetState(), STATE_DISCONNECTED, and STATE_NOAUTH_OUTBOUND. +References connectors, connection::fd, ircd_connector::MakeOutboundConnection(), SendPacket(), ircd_connector::SetHostAndPort(), ircd_connector::SetServerName(), ircd_connector::SetState(), STATE_DISCONNECTED, and STATE_NOAUTH_OUTBOUND.

00183 {
 00184         char connect[MAXBUF];
@@ -796,107 +820,126 @@ Returns the next available packet and returns true if data is available.
 

Writes the servername the data came from to 'host'. If no data is available this function returns false. This function will automatically close broken links and reroute pathways, generating split messages on the network.

-Definition at line 431 of file servers.cpp. -

-References already_have_sum(), connectors, DEBUG, has_been_netsplit, IsRoutable(), and STATE_DISCONNECTED. -

-

00432 {
-00433         char data[65536];
-00434         memset(data, 0, 65536);
-00435         for (int i = 0; i < this->connectors.size(); i++)
-00436         {
-00437                 if (this->connectors[i].GetState() != STATE_DISCONNECTED)
-00438                 {
-00439                         // returns false if the packet could not be sent (e.g. target host down)
-00440                         int rcvsize = 0;
-00441 
-00442                         // check if theres any data on this socket
-00443                         // if not, continue onwards to the next.
-00444                         pollfd polls;
-00445                         polls.fd = this->connectors[i].GetDescriptor();
-00446                         polls.events = POLLIN;
-00447                         int ret = poll(&polls,1,1);
-00448                         if (ret <= 0) continue;
-00449 
-00450                         rcvsize = recv(this->connectors[i].GetDescriptor(),data,65000,0);
-00451                         data[rcvsize] = '\0';
-00452                         if (rcvsize == -1)
-00453                         {
-00454                                 if (errno != EAGAIN)
-00455                                 {
-00456                                         log(DEBUG,"recv() failed for serverrec::RecvPacket(): %s",strerror(errno));
-00457                                         log(DEBUG,"Disabling connector: %s",this->connectors[i].GetServerName().c_str());
-00458                                         this->connectors[i].CloseConnection();
-00459                                         this->connectors[i].SetState(STATE_DISCONNECTED);
-00460                                         if (!IsRoutable(this->connectors[i].GetServerName()))
-00461                                         {
-00462                                                 WriteOpers("*** Server %s is no longer routable, disconnecting.",this->connectors[i].GetServerName().c_str());
-00463                                                 DoSplit(this->connectors[i].GetServerName().c_str());
-00464                                         }
-00465                                         has_been_netsplit = true;
-00466                                 }
-00467                         }
-00468                         int pushed = 0;
-00469                         if (rcvsize > 0)
-00470                         {
-00471                                 if (!this->connectors[i].AddBuffer(data))
-00472                                 {
-00473                                         WriteOpers("*** Read buffer for %s exceeds maximum, closing connection!",this->connectors[i].GetServerName().c_str());
-00474                                         this->connectors[i].CloseConnection();
-00475                                         this->connectors[i].SetState(STATE_DISCONNECTED);
-00476                                         if (!IsRoutable(this->connectors[i].GetServerName()))
-00477                                         {
-00478                                                 WriteOpers("*** Server %s is no longer routable, disconnecting.",this->connectors[i].GetServerName().c_str());
-00479                                                 DoSplit(this->connectors[i].GetServerName().c_str());
-00480                                         }
-00481                                         has_been_netsplit = true;
-00482                                 }
-00483                                 if (this->connectors[i].BufferIsComplete())
+Definition at line 445 of file servers.cpp.
+

+References already_have_sum(), connectors, DEBUG, has_been_netsplit, IsRoutable(), and STATE_DISCONNECTED. +

+

00446 {
+00447         char data[65536],buffer[MAXBUF];
+00448         memset(data, 0, 65536);
+00449         for (int i = 0; i < this->connectors.size(); i++)
+00450         {
+00451                 if (this->connectors[i].GetState() != STATE_DISCONNECTED)
+00452                 {
+00453                         // returns false if the packet could not be sent (e.g. target host down)
+00454                         int rcvsize = 0;
+00455 
+00456                         // check if theres any data on this socket
+00457                         // if not, continue onwards to the next.
+00458                         pollfd polls;
+00459                         polls.fd = this->connectors[i].GetDescriptor();
+00460                         polls.events = POLLIN;
+00461                         int ret = poll(&polls,1,1);
+00462                         if (ret <= 0) continue;
+00463 
+00464                         rcvsize = recv(this->connectors[i].GetDescriptor(),data,65000,0);
+00465                         data[rcvsize] = '\0';
+00466                         if (rcvsize == 0)
+00467                         {
+00468                                 log(DEBUG,"recv() failed for serverrec::RecvPacket(): EOF");
+00469                                 log(DEBUG,"Disabling connector: %s",this->connectors[i].GetServerName().c_str());
+00470                                 this->connectors[i].CloseConnection();
+00471                                 this->connectors[i].SetState(STATE_DISCONNECTED);
+00472                                 if (!IsRoutable(this->connectors[i].GetServerName()))
+00473                                 {
+00474                                         WriteOpers("*** Server %s is no longer routable, disconnecting (EOF)",this->connectors[i].GetServerName().c_str());
+00475                                         snprintf(buffer,MAXBUF,"& %s",this->connectors[i].GetServerName().c_str());
+00476                                         NetSendToAllExcept(this->connectors[i].GetServerName().c_str(),buffer);
+00477                                         DoSplit(this->connectors[i].GetServerName().c_str());
+00478                                 }
+00479                                 has_been_netsplit = true;
+00480                         }
+00481                         if (rcvsize == -1)
+00482                         {
+00483                                 if (errno != EAGAIN)
 00484                                 {
-00485                                         this->connectors[i].ResetPing();
-00486                                         while (this->connectors[i].BufferIsComplete())
-00487                                         {
-00488                                                 std::string text = this->connectors[i].GetBuffer();
-00489                                                 if (text != "")
-00490                                                 {
-00491                                                         if ((text[0] == ':') && (text.find(" ") != std::string::npos))
-00492                                                         {
-00493                                                                 std::string orig = text;
-00494                                                                 log(DEBUG,"Original: %s",text.c_str());
-00495                                                                 std::string sum = text.substr(1,text.find(" ")-1);
-00496                                                                 text = text.substr(text.find(" ")+1,text.length());
-00497                                                                 std::string possible_token = text.substr(1,text.find(" ")-1);
-00498                                                                 if (possible_token.length() > 1)
-00499                                                                 {
-00500                                                                         sums.push_back("*");
-00501                                                                         text = orig;
-00502                                                                         log(DEBUG,"Non-mesh, non-tokenized string passed up the chain");
-00503                                                                 }
-00504                                                                 else
-00505                                                                 {
-00506                                                                         log(DEBUG,"Packet sum: '%s'",sum.c_str());
-00507                                                                         if ((already_have_sum(sum)) && (sum != "*"))
-00508                                                                         {
-00509                                                                                 // we don't accept dupes
-00510                                                                                 continue;
-00511                                                                         }
-00512                                                                         sums.push_back(sum.c_str());
-00513                                                                 }
-00514                                                         }
-00515                                                         else sums.push_back("*");
-00516                                                         messages.push_back(text.c_str());
-00517                                                         strlcpy(recvhost,this->connectors[i].GetServerName().c_str(),160);
-00518                                                         log(DEBUG,"serverrec::RecvPacket() %d:%s->%s",pushed++,recvhost,text.c_str());
-00519                                                 }
-00520                                         }
-00521                                         return true;
-00522                                 }
-00523                         }
-00524                 }
-00525         }
-00526         // nothing new yet -- message and host will be undefined
-00527         return false;
-00528 }
+00485                                         log(DEBUG,"recv() failed for serverrec::RecvPacket(): %s",strerror(errno));
+00486                                         log(DEBUG,"Disabling connector: %s",this->connectors[i].GetServerName().c_str());
+00487                                         this->connectors[i].CloseConnection();
+00488                                         this->connectors[i].SetState(STATE_DISCONNECTED);
+00489                                         if (!IsRoutable(this->connectors[i].GetServerName()))
+00490                                         {
+00491                                                 WriteOpers("*** Server %s is no longer routable, disconnecting.",this->connectors[i].GetServerName().c_str());
+00492                                                 snprintf(buffer,MAXBUF,"& %s",this->connectors[i].GetServerName().c_str());
+00493                                                 NetSendToAllExcept(this->connectors[i].GetServerName().c_str(),buffer);
+00494                                                 DoSplit(this->connectors[i].GetServerName().c_str());
+00495                                         }
+00496                                         has_been_netsplit = true;
+00497                                 }
+00498                         }
+00499                         int pushed = 0;
+00500                         if (rcvsize > 0)
+00501                         {
+00502                                 if (!this->connectors[i].AddBuffer(data))
+00503                                 {
+00504                                         WriteOpers("*** Read buffer for %s exceeds maximum, closing connection!",this->connectors[i].GetServerName().c_str());
+00505                                         this->connectors[i].CloseConnection();
+00506                                         this->connectors[i].SetState(STATE_DISCONNECTED);
+00507                                         if (!IsRoutable(this->connectors[i].GetServerName()))
+00508                                         {
+00509                                                 WriteOpers("*** Server %s is no longer routable, disconnecting.",this->connectors[i].GetServerName().c_str());
+00510                                                 snprintf(buffer,MAXBUF,"& %s",this->connectors[i].GetServerName().c_str());
+00511                                                 NetSendToAllExcept(this->connectors[i].GetServerName().c_str(),buffer);
+00512                                                 DoSplit(this->connectors[i].GetServerName().c_str());
+00513                                         }
+00514                                         has_been_netsplit = true;
+00515                                 }
+00516                                 if (this->connectors[i].BufferIsComplete())
+00517                                 {
+00518                                         this->connectors[i].ResetPing();
+00519                                         while (this->connectors[i].BufferIsComplete())
+00520                                         {
+00521                                                 std::string text = this->connectors[i].GetBuffer();
+00522                                                 if (text != "")
+00523                                                 {
+00524                                                         if ((text[0] == ':') && (text.find(" ") != std::string::npos))
+00525                                                         {
+00526                                                                 std::string orig = text;
+00527                                                                 log(DEBUG,"Original: %s",text.c_str());
+00528                                                                 std::string sum = text.substr(1,text.find(" ")-1);
+00529                                                                 text = text.substr(text.find(" ")+1,text.length());
+00530                                                                 std::string possible_token = text.substr(1,text.find(" ")-1);
+00531                                                                 if (possible_token.length() > 1)
+00532                                                                 {
+00533                                                                         sums.push_back("*");
+00534                                                                         text = orig;
+00535                                                                         log(DEBUG,"Non-mesh, non-tokenized string passed up the chain");
+00536                                                                 }
+00537                                                                 else
+00538                                                                 {
+00539                                                                         log(DEBUG,"Packet sum: '%s'",sum.c_str());
+00540                                                                         if ((already_have_sum(sum)) && (sum != "*"))
+00541                                                                         {
+00542                                                                                 // we don't accept dupes
+00543                                                                                 continue;
+00544                                                                         }
+00545                                                                         sums.push_back(sum.c_str());
+00546                                                                 }
+00547                                                         }
+00548                                                         else sums.push_back("*");
+00549                                                         messages.push_back(text.c_str());
+00550                                                         strlcpy(recvhost,this->connectors[i].GetServerName().c_str(),160);
+00551                                                         log(DEBUG,"serverrec::RecvPacket() %d:%s->%s",pushed++,recvhost,text.c_str());
+00552                                                 }
+00553                                         }
+00554                                         return true;
+00555                                 }
+00556                         }
+00557                 }
+00558         }
+00559         // nothing new yet -- message and host will be undefined
+00560         return false;
+00561 }
 
@@ -939,85 +982,85 @@ Send a message to a server by name, if the server is unavailable directly route

-Definition at line 336 of file servers.cpp. +Definition at line 350 of file servers.cpp.

References ircd_connector::AddWriteBuf(), ircd_connector::CloseConnection(), connectors, DEBUG, FindHost(), ircd_connector::FlushWriteBuf(), ircd_connector::GetServerName(), ircd_connector::GetState(), ircd_connector::GetWriteError(), ircd_connector::SetState(), and STATE_DISCONNECTED.

Referenced by BeginLink(), and MeshCookie().

-

00337 {
-00338         if ((!message) || (!sendhost))
-00339                 return true;
-00340 
-00341         ircd_connector* cn = this->FindHost(sendhost);
-00342 
-00343         if (!strchr(message,'\n'))
-00344         {
-00345                 strlcat(message,"\n",MAXBUF);
-00346         }
-00347 
-00348         if (cn)
-00349         {
-00350                 log(DEBUG,"main: serverrec::SendPacket() sent '%s' to %s",message,cn->GetServerName().c_str());
-00351 
-00352                 if (cn->GetState() == STATE_DISCONNECTED)
-00353                 {
-00354                         // fix: can only route one hop to avoid a loop
-00355                         if (strncmp(message,"R ",2))
-00356                         {
-00357                                 log(DEBUG,"Not a double reroute");
-00358                                 // this route is down, we must re-route the packet through an available point in the mesh.
-00359                                 for (int k = 0; k < this->connectors.size(); k++)
-00360                                 {
-00361                                         log(DEBUG,"Check connector %d: %s",k,this->connectors[k].GetServerName().c_str());
-00362                                         // search for another point in the mesh which can 'reach' where we want to go
-00363                                         for (int m = 0; m < this->connectors[k].routes.size(); m++)
-00364                                         {
-00365                                                 if (!strcasecmp(this->connectors[k].routes[m].c_str(),sendhost))
-00366                                                 {
-00367                                                         log(DEBUG,"Found alternative route for packet: %s",this->connectors[k].GetServerName().c_str());
-00368                                                         char buffer[MAXBUF];
-00369                                                         snprintf(buffer,MAXBUF,"R %s %s",sendhost,message);
-00370                                                         this->SendPacket(buffer,this->connectors[k].GetServerName().c_str());
-00371                                                         return true;
-00372                                                 }
-00373                                         }
-00374                                 }
-00375                         }
-00376                         char buffer[MAXBUF];
-00377                         snprintf(buffer,MAXBUF,"& %s",sendhost);
-00378                         WriteOpers("*** All connections to %s lost.",sendhost);
-00379                         NetSendToAllExcept(sendhost,buffer);
-00380                         DoSplit(sendhost);
-00381                         return false;
-00382                 }
-00383 
-00384                 // returns false if the packet could not be sent (e.g. target host down)
-00385                 if (!cn->AddWriteBuf(message))
-00386                 {
-00387                         // if we're here, there was an error pending, and the send cannot proceed
-00388                         log(DEBUG,"cn->AddWriteBuf() failed for serverrec::SendPacket(): %s",cn->GetWriteError().c_str());
-00389                         log(DEBUG,"Disabling connector: %s",cn->GetServerName().c_str());
-00390                         cn->CloseConnection();
-00391                         cn->SetState(STATE_DISCONNECTED);
-00392                         WriteOpers("*** Lost single connection to %s, link inactive and retrying: %s",cn->GetServerName().c_str(),cn->GetWriteError().c_str());
-00393                         // retry the packet along a new route so either arrival OR failure are gauranteed (bugfix)
-00394                         return this->SendPacket(message,sendhost);
-00395                 }
-00396                 if (!cn->FlushWriteBuf())
-00397                 {
-00398                         // if we're here the write() caused an error, we cannot proceed
-00399                         log(DEBUG,"cn->FlushWriteBuf() failed for serverrec::SendPacket(): %s",cn->GetWriteError().c_str());
-00400                         log(DEBUG,"Disabling connector: %s",cn->GetServerName().c_str());
-00401                         cn->CloseConnection();
-00402                         cn->SetState(STATE_DISCONNECTED);
-00403                         WriteOpers("*** Lost single connection to %s, link inactive and retrying: %s",cn->GetServerName().c_str(),cn->GetWriteError().c_str());
-00404                         // retry the packet along a new route so either arrival OR failure are gauranteed
-00405                         return this->SendPacket(message,sendhost);
-00406                 }
-00407                 return true;
-00408         }
-00409 }
+
00351 {
+00352         if ((!message) || (!sendhost))
+00353                 return true;
+00354 
+00355         ircd_connector* cn = this->FindHost(sendhost);
+00356 
+00357         if (!strchr(message,'\n'))
+00358         {
+00359                 strlcat(message,"\n",MAXBUF);
+00360         }
+00361 
+00362         if (cn)
+00363         {
+00364                 log(DEBUG,"main: serverrec::SendPacket() sent '%s' to %s",message,cn->GetServerName().c_str());
+00365 
+00366                 if (cn->GetState() == STATE_DISCONNECTED)
+00367                 {
+00368                         // fix: can only route one hop to avoid a loop
+00369                         if (strncmp(message,"R ",2))
+00370                         {
+00371                                 log(DEBUG,"Not a double reroute");
+00372                                 // this route is down, we must re-route the packet through an available point in the mesh.
+00373                                 for (int k = 0; k < this->connectors.size(); k++)
+00374                                 {
+00375                                         log(DEBUG,"Check connector %d: %s",k,this->connectors[k].GetServerName().c_str());
+00376                                         // search for another point in the mesh which can 'reach' where we want to go
+00377                                         for (int m = 0; m < this->connectors[k].routes.size(); m++)
+00378                                         {
+00379                                                 if (!strcasecmp(this->connectors[k].routes[m].c_str(),sendhost))
+00380                                                 {
+00381                                                         log(DEBUG,"Found alternative route for packet: %s",this->connectors[k].GetServerName().c_str());
+00382                                                         char buffer[MAXBUF];
+00383                                                         snprintf(buffer,MAXBUF,"R %s %s",sendhost,message);
+00384                                                         this->SendPacket(buffer,this->connectors[k].GetServerName().c_str());
+00385                                                         return true;
+00386                                                 }
+00387                                         }
+00388                                 }
+00389                         }
+00390                         char buffer[MAXBUF];
+00391                         snprintf(buffer,MAXBUF,"& %s",sendhost);
+00392                         WriteOpers("*** All connections to %s lost.",sendhost);
+00393                         NetSendToAllExcept(sendhost,buffer);
+00394                         DoSplit(sendhost);
+00395                         return false;
+00396                 }
+00397 
+00398                 // returns false if the packet could not be sent (e.g. target host down)
+00399                 if (!cn->AddWriteBuf(message))
+00400                 {
+00401                         // if we're here, there was an error pending, and the send cannot proceed
+00402                         log(DEBUG,"cn->AddWriteBuf() failed for serverrec::SendPacket(): %s",cn->GetWriteError().c_str());
+00403                         log(DEBUG,"Disabling connector: %s",cn->GetServerName().c_str());
+00404                         cn->CloseConnection();
+00405                         cn->SetState(STATE_DISCONNECTED);
+00406                         WriteOpers("*** Lost single connection to %s, link inactive and retrying: %s",cn->GetServerName().c_str(),cn->GetWriteError().c_str());
+00407                         // retry the packet along a new route so either arrival OR failure are gauranteed (bugfix)
+00408                         return this->SendPacket(message,sendhost);
+00409                 }
+00410                 if (!cn->FlushWriteBuf())
+00411                 {
+00412                         // if we're here the write() caused an error, we cannot proceed
+00413                         log(DEBUG,"cn->FlushWriteBuf() failed for serverrec::SendPacket(): %s",cn->GetWriteError().c_str());
+00414                         log(DEBUG,"Disabling connector: %s",cn->GetServerName().c_str());
+00415                         cn->CloseConnection();
+00416                         cn->SetState(STATE_DISCONNECTED);
+00417                         WriteOpers("*** Lost single connection to %s, link inactive and retrying: %s",cn->GetServerName().c_str(),cn->GetWriteError().c_str());
+00418                         // retry the packet along a new route so either arrival OR failure are gauranteed
+00419                         return this->SendPacket(message,sendhost);
+00420                 }
+00421                 return true;
+00422         }
+00423 }
 
@@ -1087,7 +1130,7 @@ With a serverrec, this is a list of all established server connections.

Definition at line 81 of file servers.h.

-Referenced by AddIncoming(), BeginLink(), FindHost(), FlushWriteBuffers(), IsRoutable(), MeshCookie(), RecvPacket(), SendPacket(), and serverrec(). +Referenced by AddIncoming(), BeginLink(), FindHost(), FlushWriteBuffers(), IsRoutable(), MeshCookie(), RecvPacket(), SendPacket(), and serverrec().

@@ -1396,7 +1439,7 @@ Referenced by serverrec()


The documentation for this class was generated from the following files: -
Generated on Wed May 25 22:03:25 2005 for InspIRCd by +
Generated on Mon May 30 05:17:37 2005 for InspIRCd by doxygen 1.3.3
-- cgit v1.2.3