about summary refs log tree commit diff
diff options
context:
space:
mode:
authorm!nus <m1nus@online.de>2011-04-02 16:14:09 +0200
committeroy <Tom_Adams@web.de>2011-04-02 17:39:12 +0200
commit63c46b3e562830db6c810472ea1e83a4c516fa6b (patch)
tree895de346326a4d806f7f894c97a9a47f5d7c3384
parent3ebdc2a4ceb87c0787e9e5f31985879e4bd9a7f1 (diff)
downloadzcatch-63c46b3e562830db6c810472ea1e83a4c516fa6b.tar.gz
zcatch-63c46b3e562830db6c810472ea1e83a4c516fa6b.zip
changed how server types are distinguished and fixed a few bugs
-rw-r--r--src/mastersrv/mastersrv.cpp167
-rw-r--r--src/mastersrv/mastersrv.h7
2 files changed, 111 insertions, 63 deletions
diff --git a/src/mastersrv/mastersrv.cpp b/src/mastersrv/mastersrv.cpp
index 084866cd..2100e4db 100644
--- a/src/mastersrv/mastersrv.cpp
+++ b/src/mastersrv/mastersrv.cpp
@@ -20,7 +20,7 @@ enum {
 
 struct CCheckServer
 {
-	bool m_Legacy;
+	enum ServerType m_Type;
 	NETADDR m_Address;
 	NETADDR m_AltAddress;
 	int m_TryCount;
@@ -32,7 +32,7 @@ static int m_NumCheckServers = 0;
 
 struct CServerEntry
 {
-	bool m_Legacy;
+	enum ServerType m_Type;
 	NETADDR m_Address;
 	int64 m_Expire;
 };
@@ -101,58 +101,64 @@ void BuildPackets()
 	int PacketIndexLegacy = 0;
 	while(ServersLeft-- && (m_NumPackets + m_NumPacketsLegacy) < MAX_PACKETS)
 	{
-		if(!pCurrent->m_Legacy)
+		if(pCurrent->m_Type == SERVERTYPE_NORMAL)
 		{
-			if(PacketIndex == MAX_SERVERS_PER_PACKET)
+			if(PacketIndex % MAX_SERVERS_PER_PACKET == 0)
 			{
 				PacketIndex = 0;
 				m_NumPackets++;
 			}
 
 			// copy header	
-			mem_copy(m_aPackets[m_NumPackets].m_Data.m_aHeader, SERVERBROWSE_LIST, sizeof(SERVERBROWSE_LIST));
+			mem_copy(m_aPackets[m_NumPackets-1].m_Data.m_aHeader, SERVERBROWSE_LIST, sizeof(SERVERBROWSE_LIST));
 
 			// copy server addresses
-			m_aPackets[m_NumPackets].m_Data.m_aServers[PacketIndex].m_aType[0] = (pCurrent->m_Address.type>>24)&0xff;
-			m_aPackets[m_NumPackets].m_Data.m_aServers[PacketIndex].m_aType[1] = (pCurrent->m_Address.type>>16)&0xff;
-			m_aPackets[m_NumPackets].m_Data.m_aServers[PacketIndex].m_aType[2] = (pCurrent->m_Address.type>>8)&0xff;
-			m_aPackets[m_NumPackets].m_Data.m_aServers[PacketIndex].m_aType[3] = pCurrent->m_Address.type&0xff;
-			mem_copy(m_aPackets[m_NumPackets].m_Data.m_aServers[PacketIndex].m_aIp, pCurrent->m_Address.ip,
-				sizeof(m_aPackets[m_NumPackets].m_Data.m_aServers[PacketIndex].m_aIp));
-			m_aPackets[m_NumPackets].m_Data.m_aServers[PacketIndex].m_aPort[0] = (pCurrent->m_Address.port>>8)&0xff;
-			m_aPackets[m_NumPackets].m_Data.m_aServers[PacketIndex].m_aPort[1] = pCurrent->m_Address.port&0xff;
+			m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aType[0] = (pCurrent->m_Address.type>>24)&0xff;
+			m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aType[1] = (pCurrent->m_Address.type>>16)&0xff;
+			m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aType[2] = (pCurrent->m_Address.type>>8)&0xff;
+			m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aType[3] = pCurrent->m_Address.type&0xff;
+			mem_copy(m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aIp, pCurrent->m_Address.ip,
+				sizeof(m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aIp));
+			m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aPort[0] = (pCurrent->m_Address.port>>8)&0xff;
+			m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aPort[1] = pCurrent->m_Address.port&0xff;
 
 			PacketIndex++;
 
-			m_aPackets[m_NumPackets].m_Size = sizeof(SERVERBROWSE_LIST) + sizeof(CMastersrvAddr)*PacketIndex;
+			m_aPackets[m_NumPackets-1].m_Size = sizeof(SERVERBROWSE_LIST) + sizeof(CMastersrvAddr)*PacketIndex;
+
+			pCurrent++;
 		}
-		else // legacy code
+		else if(pCurrent->m_Type == SERVERTYPE_LEGACY)
 		{
-			if(PacketIndexLegacy == MAX_SERVERS_PER_PACKET)
+			if(PacketIndexLegacy % MAX_SERVERS_PER_PACKET == 0)
 			{
 				PacketIndexLegacy = 0;
 				m_NumPacketsLegacy++;
 			}
 
 			// copy header	
-			mem_copy(m_aPacketsLegacy[m_NumPackets].m_Data.m_aHeader, SERVERBROWSE_LIST_LEGACY, sizeof(SERVERBROWSE_LIST_LEGACY));
+			mem_copy(m_aPacketsLegacy[m_NumPacketsLegacy-1].m_Data.m_aHeader, SERVERBROWSE_LIST_LEGACY, sizeof(SERVERBROWSE_LIST_LEGACY));
 			
 			// copy server addresses
-			mem_copy(m_aPacketsLegacy[m_NumPacketsLegacy].m_Data.m_aServers[PacketIndexLegacy].m_aIp, pCurrent->m_Address.ip,
-				sizeof(m_aPacketsLegacy[m_NumPacketsLegacy].m_Data.m_aServers[PacketIndexLegacy].m_aIp));
+			mem_copy(m_aPacketsLegacy[m_NumPacketsLegacy-1].m_Data.m_aServers[PacketIndexLegacy].m_aIp, pCurrent->m_Address.ip,
+				sizeof(m_aPacketsLegacy[m_NumPacketsLegacy-1].m_Data.m_aServers[PacketIndexLegacy].m_aIp));
 			// 0.5 has the port in little endian on the network
-			m_aPacketsLegacy[m_NumPacketsLegacy].m_Data.m_aServers[PacketIndexLegacy].m_aPort[0] = pCurrent->m_Address.port&0xff;
-			m_aPacketsLegacy[m_NumPacketsLegacy].m_Data.m_aServers[PacketIndexLegacy].m_aPort[1] = (pCurrent->m_Address.port>>8)&0xff;
+			m_aPacketsLegacy[m_NumPacketsLegacy-1].m_Data.m_aServers[PacketIndexLegacy].m_aPort[0] = pCurrent->m_Address.port&0xff;
+			m_aPacketsLegacy[m_NumPacketsLegacy-1].m_Data.m_aServers[PacketIndexLegacy].m_aPort[1] = (pCurrent->m_Address.port>>8)&0xff;
 
 			PacketIndexLegacy++;
 
-			m_aPacketsLegacy[m_NumPacketsLegacy].m_Size = sizeof(SERVERBROWSE_LIST_LEGACY) + sizeof(CMastersrvAddrLegacy)*PacketIndexLegacy;
-		}
+			m_aPacketsLegacy[m_NumPacketsLegacy-1].m_Size = sizeof(SERVERBROWSE_LIST_LEGACY) + sizeof(CMastersrvAddrLegacy)*PacketIndexLegacy;
 
-		pCurrent++;
+			pCurrent++;
+		}
+		else
+		{
+			*pCurrent = m_aServers[m_NumServers-1];
+			m_NumServers--;
+			dbg_msg("mastersrv", "error: server of invalid type, dropping it");
+		}
 	}
-	m_NumPackets++;
-	m_NumPacketsLegacy++;
 }
 
 void SendOk(NETADDR *pAddr)
