From 143b3df771583816fc1e4270ddd3d32551d9c7a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 19 Feb 2025 10:47:21 +0800 Subject: [PATCH] OS (Haiku): calcuate OS version --- src/detection/os/os_haiku.c | 111 +++++++++++++++--------------------- 1 file changed, 46 insertions(+), 65 deletions(-) diff --git a/src/detection/os/os_haiku.c b/src/detection/os/os_haiku.c index 36135353..561bdcc6 100644 --- a/src/detection/os/os_haiku.c +++ b/src/detection/os/os_haiku.c @@ -2,39 +2,8 @@ #include #include -// 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 sys; - ffStrbufSetStatic(&os->name, "Haiku"); ffStrbufSetStatic(&os->id, "haiku"); @@ -43,49 +12,61 @@ void ffDetectOSImpl(FFOSResult* os) int32 cookie = 0; while (get_next_image_info(B_SYSTEM_TEAM, &cookie, &image) == B_OK) { - if (image.api_version > 0) + int32 ver = image.api_version; + if (ver == 0) continue; + + // https://github.com/haiku/haiku/blob/e63683b2fb337d2034059a7e053c170eaf978142/headers/os/BeBuild.h#L36 + if (ver < B_HAIKU_VERSION_1_ALPHA_1) { - switch (image.api_version) + switch (ver) { - #define FF_TEST_HAIKU_VERSION(versionNum, versionStr) \ - case B_HAIKU_VERSION_ ## versionNum: \ - ffStrbufSetStatic(&os->version, versionStr); \ - break; - - FF_TEST_HAIKU_VERSION(1_ALPHA_1, "R1A1") - FF_TEST_HAIKU_VERSION(1_PRE_ALPHA_2, "R1A2-") - FF_TEST_HAIKU_VERSION(1_ALPHA_2, "R1A2") - FF_TEST_HAIKU_VERSION(1_PRE_ALPHA_3, "R1A3-") - FF_TEST_HAIKU_VERSION(1_ALPHA_3, "R1A3") - FF_TEST_HAIKU_VERSION(1_PRE_ALPHA_4, "R1A4-") - FF_TEST_HAIKU_VERSION(1_ALPHA_4, "R1A4") - FF_TEST_HAIKU_VERSION(1_PRE_BETA_1, "R1B1-") - FF_TEST_HAIKU_VERSION(1_BETA_1, "R1B1") - FF_TEST_HAIKU_VERSION(1_PRE_BETA_2, "R1B2-") - FF_TEST_HAIKU_VERSION(1_BETA_2, "R1B2") - FF_TEST_HAIKU_VERSION(1_PRE_BETA_3, "R1B3-") - FF_TEST_HAIKU_VERSION(1_BETA_3, "R1B3") - FF_TEST_HAIKU_VERSION(1_PRE_BETA_4, "R1B4-") - FF_TEST_HAIKU_VERSION(1_BETA_4, "R1B4") - FF_TEST_HAIKU_VERSION(1_PRE_BETA_5, "R1B5-") - FF_TEST_HAIKU_VERSION(1_BETA_5, "R1B5") - FF_TEST_HAIKU_VERSION(1_PRE_BETA_6, "R1B6-") - FF_TEST_HAIKU_VERSION(1_BETA_6, "R1B6") - FF_TEST_HAIKU_VERSION(1_PRE_BETA_7, "R1B7-") - FF_TEST_HAIKU_VERSION(1_BETA_7, "R1B7") - FF_TEST_HAIKU_VERSION(1_PRE_BETA_8, "R1B8-") - FF_TEST_HAIKU_VERSION(1_BETA_8, "R1B8") - FF_TEST_HAIKU_VERSION(1_PRE_BETA_9, "R1B9-") - FF_TEST_HAIKU_VERSION(1_BETA_9, "R1B9") - FF_TEST_HAIKU_VERSION(1, "R1") + case B_HAIKU_VERSION_BEOS: + ffStrbufSetStatic(&os->version, "BEOS"); + break; + case B_HAIKU_VERSION_BONE: + ffStrbufSetStatic(&os->version, "BONE"); + break; + case B_HAIKU_VERSION_DANO: + ffStrbufSetStatic(&os->version, "DANO"); + break; } + } + else + { + int32 relVer = ver / 0x10000; + ver %= 0x10000; + if (ver == 0) + { + ffStrbufSetF(&os->version, "R%d", relVer); + } + else + { + relVer++; - break; + bool isPre = !!(ver & 1); + if (ver < B_HAIKU_VERSION_1_PRE_BETA_1) + { + int32 alphaVer = ver / 0x100; + if (isPre) + ffStrbufSetF(&os->version, "R%dA%d-", relVer, alphaVer + 1); + else + ffStrbufSetF(&os->version, "R%dA%d", relVer, alphaVer); + } + else if (ver < 0x00010000 /* B_HAIKU_VERSION_1 */) + { + int32 betaVer = (ver - B_HAIKU_VERSION_1_ALPHA_4) / 0x100; + if (isPre) + ffStrbufSetF(&os->version, "R%dB%d-", relVer, betaVer + 1); + else + ffStrbufSetF(&os->version, "R%dB%d", relVer, betaVer); + } + } } } if (!os->version.length) { + system_info sys; if (get_system_info(&sys) == B_OK) ffStrbufAppendF(&os->version, "R%ldx", sys.kernel_version); }