#ifndef __INC_LIBTHECORE_STDAFX_H__ #define __INC_LIBTHECORE_STDAFX_H__ #if defined(__GNUC__) #define INLINE __inline__ #elif defined(_MSC_VER) #define INLINE inline #endif #ifdef __WIN32__ #define WIN32_LEAN_AND_MEAN #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "xdirent.h" #include "xgetopt.h" #define S_ISDIR(m) (m & _S_IFDIR) #define snprintf _snprintf struct timespec { time_t tv_sec; /* seconds */ long tv_nsec; /* and nanoseconds */ }; #define __USE_SELECT__ #define PATH_MAX _MAX_PATH // C runtime library adjustments #define strlcat(dst, src, size) strcat_s(dst, size, src) #define strlcpy(dst, src, size) strncpy_s(dst, size, src, _TRUNCATE) #define strtoull(str, endptr, base) _strtoui64(str, endptr, base) #define strtof(str, endptr) (float)strtod(str, endptr) #define strcasecmp(s1, s2) stricmp(s1, s2) #define strncasecmp(s1, s2, n) strnicmp(s1, s2, n) #define atoll(str) _atoi64(str) #define localtime_r(timet, result) localtime_s(result, timet) #define strtok_r(s, delim, ptrptr) strtok_s(s, delim, ptrptr) #include #define __typeof(t) BOOST_TYPEOF(t) // dummy declaration of non-supported signals #define SIGUSR1 30 /* user defined signal 1 */ #define SIGUSR2 31 /* user defined signal 2 */ inline void usleep(unsigned long usec) { ::Sleep(usec / 1000); } inline unsigned sleep(unsigned sec) { ::Sleep(sec * 1000); return 0; } inline double rint(double x) { return ::floor(x+.5); } #else /* ### LINUX-BLOCK-BEGIN (stdafx.h __USE_SELECT__) ####################### */ /* Linux gets the epoll backend in fdwatch.c, so it must NOT fall back to the * select() one. That branch is not merely slow here, it is wrong: * - it calls select(0, ...); nfds == 0 is fine on Windows where the * argument is ignored, but on Linux it means "watch nothing"; * - game calls fdwatch_new(4096) while FD_SETSIZE is 1024, and * socket_accept() (socket.c:232) accepts descriptors up to 65500; * - it uses a compacted index model and swap-removes on delete, whereas * db's RemovePeer() deletes mid-iteration, which would silently re-point * later event indices at the wrong peer. * The original directive is the "#ifndef __FreeBSD__" preserved below. */ #if !defined(__FreeBSD__) && !defined(__linux__) /* ### LINUX-BLOCK-END (stdafx.h __USE_SELECT__) ######################### */ #define __USE_SELECT__ #ifdef __CYGWIN__ #define _POSIX_SOURCE 1 #endif #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef __FreeBSD__ #include #endif /* ### LINUX-BLOCK-BEGIN (stdafx.h linux headers) ######################## */ #if defined(__linux__) /* ------------------------------------------------------------------------ * Linux port. kqueue(2) does not exist here; fdwatch.c implements the same * public API on top of epoll(7). See the "#if defined(__linux__)" branch of * fdwatch.c. * ---------------------------------------------------------------------- */ #include #include #include #include /* SIOCOUTQ - used to emulate EVFILT_WRITE's "free space in the socket send buffer" */ #include /* getrandom() - stands in for srandomdev() */ #endif /* ### LINUX-BLOCK-END (stdafx.h linux headers) ########################## */ #endif /* ### LINUX-BLOCK-BEGIN (stdafx.h strlcpy) ############################## */ #if defined(__linux__) /* ------------------------------------------------------------------------ * strlcpy()/strlcat() are BSD extensions. glibc only gained them in 2.38 * (Ubuntu 24.04 / Debian 13 and newer); on anything older libthecore ships * the canonical OpenBSD implementation in strlcpy.c. The prototypes below * are byte-compatible with both glibc's and OpenBSD's, so declaring them is * harmless when the C library already provides them - but we only do so when * it does not, to avoid clashing with glibc's __restrict qualified * declarations. * * Every other module (game, db, libgame, libsql, ...) includes this header * through its own stdafx.h, so this one place covers all 65 call sites. * * NOTE: the __WIN32__ branch above #defines strlcpy/strlcat as macros; this * branch is in the #else half of that same #ifdef chain, so the two can never * collide. * ---------------------------------------------------------------------- */ #if defined(__GLIBC__) && defined(__GLIBC_PREREQ) #if __GLIBC_PREREQ(2, 38) #define THECORE_HAVE_STRLCPY 1 #endif #endif #ifndef THECORE_HAVE_STRLCPY #ifdef __cplusplus extern "C" { #endif extern size_t strlcpy(char * dst, const char * src, size_t siz); extern size_t strlcat(char * dst, const char * src, size_t siz); #ifdef __cplusplus } #endif #endif #endif /* ### LINUX-BLOCK-END (stdafx.h strlcpy) ################################ */ /* ### LINUX-BLOCK-BEGIN (stdafx.h false/true) ########################### */ /* --------------------------------------------------------------------------- * "false" and "true" are keywords in C++, not macros, so "#ifndef false" is * always true and the two #defines below turn them into the *int* 0 and 1 for * every translation unit that includes this header. * * That is fatal on Linux under -std=c++23 (the standard game/src/Makefile and * db/src/Makefile both use). libstdc++ 13 writes constraints such as * * requires __is_signed_int128<_Tp> || false * * in , and with "false" rewritten to 0 the compiler * rejects them: "error: constraint '0' has type 'int', not 'bool'". It fires * hundreds of times for any TU that includes , , , * ... after this header - which is exactly what game/src/stdafx.h does * (it includes this file at line 9 and the STL headers at lines 15-27), so it * would break essentially all of game/ and db/. * * The C++ keywords already are what these macros try to provide: FALSE/TRUE * below still evaluate to 0 and 1, just with type bool instead of int, and * both promote to the same int in every context this tree uses them * (comparisons, varargs, assignment to int/BYTE fields). * * The FreeBSD/Windows path keeps the original #ifndef block verbatim. * ------------------------------------------------------------------------- */ #if !(defined(__linux__) && defined(__cplusplus)) #ifndef false #define false 0 #define true (!false) #endif #endif /* ### LINUX-BLOCK-END (stdafx.h false/true) ############################# */ #ifndef FALSE #define FALSE false #define TRUE (!FALSE) #endif #include "typedef.h" #include "heart.h" #include "fdwatch.h" #include "socket.h" #include "kstbl.h" #include "hangul.h" #include "buffer.h" #include "signal.h" #include "log.h" #include "main.h" #include "utils.h" #include "crypt.h" #include "memcpy.h" #endif // __INC_LIBTHECORE_STDAFX_H__