@@ -191,7 +197,7 @@ void SendCheck(NETADDR *pAddr)
 	m_NetChecker.Send(&p);
 }
 
-void AddCheckserver(NETADDR *pInfo, NETADDR *pAlt, bool Legacy)
+void AddCheckserver(NETADDR *pInfo, NETADDR *pAlt, ServerType Type)
 {
 	// add server
 	if(m_NumCheckServers == MAX_SERVERS)
@@ -209,11 +215,11 @@ void AddCheckserver(NETADDR *pInfo, NETADDR *pAlt, bool Legacy)
 	m_aCheckServers[m_NumCheckServers].m_AltAddress = *pAlt;
 	m_aCheckServers[m_NumCheckServers].m_TryCount = 0;
 	m_aCheckServers[m_NumCheckServers].m_TryTime = 0;
-	m_aCheckServers[m_NumCheckServers].m_Legacy = Legacy;
+	m_aCheckServers[m_NumCheckServers].m_Type = Type;
 	m_NumCheckServers++;
 }
 
-void AddServer(NETADDR *pInfo, bool Legacy)
+void AddServer(NETADDR *pInfo, ServerType Type)
 {
 	// see if server already exists in list
 	for(int i = 0; i < m_NumServers; i++)
@@ -240,7 +246,7 @@ void AddServer(NETADDR *pInfo, bool Legacy)
 	dbg_msg("mastersrv", "added: %s", aAddrStr);
 	m_aServers[m_NumServers].m_Address = *pInfo;
 	m_aServers[m_NumServers].m_Expire = time_get()+time_freq()*EXPIRE_TIME;
-	m_aServers[m_NumServers].m_Legacy = Legacy;
+	m_aServers[m_NumServers].m_Type = Type;
 	m_NumServers++;
 }
 
