about summary refs log tree commit diff
path: root/src/engine
diff options
context:
space:
mode:
authoroy <Tom_Adams@web.de>2011-07-11 12:00:13 +0200
committeroy <Tom_Adams@web.de>2011-07-11 12:00:13 +0200
commitd28108b8ad25476ea5fc05836bea6a35205c7213 (patch)
tree2a2ef2ff1aa0b4235dc6838ed2eaa5c1daa5b0eb /src/engine
parent12c453ab15cec191c84afdf20427d5c22f5e3a9c (diff)
downloadzcatch-d28108b8ad25476ea5fc05836bea6a35205c7213.tar.gz
zcatch-d28108b8ad25476ea5fc05836bea6a35205c7213.zip
fixed few issues with masters.cfg
Diffstat (limited to 'src/engine')
-rw-r--r--src/engine/masterserver.h1
-rw-r--r--src/engine/shared/masterserver.cpp90
2 files changed, 49 insertions, 42 deletions
diff --git a/src/engine/masterserver.h b/src/engine/masterserver.h
index 74a394dc..57433993 100644
--- a/src/engine/masterserver.h
+++ b/src/engine/masterserver.h
@@ -23,7 +23,6 @@ public:
 	virtual int RefreshAddresses(int Nettype) = 0;
 	virtual void Update() = 0;
 	virtual int IsRefreshing() = 0;
-	virtual void DumpServers() = 0;
 	virtual NETADDR GetAddr(int Index) = 0;
 	virtual const char *GetName(int Index) = 0;
 	virtual bool IsValid(int Index) = 0;
diff --git a/src/engine/shared/masterserver.cpp b/src/engine/shared/masterserver.cpp
index 1bf402ca..1271eeaf 100644
--- a/src/engine/shared/masterserver.cpp
+++ b/src/engine/shared/masterserver.cpp
@@ -21,51 +21,57 @@ public:
 		bool m_Valid;
 
 		CHostLookup m_Lookup;
-	} ;
+	};
+
+	enum
+	{
+		STATE_INIT,
+		STATE_UPDATE,
+		STATE_READY,
+	};
 
 	CMasterInfo m_aMasterServers[MAX_MASTERSERVERS];
