From 7d118bd24931b9a7cfa5426ca56a1c5f6c5fbdf9 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Wed, 30 Mar 2016 11:00:29 -0400 Subject: [PATCH] First attempt at porting GameAgent code. --- Sources/Engine/GameAgent/GameAgent.cpp | 44 +++++++++++++++++++++++++- Sources/Makefile | 19 ++--------- 2 files changed, 46 insertions(+), 17 deletions(-) diff --git a/Sources/Engine/GameAgent/GameAgent.cpp b/Sources/Engine/GameAgent/GameAgent.cpp index 8626253..b6d9e8c 100644 --- a/Sources/Engine/GameAgent/GameAgent.cpp +++ b/Sources/Engine/GameAgent/GameAgent.cpp @@ -19,9 +19,28 @@ #include -#pragma comment(lib, "wsock32.lib") +#ifdef PLATFORM_UNIX +#include +#include +#include +#include +#include +#include +#define INVALID_SOCKET -1 +#define SOCKET_ERROR -1 +#define closesocket close +typedef int SOCKET; +typedef struct hostent HOSTENT; +typedef struct sockaddr_in SOCKADDR_IN; +typedef struct sockaddr SOCKADDR; +#define WSAGetLastError() (INDEX) errno +#endif +#ifdef PLATFORM_WIN32 +#pragma comment(lib, "wsock32.lib") WSADATA* _wsaData = NULL; +#endif + SOCKET _socket = NULL; sockaddr_in* _sin = NULL; @@ -42,6 +61,7 @@ extern CTString ga_strServer = "master1.croteam.org"; void _uninitWinsock(); void _initializeWinsock(void) { +#ifdef PLATFORM_WIN32 if(_wsaData != NULL && _socket != NULL) { return; } @@ -61,6 +81,7 @@ void _initializeWinsock(void) _uninitWinsock(); return; } +#endif // get the host IP hostent* phe = gethostbyname(ga_strServer); @@ -95,20 +116,37 @@ void _initializeWinsock(void) } // set the socket to be nonblocking +#ifdef PLATFORM_WIN32 DWORD dwNonBlocking = 1; if(ioctlsocket(_socket, FIONBIO, &dwNonBlocking) != 0) { CPrintF("Error setting socket to nonblocking!\n"); _uninitWinsock(); return; } +#else + int flags = fcntl(_socket, F_GETFL); + int failed = flags; + if (failed != -1) { + flags |= O_NONBLOCK; + failed = fcntl(_socket, F_SETFL, flags); + } + + if (failed == -1) { + CPrintF("Error setting socket to nonblocking!\n"); + _uninitWinsock(); + return; + } +#endif } void _uninitWinsock() { if(_wsaData != NULL) { closesocket(_socket); + #ifdef PLATFORM_WIN32 delete _wsaData; _wsaData = NULL; + #endif } _socket = NULL; } @@ -329,6 +367,8 @@ extern void GameAgent_EnumUpdate(void) switch(_szBuffer[0]) { case 's': { + // !!! FIXME: serialize this and byteswap it. --ryan. + #pragma pack(1) struct sIPPort { UBYTE bFirst; UBYTE bSecond; @@ -336,6 +376,8 @@ extern void GameAgent_EnumUpdate(void) UBYTE bFourth; USHORT iPort; }; + #pragma pack() + sIPPort* pServers = (sIPPort*)(_szBuffer + 1); while(iLen - ((CHAR*)pServers - _szBuffer) >= sizeof(sIPPort)) { sIPPort ip = *pServers; diff --git a/Sources/Makefile b/Sources/Makefile index ccad0c9..ddb58a6 100644 --- a/Sources/Makefile +++ b/Sources/Makefile @@ -274,12 +274,9 @@ ENGINEGRAPHICSSRCS := Engine/Graphics/Adapter.cpp \ ENGINENETWORKSRCS := Engine/Network/ActionBuffer.cpp \ Engine/Network/NetworkMessage.cpp \ Engine/Network/Server.cpp \ - Engine/Network/GameSpy.cpp \ Engine/Network/Buffer.cpp \ Engine/Network/NetworkProfile.cpp \ - Engine/Network/GameSpyEnum.cpp \ Engine/Network/SessionState.cpp \ - Engine/Network/GameSpyKeys.cpp \ Engine/Network/PlayerBuffer.cpp \ Engine/Network/MessageDispatcher.cpp \ Engine/Network/PlayerSource.cpp \ @@ -291,13 +288,7 @@ ENGINENETWORKSRCS := Engine/Network/ActionBuffer.cpp \ Engine/Network/CommunicationInterface.cpp \ Engine/Network/Diff.cpp - -ENGINEGAMESPYSRCS := Engine/gamespy/darray.c \ - Engine/gamespy/gqueryreporting.c \ - Engine/gamespy/gserver.c \ - Engine/gamespy/gserverlist.c \ - Engine/gamespy/hashtable.c \ - Engine/gamespy/nonport.c +ENGINEGAMEAGENTSRCS := Engine/GameAgent/GameAgent.cpp ENGINETERRAINSRCS := Engine/Terrain/ArrayHolder.cpp \ Engine/Terrain/Terrain.cpp \ @@ -309,10 +300,6 @@ ENGINETERRAINSRCS := Engine/Terrain/ArrayHolder.cpp \ Engine/Terrain/TerrainRender.cpp \ Engine/Terrain/TerrainTile.cpp - -# this code is included in Engine/gamespy/gqueryreporting, too... -#ENGINEGAMESPYSRCS += Engine/gamespy/gutil.c - ENGINERENDERINGSRCS := Engine/Rendering/Render.cpp \ Engine/Rendering/RenderProfile.cpp \ Engine/Rendering/SelectOnRender.cpp @@ -390,7 +377,7 @@ ENGINESRCS := Engine/Engine.cpp \ $(ENGINESOUNDSRCS) \ $(ENGINETEMPLATESSRCS) \ $(ENGINEWORLDSRCS) \ - $(ENGINEGAMESPYSRCS) \ + $(ENGINEGAMEAGENTSRCS) \ $(ENGINEZLIBSRCS) OBJS1 := $(ENGINESRCS:.c=.o) @@ -844,7 +831,7 @@ $(BINDIR) : mkdir -p $(BINDIR)/Engine/Templates mkdir -p $(BINDIR)/Engine/World mkdir -p $(BINDIR)/Engine/Terrain - mkdir -p $(BINDIR)/Engine/gamespy + mkdir -p $(BINDIR)/Engine/GameAgent mkdir -p $(BINDIR)/Engine/zlib mkdir -p $(BINDIR)/DedicatedServer mkdir -p $(BINDIR)/Entities