From 2b3a0198640c23a7f8f8247ed1edae309c11e15f Mon Sep 17 00:00:00 2001 From: Oskari Alaranta Date: Thu, 31 Jul 2025 22:15:43 +0300 Subject: [PATCH 1/2] add support for banan-os --- engine/common/net_http.c | 4 +++- engine/common/net_ws.c | 17 +++++++++++++++++ engine/common/whereami.c | 16 ++++++++++++++++ engine/platform/posix/lib_posix.c | 2 ++ public/build.c | 2 ++ public/build.h | 3 +++ public/buildenums.h | 3 +++ 7 files changed, 46 insertions(+), 1 deletion(-) diff --git a/engine/common/net_http.c b/engine/common/net_http.c index ff6fd41b..ebb5bbad 100644 --- a/engine/common/net_http.c +++ b/engine/common/net_http.c @@ -261,14 +261,16 @@ static int HTTP_FileCreateSocket( httpfile_t *file ) return 0; } +#if !XASH_BANAN_OS if( ioctlsocket( file->socket, FIONBIO, (void *)&mode ) < 0 ) { Con_Printf( S_ERROR "%s: ioctl() returned %s\n", __func__, NET_ErrorString()); HTTP_FreeFile( file, true ); return 0; } +#endif -#if XASH_LINUX +#if XASH_LINUX || XASH_BANAN_OS res = fcntl( file->socket, F_GETFL, 0 ); diff --git a/engine/common/net_ws.c b/engine/common/net_ws.c index 7ee4cba0..e93a2410 100644 --- a/engine/common/net_ws.c +++ b/engine/common/net_ws.c @@ -1364,7 +1364,12 @@ static qboolean NET_QueuePacket( netsrc_t sock, netadr_t *from, byte *data, size byte buf[NET_MAX_FRAGMENT]; int ret, protocol; int net_socket; +#ifdef XASH_BANAN_OS + socklen_t addr_len; +#else WSAsize_t addr_len; +#endif + struct sockaddr_storage addr = { 0 }; *length = 0; @@ -1617,7 +1622,11 @@ static int NET_IPSocket( const char *net_iface, int port, int family ) if( family == AF_INET6 ) pfamily = PF_INET6; +#ifdef SOCK_NONBLOCK + if( NET_IsSocketError(( net_socket = socket( pfamily, SOCK_DGRAM | SOCK_NONBLOCK, IPPROTO_UDP )))) +#else if( NET_IsSocketError(( net_socket = socket( pfamily, SOCK_DGRAM, IPPROTO_UDP )))) +#endif { err = WSAGetLastError(); if( err != WSAEAFNOSUPPORT ) @@ -1625,6 +1634,7 @@ static int NET_IPSocket( const char *net_iface, int port, int family ) return INVALID_SOCKET; } +#ifndef SOCK_NONBLOCK if( NET_IsSocketError( ioctlsocket( net_socket, FIONBIO, (void*)&_true ))) { struct timeval timeout; @@ -1634,6 +1644,7 @@ static int NET_IPSocket( const char *net_iface, int port, int family ) timeout.tv_sec = timeout.tv_usec = 0; setsockopt( net_socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)); } +#endif // make it broadcast capable if( NET_IsSocketError( setsockopt( net_socket, SOL_SOCKET, SO_BROADCAST, (char *)&_true, sizeof( _true )))) @@ -1686,6 +1697,7 @@ static int NET_IPSocket( const char *net_iface, int port, int family ) optval = 0x10; // IPTOS_LOWDELAY Con_Printf( "Enabling LOWDELAY TOS option\n" ); +#ifdef IP_TOS if( NET_IsSocketError( setsockopt( net_socket, IPPROTO_IP, IP_TOS, (const char *)&optval, sizeof( optval )))) { err = WSAGetLastError(); @@ -1694,6 +1706,7 @@ static int NET_IPSocket( const char *net_iface, int port, int family ) closesocket( net_socket ); return INVALID_SOCKET; } +#endif } if( Sys_CheckParm( "-loopback" )) @@ -1801,7 +1814,11 @@ static void NET_DetermineLocalAddress( void ) char hostname[512]; char buff[512]; struct sockaddr_storage address; +#ifdef XASH_BANAN_OS + socklen_t namelen; +#else WSAsize_t namelen; +#endif const char *net_addr_string; memset( &net_local, 0, sizeof( netadr_t )); diff --git a/engine/common/whereami.c b/engine/common/whereami.c index 31726774..5b7ff504 100644 --- a/engine/common/whereami.c +++ b/engine/common/whereami.c @@ -851,6 +851,22 @@ int WAI_PREFIX(getModulePath)(char* out, int capacity, int* dirname_length) return -1; } +#elif defined(__banan_os__) + +/* Not possible on this platform */ + +WAI_FUNCSPEC +int WAI_PREFIX(getExecutablePath)(char* out, int capacity, int* dirname_length) +{ + return -1; +} + +WAI_FUNCSPEC +int WAI_PREFIX(getModulePath)(char* out, int capacity, int* dirname_length) +{ + return -1; +} + #else #error unsupported platform diff --git a/engine/platform/posix/lib_posix.c b/engine/platform/posix/lib_posix.c index 23d1c3b1..a5a84fe1 100644 --- a/engine/platform/posix/lib_posix.c +++ b/engine/platform/posix/lib_posix.c @@ -208,6 +208,7 @@ const char *COM_NameForFunction( void *hInstance, void *function ) return Loader_GetFuncName_int(wm, function); else #endif +#ifndef XASH_BANAN_OS // NOTE: dladdr() is a glibc extension { Dl_info info = {0}; @@ -215,6 +216,7 @@ const char *COM_NameForFunction( void *hInstance, void *function ) if( ret && info.dli_sname ) return COM_GetPlatformNeutralName( info.dli_sname ); } +#endif #ifdef XASH_ALLOW_SAVERESTORE_OFFSETS return COM_OffsetNameForFunction( function ); #else diff --git a/public/build.c b/public/build.c index 6c85bbaf..460b4040 100644 --- a/public/build.c +++ b/public/build.c @@ -151,6 +151,8 @@ const char *Q_PlatformStringByID( const int platform ) return "wasi"; case PLATFORM_SUNOS: return "sunos"; + case PLATFORM_BANAN_OS: + return "banan-os"; } assert( 0 ); diff --git a/public/build.h b/public/build.h index 3fdfeded..2752f8bd 100644 --- a/public/build.h +++ b/public/build.h @@ -82,6 +82,7 @@ Then you can use another oneliner to query all variables: #undef XASH_RISCV_SOFTFP #undef XASH_SERENITY #undef XASH_SUNOS +#undef XASH_BANAN_OS #undef XASH_TERMUX #undef XASH_WIN32 #undef XASH_X86 @@ -135,6 +136,8 @@ Then you can use another oneliner to query all variables: #define XASH_WASI 1 #elif defined __sun__ #define XASH_SUNOS 1 + #elif defined __banan_os__ + #define XASH_BANAN_OS 1 #elif defined __EMSCRIPTEN__ #define XASH_EMSCRIPTEN 1 #else diff --git a/public/buildenums.h b/public/buildenums.h index 4dc327d3..57585f73 100644 --- a/public/buildenums.h +++ b/public/buildenums.h @@ -43,6 +43,7 @@ GNU General Public License for more details. #define PLATFORM_PSVITA 14 #define PLATFORM_WASI 15 #define PLATFORM_SUNOS 16 +#define PLATFORM_BANAN_OS 17 #if XASH_WIN32 #define XASH_PLATFORM PLATFORM_WIN32 @@ -76,6 +77,8 @@ GNU General Public License for more details. #define XASH_PLATFORM PLATFORM_WASI #elif XASH_SUNOS #define XASH_PLATFORM PLATFORM_SUNOS +#elif XASH_BANAN_OS + #define XASH_PLATFORM PLATFORM_BANAN_OS #else #error #endif -- 2.50.1