@@ -352,7 +358,7 @@ void ReloadBans()
 int main(int argc, const char **argv) // ignore_convention
 {
 	int64 LastBuild = 0, LastBanReload = 0;
-	bool Legacy = false;
+	ServerType Type = SERVERTYPE_INVALID;
 	NETADDR BindAddr;
 
 	dbg_logger_stdout();
@@ -404,12 +410,22 @@ int main(int argc, const char **argv) // ignore_convention
 			// check if the server is banned
 			if(CheckBan(Packet.m_Address)) continue;
 
-			if((Packet.m_DataSize == sizeof(SERVERBROWSE_HEARTBEAT)+2 &&
-				mem_comp(Packet.m_pData, SERVERBROWSE_HEARTBEAT, sizeof(SERVERBROWSE_HEARTBEAT)) == 0) ||
-				(Packet.m_DataSize == sizeof(SERVERBROWSE_HEARTBEAT_LEGACY)+2 &&
-				mem_comp(Packet.m_pData, SERVERBROWSE_HEARTBEAT_LEGACY, sizeof(SERVERBROWSE_HEARTBEAT_LEGACY)) == 0))
+			if(Packet.m_DataSize == sizeof(SERVERBROWSE_HEARTBEAT)+2 &&
+				mem_comp(Packet.m_pData, SERVERBROWSE_HEARTBEAT, sizeof(SERVERBROWSE_HEARTBEAT)) == 0)
+			{
+				NETADDR Alt;
+				unsigned char *d = (unsigned char *)Packet.m_pData;
+				Alt = Packet.m_Address;
+				Alt.port =
+					(d[sizeof(SERVERBROWSE_HEARTBEAT)]<<8) |
+					d[sizeof(SERVERBROWSE_HEARTBEAT)+1];
+
+				// add it
+				AddCheckserver(&Packet.m_Address, &Alt, SERVERTYPE_NORMAL);
+			}
+			else if(Packet.m_DataSize == sizeof(SERVERBROWSE_HEARTBEAT_LEGACY)+2 &&
+				mem_comp(Packet.m_pData, SERVERBROWSE_HEARTBEAT_LEGACY, sizeof(SERVERBROWSE_HEARTBEAT_LEGACY)) == 0)
 			{
-				Legacy = (mem_comp(Packet.m_pData, SERVERBROWSE_HEARTBEAT_LEGACY, sizeof(SERVERBROWSE_HEARTBEAT_LEGACY)) == 0);
 				NETADDR Alt;
 				unsigned char *d = (unsigned char *)Packet.m_pData;
 				Alt = Packet.m_Address;
@@ -418,52 +434,72 @@ int main(int argc, const char **argv) // ignore_convention
 					d[sizeof(SERVERBROWSE_HEARTBEAT)+1];
 				
 				// add it
-				AddCheckserver(&Packet.m_Address, &Alt, Legacy);
+				AddCheckserver(&Packet.m_Address, &Alt, SERVERTYPE_LEGACY);
 			}
-			else if((Packet.m_DataSize == sizeof(SERVERBROWSE_GETCOUNT) &&
-				mem_comp(Packet.m_pData, SERVERBROWSE_GETCOUNT, sizeof(SERVERBROWSE_GETCOUNT)) == 0) ||
-				(Packet.m_DataSize == sizeof(SERVERBROWSE_GETCOUNT_LEGACY) &&
-				mem_comp(Packet.m_pData, SERVERBROWSE_GETCOUNT_LEGACY, sizeof(SERVERBROWSE_GETCOUNT_LEGACY)) == 0))
+
+			else if(Packet.m_DataSize == sizeof(SERVERBROWSE_GETCOUNT) &&
+				mem_comp(Packet.m_pData, SERVERBROWSE_GETCOUNT, sizeof(SERVERBROWSE_GETCOUNT)) == 0)
+			{
+				dbg_msg("mastersrv", "count requested, responding with %d", m_NumServers);
+
+				CNetChunk p;
+				p.m_ClientID = -1;
+				p.m_Address = Packet.m_Address;
+				p.m_Flags = NETSENDFLAG_CONNLESS;
+				p.m_DataSize = sizeof(m_CountData);
+				p.m_pData = &m_CountData;
+				m_CountData.m_High = (m_NumServers>>8)&0xff;
+				m_CountData.m_Low = m_NumServers&0xff;
+				m_NetOp.Send(&p);
+			}
+			else if(Packet.m_DataSize == sizeof(SERVERBROWSE_GETCOUNT_LEGACY) &&
+				mem_comp(Packet.m_pData, SERVERBROWSE_GETCOUNT_LEGACY, sizeof(SERVERBROWSE_GETCOUNT_LEGACY)) == 0)
 			{
 				dbg_msg("mastersrv", "count requested, responding with %d", m_NumServers);
 				
-				Legacy = (mem_comp(Packet.m_pData, SERVERBROWSE_GETCOUNT_LEGACY, sizeof(SERVERBROWSE_GETCOUNT_LEGACY)) == 0);
 				CNetChunk p;
 				p.m_ClientID = -1;
 				p.m_Address = Packet.m_Address;
 				p.m_Flags = NETSENDFLAG_CONNLESS;
 				p.m_DataSize = sizeof(m_CountData);
-				p.m_pData = Legacy?&m_CountDataLegacy:&m_CountData;
-				if(Legacy)
-				{
-					m_CountDataLegacy.m_High = (m_NumServers>>8)&0xff;
-					m_CountDataLegacy.m_Low = m_NumServers&0xff;
-				}
-				else
+				p.m_pData = &m_CountDataLegacy;
+				m_CountDataLegacy.m_High = (m_NumServers>>8)&0xff;
+				m_CountDataLegacy.m_Low = m_NumServers&0xff;
+				m_NetOp.Send(&p);
+			}
+			else if(Packet.m_DataSize == sizeof(SERVERBROWSE_GETLIST) &&
+				mem_comp(Packet.m_pData, SERVERBROWSE_GETLIST, sizeof(SERVERBROWSE_GETLIST)) == 0)
+			{
+				// someone requested the list
+				dbg_msg("mastersrv", "requested, responding with %d m_aServers", m_NumServers);
+
+				CNetChunk p;
+				p.m_ClientID = -1;
+				p.m_Address = Packet.m_Address;
+				p.m_Flags = NETSENDFLAG_CONNLESS;
+
+				for(int i = 0; i < m_NumPackets; i++)
 				{
-					m_CountData.m_High = (m_NumServers>>8)&0xff;
-					m_CountData.m_Low = m_NumServers&0xff;
+					p.m_DataSize = m_aPackets[i].m_Size;
+					p.m_pData = &m_aPackets[i].m_Data;
+					m_NetOp.Send(&p);
 				}
-				m_NetOp.Send(&p);
 			}
-			else if((Packet.m_DataSize == sizeof(SERVERBROWSE_GETLIST) &&
-				mem_comp(Packet.m_pData, SERVERBROWSE_GETLIST, sizeof(SERVERBROWSE_GETLIST)) == 0) ||
-				(Packet.m_DataSize == sizeof(SERVERBROWSE_GETLIST_LEGACY) &&
-				mem_comp(Packet.m_pData, SERVERBROWSE_GETLIST_LEGACY, sizeof(SERVERBROWSE_GETLIST_LEGACY)) == 0))
+			else if(Packet.m_DataSize == sizeof(SERVERBROWSE_GETLIST_LEGACY) &&
+				mem_comp(Packet.m_pData, SERVERBROWSE_GETLIST_LEGACY, sizeof(SERVERBROWSE_GETLIST_LEGACY)) == 0)
 			{
 				// someone requested the list
 				dbg_msg("mastersrv", "requested, responding with %d m_aServers", m_NumServers);
 				
-				Legacy = (mem_comp(Packet.m_pData, SERVERBROWSE_GETLIST_LEGACY, sizeof(SERVERBROWSE_GETLIST_LEGACY)) == 0);
 				CNetChunk p;
 				p.m_ClientID = -1;
 				p.m_Address = Packet.m_Address;
 				p.m_Flags = NETSENDFLAG_CONNLESS;
 				
-				for(int i = 0; i < m_NumPackets; i++)
+				for(int i = 0; i < m_NumPacketsLegacy; i++)
 				{
-					p.m_DataSize = Legacy?m_aPacketsLegacy[i].m_Size:m_aPackets[i].m_Size;
-					p.m_pData = Legacy?((void*)&m_aPacketsLegacy[i].m_Data):((void*)&m_aPackets[i].m_Data);
+					p.m_DataSize = m_aPacketsLegacy[i].m_Size;
+					p.m_pData = &m_aPacketsLegacy[i].m_Data;
 					m_NetOp.Send(&p);
 				}
 			}
@@ -478,20 +514,25 @@ int main(int argc, const char **argv) // ignore_convention
 			if(Packet.m_DataSize == sizeof(SERVERBROWSE_FWRESPONSE) &&
 				mem_comp(Packet.m_pData, SERVERBROWSE_FWRESPONSE, sizeof(SERVERBROWSE_FWRESPONSE)) == 0)
 			{
+				Type = SERVERTYPE_INVALID;
 				// remove it from checking
 				for(int i = 0; i < m_NumCheckServers; i++)
 				{
 					if(net_addr_comp(&m_aCheckServers[i].m_Address, &Packet.m_Address) == 0 ||
 						net_addr_comp(&m_aCheckServers[i].m_AltAddress, &Packet.m_Address) == 0)
 					{
-						Legacy = m_aCheckServers[i].m_Legacy;
+						Type = m_aCheckServers[i].m_Type;
 						m_NumCheckServers--;
 						m_aCheckServers[i] = m_aCheckServers[m_NumCheckServers];
 						break;
 					}
 				}
-				
-				AddServer(&Packet.m_Address, Legacy);
+
+				// drops servers that were not in the CheckServers list
+				if(Type == SERVERTYPE_INVALID)
+					continue;
+
+				AddServer(&Packet.m_Address, Type);
 				SendOk(&Packet.m_Address);
 			}
 		}
diff --git a/src/mastersrv/mastersrv.h b/src/mastersrv/mastersrv.h
index 48870819..63a998e3 100644
--- a/src/mastersrv/mastersrv.h
+++ b/src/mastersrv/mastersrv.h
@@ -4,6 +4,13 @@
 #define MASTERSRV_MASTERSRV_H
 static const int MASTERSERVER_PORT = 8300;
 
+enum ServerType
+{
+	SERVERTYPE_INVALID = -1,
+	SERVERTYPE_NORMAL,
+	SERVERTYPE_LEGACY
+};
+
 struct CMastersrvAddr
 {
 	unsigned char m_aType[4];