diff --git a/src/detection/os/os_haiku.c b/src/detection/os/os_haiku.c index bb83ddeb1..82b934a3a 100644 --- a/src/detection/os/os_haiku.c +++ b/src/detection/os/os_haiku.c @@ -1,20 +1,89 @@ #include "os.h" -#include "common/io/io.h" - #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 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); + } }