-	int m_NeedsUpdate;
+	int m_State;
 	IEngine *m_pEngine;
 	IStorage *m_pStorage;
 
 	CMasterServer()
 	{
 		SetDefault();
-		m_NeedsUpdate = -1;
+		m_State = STATE_INIT;
 		m_pEngine = 0;
+		m_pStorage = 0;
 	}
 
 	virtual int RefreshAddresses(int Nettype)
 	{
-		int i;
-
-		if(m_NeedsUpdate != -1)
-			return 0;
+		if(m_State != STATE_INIT)
+			return -1;
 
 		dbg_msg("engine/mastersrv", "refreshing master server addresses");
 
 		// add lookup jobs
-		for(i = 0; i < MAX_MASTERSERVERS; i++)
+		for(int i = 0; i < MAX_MASTERSERVERS; i++)
 		{
 			m_pEngine->HostLookup(&m_aMasterServers[i].m_Lookup, m_aMasterServers[i].m_aHostname, Nettype);
 			m_aMasterServers[i].m_Valid = false;
 		}
 
-		m_NeedsUpdate = 1;
+		m_State = STATE_UPDATE;
 		return 0;
 	}
 
 	virtual void Update()
 	{
 		// check if we need to update
-		if(m_NeedsUpdate != 1)
+		if(m_State != STATE_UPDATE)
 			return;
-		m_NeedsUpdate = 0;
+		m_State = STATE_READY;
 
 		for(int i = 0; i < MAX_MASTERSERVERS; i++)
 		{
 			if(m_aMasterServers[i].m_Lookup.m_Job.Status() != CJob::STATE_DONE)
-				m_NeedsUpdate = 1;
+				m_State = STATE_UPDATE;
 			else
 			{
 				if(m_aMasterServers[i].m_Lookup.m_Job.Result() == 0)
@@ -79,7 +85,7 @@ public:
 			}
 		}
 
-		if(!m_NeedsUpdate)
+		if(m_State == STATE_READY)
 		{
 			dbg_msg("engine/mastersrv", "saving addresses");
 			Save();
@@ -88,7 +94,7 @@ public:
 
 	virtual int IsRefreshing()
 	{
-		return m_NeedsUpdate;
+		return m_State != STATE_READY;
 	}
 
 	virtual NETADDR GetAddr(int Index)
@@ -106,16 +112,6 @@ public:
 		return m_aMasterServers[Index].m_Valid;
 	}
 
-	virtual void DumpServers()
-	{
-		for(int i = 0; i < MAX_MASTERSERVERS; i++)
-		{
-			char aAddrStr[NETADDR_MAXSTRSIZE];
-			net_addr_str(&m_aMasterServers[i].m_Addr, aAddrStr, sizeof(aAddrStr));
-			dbg_msg("mastersrv", "#%d = %s", i, aAddrStr);
-		}
-	}
-
 	virtual void Init()
 	{
 		m_pEngine = Kernel()->RequestInterface<IEngine>();
@@ -131,17 +127,15 @@ public:
 
 	virtual int Load()
 	{
-		CLineReader LineReader;
-		IOHANDLE File;
-		int Count = 0;
 		if(!m_pStorage)
 			return -1;
 
 		// try to open file
-		File = m_pStorage->OpenFile("masters.cfg", IOFLAG_READ, IStorage::TYPE_SAVE);
+		IOHANDLE File = m_pStorage->OpenFile("masters.cfg", IOFLAG_READ, IStorage::TYPE_SAVE);
 		if(!File)
 			return -1;
 
+		CLineReader LineReader;
 		LineReader.Init(File);
 		while(1)
 		{
@@ -152,19 +146,32 @@ public:
 
 			// parse line
 			char aAddrStr[NETADDR_MAXSTRSIZE];
-			if(sscanf(pLine, "%s %s", Info.m_aHostname, aAddrStr) == 2 && net_addr_from_str(&Info.m_Addr, aAddrStr) == 0)
+			if(sscanf(pLine, "%127s %47s", Info.m_aHostname, aAddrStr) == 2 && net_addr_from_str(&Info.m_Addr, aAddrStr) == 0)
 			{
 				Info.m_Addr.port = 8300;
-				if(Count != MAX_MASTERSERVERS)
+				bool Added = false;
+				for(int i = 0; i < MAX_MASTERSERVERS; ++i)
+					if(str_comp(m_aMasterServers[i].m_aHostname, Info.m_aHostname) == 0)
+					{
+						m_aMasterServers[i] = Info;
+						Added = true;
+						break;
+					}
+				
+				if(!Added)
 				{
-					m_aMasterServers[Count] = Info;
-					Count++;
+					for(int i = 0; i < MAX_MASTERSERVERS; ++i)
+						if(m_aMasterServers[i].m_Addr.type == NETTYPE_INVALID)
+						{
+							m_aMasterServers[i] = Info;
+							Added = true;
+							break;
+						}
 				}
-				//else
-				//	dbg_msg("engine/mastersrv", "warning: skipped master server '%s' due to limit of %d", pLine, MAX_MASTERSERVERS);
+
+				if(!Added)
+					break;
 			}
-			//else
-			//	dbg_msg("engine/mastersrv", "warning: couldn't parse master server '%s'", pLine);
 		}
 
 		io_close(File);
@@ -173,21 +180,22 @@ public:
 
 	virtual int Save()
 	{
-		IOHANDLE File;
-
 		if(!m_pStorage)
 			return -1;
 
 		// try to open file
-		File = m_pStorage->OpenFile("masters.cfg", IOFLAG_WRITE, IStorage::TYPE_SAVE);
+		IOHANDLE File = m_pStorage->OpenFile("masters.cfg", IOFLAG_WRITE, IStorage::TYPE_SAVE);
 		if(!File)
 			return -1;
 
 		for(int i = 0; i < MAX_MASTERSERVERS; i++)
 		{
 			char aAddrStr[NETADDR_MAXSTRSIZE];
-			net_addr_str(&m_aMasterServers[i].m_Addr, aAddrStr, sizeof(aAddrStr));
-			char aBuf[1024];
+			if(m_aMasterServers[i].m_Addr.type != NETTYPE_INVALID)
+				net_addr_str(&m_aMasterServers[i].m_Addr, aAddrStr, sizeof(aAddrStr));
+			else
+				aAddrStr[0] = 0;
+			char aBuf[256];
 			str_format(aBuf, sizeof(aBuf), "%s %s\n", m_aMasterServers[i].m_aHostname, aAddrStr);
 
 			io_write(File, aBuf, str_length(aBuf));