--- fg_server.hpp	Fri Mar  3 12:21:26 2006
+++ ../../fg_server.work/src/fg_server.hpp	Sun Apr 29 02:23:51 2007
@@ -19,7 +19,11 @@
 #include <string.h>
 #include <errno.h>
 #include <time.h>
+#ifdef __sparc
+#include <sys/int_types.h>
+#else
 #include <stdint.h>
+#endif
 #include <unistd.h>
 #include "netSocket.h"
 #include "logobject.hpp"
@@ -115,6 +119,8 @@
 	public:
 		string		Name;
 		netAddress	Address;
+		time_t          Timestamp;
+		bool            Active;
 	};
 	//////////////////////////////////////////////////
 	//
--- fg_server.cpp	Sun Dec 10 11:16:28 2006
+++ ../../fg_server.work/src/fg_server.cpp	Sun Apr 29 03:36:58 2007
@@ -411,6 +411,7 @@
                 Message += m_ServerName;
                 CreateChatMessage (NewPlayer.ClientID , Message);
                 Message = "this is version v" + string(VERSION);
+		Message += " (Experimental features: LazyRelay)";
                 CreateChatMessage (NewPlayer.ClientID , Message);
                 Message  ="using protocol version v";
                 Message += NumToStr (m_ProtoMajorVersion, 0);
@@ -443,6 +444,8 @@
 
         NewRelay.Name = Server;
         NewRelay.Address.set ((char*) Server.c_str(), Port);
+	NewRelay.Timestamp = time(0);
+	NewRelay.Active = false;
         m_RelayList.push_back (NewRelay);
 } // FG_SERVER::AddRelay()
 //////////////////////////////////////////////////////////////////////
@@ -458,6 +461,7 @@
 {
         time_t          Timestamp;
         mT_PlayerListIt CurrentPlayer;
+	mT_RelayListIt  CurrentRelay;
 
         Timestamp = time(0);
         CurrentPlayer = m_PlayerList.begin();
@@ -486,6 +490,17 @@
                 }
                 CurrentPlayer++;
         }
+        CurrentRelay = m_RelayList.begin();
+        while (CurrentRelay != m_RelayList.end())
+        {
+               if (((Timestamp-CurrentRelay->Timestamp) > PLAYER_TTL) && CurrentRelay->Active)
+                {
+                       CurrentRelay->Active = false;
+                       m_Log.log (L_HIGH) << "Deactivating relay " << CurrentRelay->Name << endl;
+               }
+               CurrentRelay++;
+       }
+        
 } // FG_SERVER::CleanUp ()
 //////////////////////////////////////////////////////////////////////
 
@@ -550,6 +565,7 @@
         mT_PlayerListIt         CurrentPlayer;
         mT_RelayListIt          CurrentRelay;
         mT_MessageIt            CurrentMessage;
+	bool                    HasLocalClients;
 
         MsgHdr = (T_MsgHdr *) Msg;
         Timestamp = time(0);
@@ -625,9 +641,13 @@
         //
         //////////////////////////////////////////////////
         PlayerInList = false;
+	HasLocalClients = false;
         CurrentPlayer = m_PlayerList.begin();
         while ((CurrentPlayer != m_PlayerList.end()) && (PlayerInList == false))
         {
+               if (CurrentPlayer->IsLocal) {
+                       HasLocalClients = true;
+               }
                 if ((CurrentPlayer->Callsign == MsgHdr->Callsign)
                 && (CurrentPlayer->Address.getIP() == SenderAddress.getIP()))
                 {
@@ -661,6 +681,17 @@
         if (PlayerInList == false)
         {
                 AddClient (SenderAddress, Msg, PacketFromLocalClient);
+               if (!HasLocalClients && PacketFromLocalClient) {
+                       // Optimisticall activate all relays to make sure that the system does not become partitioned.
+                       mT_RelayListIt CurrentRelay = m_RelayList.begin();
+                       while (CurrentRelay != m_RelayList.end())
+                       {
+                               CurrentRelay->Active = true;
+                               CurrentRelay->Timestamp = Timestamp;    
+                               m_Log.log (L_HIGH) << "Optimistically activating relay " + CurrentRelay->Name  << endl;
+                               CurrentRelay++;
+                       }
+               }
         }
         //////////////////////////////////////////
         //
@@ -816,10 +847,26 @@
                 CurrentRelay = m_RelayList.begin();
                 while (CurrentRelay != m_RelayList.end())
                 {
-                        m_DataSocket->sendto(Msg, Bytes, 0,
-                          &CurrentRelay->Address);
-                        CurrentRelay++;
-                }
+                       if (CurrentRelay->Active) {   
+                               m_DataSocket->sendto(Msg, Bytes, 0, &CurrentRelay->Address);
+                       }
+                       CurrentRelay++;
+               }
+        } else {
+               // Renew timestamp of sending relay.
+               mT_RelayListIt CurrentRelay = m_RelayList.begin();
+               while (CurrentRelay != m_RelayList.end())
+               {
+                       if (CurrentRelay->Address.getIP() == SenderAddress.getIP()) {
+                               if (!CurrentRelay->Active) {
+                                       m_Log.log (L_HIGH) << "Activating relay " << CurrentRelay->Name  << endl;
+                                       CurrentRelay->Active = true;
+                               }
+                               CurrentRelay->Timestamp = Timestamp;
+                               break;
+                       }
+                       CurrentRelay++;
+           	}
         }
 } // FG_SERVER::HandlePacket ( char* sMsg[MAX_PACKET_SIZE] )
 //////////////////////////////////////////////////////////////////////
@@ -836,6 +883,7 @@
         char            Msg[MAX_PACKET_SIZE];
         netAddress      SenderAddress;
         netSocket*      ListenSockets[3 + MAX_TELNETS];
+	time_t          CurrentTime, LastCleanUp;
 
         m_IsParent = true;
         if (m_Listening == false)
@@ -850,8 +898,10 @@
         //
         //////////////////////////////////////////////////
         CreateChatMessage (0, string("server ")+m_ServerName+string(" is online"));
+	LastCleanUp = time(0);
         for (;;)
         {
+		CurrentTime = time(0);
                 errno = 0;
                 ListenSockets[0] = m_DataSocket;
                 ListenSockets[1] = m_TelnetSocket;
@@ -860,6 +910,7 @@
                 if (Bytes == -2)
                 {       // timeout, no packets received
                         CleanUp ();
+			LastCleanUp = CurrentTime;
                         continue;
                 }
                 if (! Bytes)
@@ -886,8 +937,15 @@
                 else if (ListenSockets[1] != 0)
                 {       // something on the wire (telnet)
                         HandleTelnet (m_TelnetSocket);
+			LastCleanUp = CurrentTime;
                         CleanUp ();
                 } // TelnetSocket
+               
+               // Do periodic CleanUp.
+               if (CurrentTime-LastCleanUp > PLAYER_TTL) {
+                       CleanUp ();
+                       LastCleanUp = CurrentTime;
+               }
         }
 } // FG_SERVER::Loop()
 //////////////////////////////////////////////////////////////////////
