From 50d5e1bc64b49d4ca134c6b539208833536c7b46 Mon Sep 17 00:00:00 2001 From: Casey Williams Date: Fri, 28 Aug 2026 14:21:23 -0500 Subject: [PATCH 1/2] Fix SControl socket portability on Linux --- .github/workflows/openw3d.yml | 1 + Code/SControl/servercontrolsocket.cpp | 25 ++++++++++++++++--------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/.github/workflows/openw3d.yml b/.github/workflows/openw3d.yml index c9f639321..eb2ac4b9a 100644 --- a/.github/workflows/openw3d.yml +++ b/.github/workflows/openw3d.yml @@ -71,6 +71,7 @@ jobs: --target scripts bandtest + scontrol wwsaveload wwmath wwutil diff --git a/Code/SControl/servercontrolsocket.cpp b/Code/SControl/servercontrolsocket.cpp index b9040804d..3851177eb 100644 --- a/Code/SControl/servercontrolsocket.cpp +++ b/Code/SControl/servercontrolsocket.cpp @@ -45,6 +45,13 @@ #include "servercontrolsocket.h" #include "systimer.h" #include +#include + +#ifdef _WIN32 +using SocketLength = int; +#else +using SocketLength = socklen_t; +#endif /* ** All instances are tracked here. @@ -155,8 +162,8 @@ bool ServerControlSocketClass::Open(int port, bool loopback, unsigned int ip) } DebugString(("ServerControlSocketClass - About to bind the UDP socket to port %d\n", port)); - if (bind (Socket, (LPSOCKADDR)&addr, sizeof(addr) ) == SOCKET_ERROR) { - DebugString(("ServerControlSocketClass - bind failed with error code %d\n", WSAGetLastError())); + if (bind (Socket, (sockaddr*)&addr, sizeof(addr) ) == SOCKET_ERROR) { + DebugString(("ServerControlSocketClass - bind failed with error code %d\n", LAST_ERROR)); Close(); return(false); } @@ -315,7 +322,7 @@ void ServerControlSocketClass::Discard_Out_Buffers(void) void ServerControlSocketClass::Clear_Socket_Error(void) { unsigned int error_code; - int length = 4; + SocketLength length = sizeof(error_code); if (Socket != INVALID_SOCKET) { getsockopt (Socket, SOL_SOCKET, SO_ERROR, (char*)&error_code, &length); @@ -733,7 +740,7 @@ void ServerControlSocketClass::Service(void) { u_long bytes; struct sockaddr_in addr; - int addr_len; + SocketLength addr_len; WinsockBufferType *packet; int result; unsigned int timeout_check = TIMEGETTIME(); @@ -748,7 +755,7 @@ void ServerControlSocketClass::Service(void) break; } times++; - Sleep(0); + std::this_thread::yield(); /* ** @@ -778,7 +785,7 @@ void ServerControlSocketClass::Service(void) ** Call recvfrom function to get the outstanding packet. */ addr_len = sizeof(addr); - result = recvfrom(Socket, (char*)ReceiveBuffer, sizeof(ReceiveBuffer), 0, (LPSOCKADDR)&addr, &addr_len); + result = recvfrom(Socket, (char*)ReceiveBuffer, sizeof(ReceiveBuffer), 0, (sockaddr*)&addr, &addr_len); /* ** See if we got an error. @@ -864,7 +871,7 @@ void ServerControlSocketClass::Service(void) break; } times++; - Sleep(0); + std::this_thread::yield(); /* ** Get a pointer to the first packet. @@ -888,7 +895,7 @@ void ServerControlSocketClass::Service(void) /* ** Send it. */ - result = sendto(Socket, ((char const *)packet->Buffer) - sizeof(packet->CRC), packet->BufferLen + sizeof(packet->CRC), 0, (LPSOCKADDR)&addr, sizeof (addr)); + result = sendto(Socket, ((char const *)packet->Buffer) - sizeof(packet->CRC), packet->BufferLen + sizeof(packet->CRC), 0, (const sockaddr*)&addr, sizeof (addr)); if (result == SOCKET_ERROR){ if (LAST_ERROR != WSAEWOULDBLOCK) { @@ -900,7 +907,7 @@ void ServerControlSocketClass::Service(void) ** No more room for outgoing packets. */ DebugString(("ServerControlSocketClass - sendto returned WSAEWOULDBLOCK\n")); - Sleep(0); + std::this_thread::yield(); } break; } From 4d4ca9558ce69daec6da493f709dcf3f92c798f4 Mon Sep 17 00:00:00 2001 From: Casey Williams Date: Fri, 28 Aug 2026 19:38:18 -0500 Subject: [PATCH 2/2] Use socklen_t for SControl socket lengths --- Code/SControl/servercontrolsocket.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Code/SControl/servercontrolsocket.cpp b/Code/SControl/servercontrolsocket.cpp index 3851177eb..5bf6928c2 100644 --- a/Code/SControl/servercontrolsocket.cpp +++ b/Code/SControl/servercontrolsocket.cpp @@ -48,9 +48,7 @@ #include #ifdef _WIN32 -using SocketLength = int; -#else -using SocketLength = socklen_t; +typedef int socklen_t; #endif /* @@ -322,7 +320,7 @@ void ServerControlSocketClass::Discard_Out_Buffers(void) void ServerControlSocketClass::Clear_Socket_Error(void) { unsigned int error_code; - SocketLength length = sizeof(error_code); + socklen_t length = sizeof(error_code); if (Socket != INVALID_SOCKET) { getsockopt (Socket, SOL_SOCKET, SO_ERROR, (char*)&error_code, &length); @@ -740,7 +738,7 @@ void ServerControlSocketClass::Service(void) { u_long bytes; struct sockaddr_in addr; - SocketLength addr_len; + socklen_t addr_len; WinsockBufferType *packet; int result; unsigned int timeout_check = TIMEGETTIME();