diff options
| author | m!nus <m1nus@online.de> | 2011-04-02 16:14:09 +0200 |
|---|---|---|
| committer | oy <Tom_Adams@web.de> | 2011-04-02 17:39:12 +0200 |
| commit | 63c46b3e562830db6c810472ea1e83a4c516fa6b (patch) | |
| tree | 895de346326a4d806f7f894c97a9a47f5d7c3384 | |
| parent | 3ebdc2a4ceb87c0787e9e5f31985879e4bd9a7f1 (diff) | |
| download | zcatch-63c46b3e562830db6c810472ea1e83a4c516fa6b.tar.gz zcatch-63c46b3e562830db6c810472ea1e83a4c516fa6b.zip | |
changed how server types are distinguished and fixed a few bugs
| -rw-r--r-- | src/mastersrv/mastersrv.cpp | 167 | ||||
| -rw-r--r-- | src/mastersrv/mastersrv.h | 7 |
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]; |