OS (Haiku): detect OS beta version

This commit is contained in:
Carter Li 2025-02-18 20:24:13 +08:00
parent 1137e8d1c9
commit bc129a65d9

View File

@ -1,20 +1,89 @@
#include "os.h"
#include "common/io/io.h"
#include <OS.h>
#include <image.h>
// https://github.com/haiku/haiku/blob/e63683b2fb337d2034059a7e053c170eaf978142/headers/os/BeBuild.h#L36
#ifndef B_HAIKU_VERSION_1_PRE_BETA_6
#define B_HAIKU_VERSION_1_PRE_BETA_6 0x00000901
#endif
#ifndef B_HAIKU_VERSION_1_BETA_6
#define B_HAIKU_VERSION_1_BETA_6 0x00000A00
#endif
#ifndef B_HAIKU_VERSION_1_PRE_BETA_7
#define B_HAIKU_VERSION_1_PRE_BETA_7 0x00000A01
#endif
#ifndef B_HAIKU_VERSION_1_BETA_7
#define B_HAIKU_VERSION_1_BETA_7 0x00000B00
#endif
#ifndef B_HAIKU_VERSION_1_PRE_BETA_8
#define B_HAIKU_VERSION_1_PRE_BETA_8 0x00000B01
#endif
#ifndef B_HAIKU_VERSION_1_BETA_8
#define B_HAIKU_VERSION_1_BETA_8 0x00000C00
#endif
#ifndef B_HAIKU_VERSION_1_PRE_BETA_9
#define B_HAIKU_VERSION_1_PRE_BETA_9 0x00000C01
#endif
#ifndef B_HAIKU_VERSION_1_BETA_9
#define B_HAIKU_VERSION_1_BETA_9 0x00000D00
#endif
#ifndef B_HAIKU_VERSION_1
#define B_HAIKU_VERSION_1 0x00010000
#endif
void ffDetectOSImpl(FFOSResult* os)
{
system_info info;
system_info sys;
ffStrbufSetStatic(&os->name, "Haiku");
ffStrbufSetStatic(&os->prettyName, "Haiku");
ffStrbufSetStatic(&os->id, "haiku");
if (get_system_info(&info) != B_OK)
return;
ffStrbufAppendF(&os->version, "R%ld", info.kernel_version);
image_info image;
int32 cookie = 0;
while (get_next_image_info(B_SYSTEM_TEAM, &cookie, &image) == B_OK)
{
if (image.api_version > 0)
{
switch (image.api_version)
{
#define FF_TEST_HAIKU_VERSION(versionNum, versionStr) \
case B_HAIKU_VERSION_ ## versionNum: \
ffStrbufSetStatic(&os->version, versionStr); \
break;
// TODO: check kernel resources?
FF_TEST_HAIKU_VERSION(1_ALPHA_1, "R1A1")
FF_TEST_HAIKU_VERSION(1_PRE_ALPHA_2, "R1AP2")
FF_TEST_HAIKU_VERSION(1_ALPHA_2, "R1A2")
FF_TEST_HAIKU_VERSION(1_PRE_ALPHA_3, "R1AP3")
FF_TEST_HAIKU_VERSION(1_ALPHA_3, "R1A3")
FF_TEST_HAIKU_VERSION(1_PRE_ALPHA_4, "R1AP4")
FF_TEST_HAIKU_VERSION(1_ALPHA_4, "R1A4")
FF_TEST_HAIKU_VERSION(1_PRE_BETA_1, "R1BP1")
FF_TEST_HAIKU_VERSION(1_BETA_1, "R1B1")
FF_TEST_HAIKU_VERSION(1_PRE_BETA_2, "R1BP2")
FF_TEST_HAIKU_VERSION(1_BETA_2, "R1B2")
FF_TEST_HAIKU_VERSION(1_PRE_BETA_3, "R1BP3")
FF_TEST_HAIKU_VERSION(1_BETA_3, "R1B3")
FF_TEST_HAIKU_VERSION(1_PRE_BETA_4, "R1BP4")
FF_TEST_HAIKU_VERSION(1_BETA_4, "R1B4")
FF_TEST_HAIKU_VERSION(1_PRE_BETA_5, "R1BP5")
FF_TEST_HAIKU_VERSION(1_BETA_5, "R1B5")
FF_TEST_HAIKU_VERSION(1_PRE_BETA_6, "R1BP6")
FF_TEST_HAIKU_VERSION(1_BETA_6, "R1B6")
FF_TEST_HAIKU_VERSION(1_PRE_BETA_7, "R1BP7")
FF_TEST_HAIKU_VERSION(1_BETA_7, "R1B7")
FF_TEST_HAIKU_VERSION(1_PRE_BETA_8, "R1BP8")
FF_TEST_HAIKU_VERSION(1_BETA_8, "R1B8")
}
break;
}
}
if (!os->version.length)
{
if (get_system_info(&sys) == B_OK)
ffStrbufAppendF(&os->version, "R%ld", sys.kernel_version);
}
}