From 42b87478c0e43c9d649eeacd373ad9b00606578e Mon Sep 17 00:00:00 2001 From: AnmiTaliDev Date: Tue, 4 Aug 2026 10:12:40 +0500 Subject: [PATCH] fix(freebsd): correct platform macros, missing includes, and printf/variadic bugs --- CMakeLists.txt | 4 ++-- binding-mri/binding-mri.cpp | 5 ++--- binding-mri/binding-util.h | 1 + binding-mri/journal-binding.cpp | 4 ++-- binding-mri/niko-binding.cpp | 2 +- binding-mri/screen-binding.cpp | 21 +++++++++++++++++---- src/main.cpp | 2 +- src/meow.cpp | 27 +++++++++++++++++---------- src/modloader.cpp | 1 - src/xdg-user-dir-lookup.c | 1 + 10 files changed, 44 insertions(+), 24 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fea6217..0aea0ea 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -153,7 +153,7 @@ elseif(LINUX) list(APPEND MAIN_HEADERS src/xdg-user-dir-lookup.h) elseif(BSD) find_package(PkgConfig REQUIRED) - pkg_check_modules(LINUXPKGS REQUIRED gtk+-3.0) + pkg_check_modules(LINUXPKGS REQUIRED gtk+-3.0 libxfconf-0) include_directories(${LINUXPKGS_INCLUDE_DIRS}) add_compile_options(${LINUXPKGS_CFLAGS_OTHER}) list(APPEND PLATFORM_LIBRARIES ${LINUXPKGS_LDFLAGS}) @@ -421,7 +421,7 @@ find_package(Ruby 3.0 REQUIRED COMPONENTS Development) pkg_check_modules(VORBISFILE REQUIRED vorbisfile) find_package_handle_standard_args(pixman-1 DEFAULT_MSG PIXMAN_LIBRARY PIXMAN_INCLUDE_DIR) mark_as_advanced(PIXMAN_INCLUDE_DIR PIXMAN_LIBRARY) -find_package(OpenSSL CONFIG REQUIRED COMPONENTS Crypto) +find_package(OpenSSL REQUIRED COMPONENTS Crypto) pkg_check_modules(SIGC2 REQUIRED sigc++-2.0) target_compile_definitions(${PROJECT_NAME} PRIVATE ${DEFINES}) diff --git a/binding-mri/binding-mri.cpp b/binding-mri/binding-mri.cpp index f70b5db..0a760c5 100644 --- a/binding-mri/binding-mri.cpp +++ b/binding-mri/binding-mri.cpp @@ -36,7 +36,6 @@ #include "sunshine.h" #include "modloader.h" -#include #include #include #include @@ -380,7 +379,7 @@ static void runCustomScript(const std::string &filename){ std::string scriptData; if (!readFileSDL(filename.c_str(), scriptData)){ - crash(Exception::MEOW, "Unable to open %s", filename); + crash(Exception::MEOW, "Unable to open %s", filename.c_str()); return; } @@ -412,7 +411,7 @@ static void runRMXPScripts(BacktraceData &btData){ try{ scriptArray = kernelLoadDataInt(scriptPack.c_str(), false); }catch (const Exception &e){ - crash(Exception::MEOW, "Failed to read script data: %s", e.msg); + crash(Exception::MEOW, "Failed to read script data: %s", e.msg.c_str()); return; } diff --git a/binding-mri/binding-util.h b/binding-mri/binding-util.h index 8964139..d549bc1 100644 --- a/binding-mri/binding-util.h +++ b/binding-mri/binding-util.h @@ -26,6 +26,7 @@ //костыль ебаный сука #undef snprintf #undef inline +#undef close #include "exception.h" diff --git a/binding-mri/journal-binding.cpp b/binding-mri/journal-binding.cpp index 0f84e1a..ce91ace 100644 --- a/binding-mri/journal-binding.cpp +++ b/binding-mri/journal-binding.cpp @@ -19,7 +19,7 @@ #include #include #include - #ifdef OS_LINUX + #ifdef __linux__ #include #endif #include @@ -164,7 +164,7 @@ void journalBindingInit(){ mutex = SDL_CreateMutex(); SDL_memset((char*)lang_buffer, 0, BUFFER_SIZE); lang_buffer[0] = '_'; -#if defined __linux +#ifdef unix_like mkfifo(PIPE_PATH.c_str(), 0666); atexit(cleanup_pipe); #endif diff --git a/binding-mri/niko-binding.cpp b/binding-mri/niko-binding.cpp index ec8e169..33e0d8e 100644 --- a/binding-mri/niko-binding.cpp +++ b/binding-mri/niko-binding.cpp @@ -19,7 +19,7 @@ #include #include #include - #ifdef OS_LINUX + #ifdef __linux__ #include #endif #include diff --git a/binding-mri/screen-binding.cpp b/binding-mri/screen-binding.cpp index 92c2551..cbcd18e 100644 --- a/binding-mri/screen-binding.cpp +++ b/binding-mri/screen-binding.cpp @@ -6,6 +6,10 @@ #include "sharedstate.h" #include "pipe.h" +#if defined __FreeBSD__ || defined __DragonFly__ +#include +#endif + static Pipe ipc; static void start(){ @@ -29,10 +33,19 @@ static void start(){ #else #if defined unix_like char path[PATH_MAX]; - ssize_t len = readlink("/proc/self/exe", path, PATH_MAX); - if (len == -1) - rb_raise(rb_eRuntimeError, "Cannot determine path of running executable"); - std::string exename = std::string(path, len); + std::string exename; + #if defined __FreeBSD__ || defined __DragonFly__ + int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1}; + size_t size = sizeof(path); + if (sysctl(mib, 4, path, &size, NULL, 0) != 0) + rb_raise(rb_eRuntimeError, "Cannot determine path of running executable"); + exename = std::string(path); + #else + ssize_t len = readlink("/proc/self/exe", path, PATH_MAX); + if (len == -1) + rb_raise(rb_eRuntimeError, "Cannot determine path of running executable"); + exename = std::string(path, len); + #endif #else #endif diff --git a/src/main.cpp b/src/main.cpp index 7444034..e31d06f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -293,7 +293,7 @@ int main(int argc, char *argv[]){ if (!conf.gameFolder.empty()){ if (chdir(conf.gameFolder.c_str()) != 0){ - crash(Exception::MEOW, "Unable to switch into gameFolder %s", conf.gameFolder); + crash(Exception::MEOW, "Unable to switch into gameFolder %s", conf.gameFolder.c_str()); return 0; } } diff --git a/src/meow.cpp b/src/meow.cpp index 58a3b62..98943c1 100644 --- a/src/meow.cpp +++ b/src/meow.cpp @@ -23,6 +23,9 @@ #include #include #include +#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) || defined(__NetBSD__) +#define BOOST_STACKTRACE_GNU_SOURCE_NOT_REQUIRED +#endif #include #include #include "sunshine.h" @@ -83,15 +86,19 @@ void crash(Exception::Type t, const char *fmt, ...){ o << "[BOOST stacktrace()]" << std::endl; o << boost::stacktrace::stacktrace() << std::endl; o << "[OpenGL]" << std::endl; - try{ - o << "GL Vendor: " << glGetStringInt(GL_VENDOR) << std::endl; - o << "GL Renderer: " << glGetStringInt(GL_RENDERER) << std::endl; - o << "GL Version: " << glGetStringInt(GL_VERSION) << std::endl; - o << "GLSL Version: " << glGetStringInt(GL_SHADING_LANGUAGE_VERSION) << std::endl; - o << "Shading language version: " << glGetStringInt(GL_SHADING_LANGUAGE_VERSION) << std::endl; - o << "GL Extensions: " << glGetStringInt(GL_EXTENSIONS) << std::endl; - }catch(const std::exception& e){ - o << "Crashed before OpenGL initialization: " << e.what() << std::endl; + if (gl.GetString){ + try{ + o << "GL Vendor: " << glGetStringInt(GL_VENDOR) << std::endl; + o << "GL Renderer: " << glGetStringInt(GL_RENDERER) << std::endl; + o << "GL Version: " << glGetStringInt(GL_VERSION) << std::endl; + o << "GLSL Version: " << glGetStringInt(GL_SHADING_LANGUAGE_VERSION) << std::endl; + o << "Shading language version: " << glGetStringInt(GL_SHADING_LANGUAGE_VERSION) << std::endl; + o << "GL Extensions: " << glGetStringInt(GL_EXTENSIONS) << std::endl; + }catch(const std::exception& e){ + o << "Crashed before OpenGL initialization: " << e.what() << std::endl; + } + }else{ + o << "OpenGL not initialized yet" << std::endl; } o << "[Versions of libs]" << std::endl; const int sdlcompiled = SDL_VERSION; @@ -146,7 +153,7 @@ void crash(Exception::Type t, const char *fmt, ...){ } } - if(!t == Exception::MEOW) + if(t != Exception::MEOW) throw Exception(t, msg); } diff --git a/src/modloader.cpp b/src/modloader.cpp index b641ffe..6ed87a2 100644 --- a/src/modloader.cpp +++ b/src/modloader.cpp @@ -17,7 +17,6 @@ #include #include #include -#include #include #include #include diff --git a/src/xdg-user-dir-lookup.c b/src/xdg-user-dir-lookup.c index c3b5d2f..0250a55 100644 --- a/src/xdg-user-dir-lookup.c +++ b/src/xdg-user-dir-lookup.c @@ -27,6 +27,7 @@ #include "xdg-user-dir-lookup.h" +#include #include /** * xdg_user_dir_lookup_with_fallback: