diff options
Diffstat (limited to 'src/detection/os/os_haiku.c')
| -rw-r--r-- | src/detection/os/os_haiku.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/detection/os/os_haiku.c b/src/detection/os/os_haiku.c new file mode 100644 index 0000000..e8e9f4a --- /dev/null +++ b/src/detection/os/os_haiku.c @@ -0,0 +1,66 @@ +#include "os.h" +#include <OS.h> +#include <image.h> +#include <inttypes.h> + +void ffDetectOSImpl(FFOSResult* os) { + ffStrbufSetStatic(&os->name, "Haiku"); + + ffStrbufSetStatic(&os->id, "haiku"); + + image_info image; + int32 cookie = 0; + while (get_next_image_info(B_SYSTEM_TEAM, &cookie, &image) == B_OK) { + 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 (ver) { + 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%" PRIi32, relVer); + } else { + relVer++; + + bool isPre = !!(ver & 1); + if (ver < B_HAIKU_VERSION_1_PRE_BETA_1) { + int32 alphaVer = ver / 0x100; + if (isPre) { + ffStrbufSetF(&os->version, "R%" PRId32 "A%" PRIi32 "-", relVer, alphaVer + 1); + } else { + ffStrbufSetF(&os->version, "R%" PRIi32 "A%" PRIi32, 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%" PRIi32 "B%" PRIi32 "-", relVer, betaVer + 1); + } else { + ffStrbufSetF(&os->version, "R%" PRIi32 "B%" PRIi32, relVer, betaVer); + } + } + } + } + } + + if (!os->version.length) { + system_info sys; + if (get_system_info(&sys) == B_OK) { + ffStrbufAppendF(&os->version, "R%" PRIx64, sys.kernel_version); + } + } +} |