From 1c858ae8351b446e99eb99c95c6b440d440f13c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Revol?= Date: Sat, 15 Feb 2025 04:26:10 +0100 Subject: [PATCH] InitSystem (Haiku): add support --- CMakeLists.txt | 2 +- src/detection/initsystem/initsystem_haiku.cpp | 52 +++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/detection/initsystem/initsystem_haiku.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 875f35a2..64a5bed2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1148,7 +1148,7 @@ elseif(Haiku) src/detection/gtk_qt/gtk.c src/detection/host/host_windows.c src/detection/icons/icons_nosupport.c - src/detection/initsystem/initsystem_linux.c + src/detection/initsystem/initsystem_haiku.cpp src/detection/keyboard/keyboard_nosupport.c src/detection/libc/libc_nosupport.c src/detection/lm/lm_nosupport.c diff --git a/src/detection/initsystem/initsystem_haiku.cpp b/src/detection/initsystem/initsystem_haiku.cpp new file mode 100644 index 00000000..7714133a --- /dev/null +++ b/src/detection/initsystem/initsystem_haiku.cpp @@ -0,0 +1,52 @@ +extern "C" { +#include "initsystem.h" +#include "common/processing.h" +#include "util/binary.h" +#include "util/stringUtils.h" +}; + +#include +#include +#include +#include +#include +#include + +const char* ffDetectInitSystem(FFInitSystemResult* result) +{ + team_info teamInfo; + int32 cookie = 0; + + // Since it runs first, registrar does not know about it, + // so we can't query be_roster for it. + BPath path("/boot/system/servers/launch_daemon"); + if (path.InitCheck() != B_OK) + return NULL; + + ffStrbufSetS(&result->exe, path.Path()); + ffStrbufSetStatic(&result->name, "launch_daemon"); + + while (get_next_team_info(&cookie, &teamInfo) == B_OK) + { + if (strcmp(teamInfo.args, path.Path()) == 0) + { + result->pid = (int)teamInfo.team; + break; + } + } + + BFile f(path.Path(), B_READ_ONLY); + if (f.InitCheck() != B_OK) + return NULL; + BAppFileInfo fileInfo(&f); + if (f.InitCheck() != B_OK) + return NULL; + + version_info version; + if (fileInfo.GetVersionInfo(&version, B_SYSTEM_VERSION_KIND) != B_OK) + return NULL; + + ffStrbufSetF(&result->version, "%d.%d.%d", (int)version.major, (int)version.middle, (int)version.minor); + + return NULL; +}