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
1.3.3
--
cgit v1.3.1-10-gc9f91