Skip to content

Commit 143b3df

Browse files
committed
OS (Haiku): calcuate OS version
1 parent c0c59a8 commit 143b3df

File tree

1 file changed

+46
-65
lines changed

1 file changed

+46
-65
lines changed

src/detection/os/os_haiku.c

Lines changed: 46 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -2,39 +2,8 @@
22
#include <OS.h>
33
#include <image.h>
44

5-
// https://github.com/haiku/haiku/blob/e63683b2fb337d2034059a7e053c170eaf978142/headers/os/BeBuild.h#L36
6-
#ifndef B_HAIKU_VERSION_1_PRE_BETA_6
7-
#define B_HAIKU_VERSION_1_PRE_BETA_6 0x00000901
8-
#endif
9-
#ifndef B_HAIKU_VERSION_1_BETA_6
10-
#define B_HAIKU_VERSION_1_BETA_6 0x00000A00
11-
#endif
12-
#ifndef B_HAIKU_VERSION_1_PRE_BETA_7
13-
#define B_HAIKU_VERSION_1_PRE_BETA_7 0x00000A01
14-
#endif
15-
#ifndef B_HAIKU_VERSION_1_BETA_7
16-
#define B_HAIKU_VERSION_1_BETA_7 0x00000B00
17-
#endif
18-
#ifndef B_HAIKU_VERSION_1_PRE_BETA_8
19-
#define B_HAIKU_VERSION_1_PRE_BETA_8 0x00000B01
20-
#endif
21-
#ifndef B_HAIKU_VERSION_1_BETA_8
22-
#define B_HAIKU_VERSION_1_BETA_8 0x00000C00
23-
#endif
24-
#ifndef B_HAIKU_VERSION_1_PRE_BETA_9
25-
#define B_HAIKU_VERSION_1_PRE_BETA_9 0x00000C01
26-
#endif
27-
#ifndef B_HAIKU_VERSION_1_BETA_9
28-
#define B_HAIKU_VERSION_1_BETA_9 0x00000D00
29-
#endif
30-
#ifndef B_HAIKU_VERSION_1
31-
#define B_HAIKU_VERSION_1 0x00010000
32-
#endif
33-
345
void ffDetectOSImpl(FFOSResult* os)
356
{
36-
system_info sys;
37-
387
ffStrbufSetStatic(&os->name, "Haiku");
398

409
ffStrbufSetStatic(&os->id, "haiku");
@@ -43,49 +12,61 @@ void ffDetectOSImpl(FFOSResult* os)
4312
int32 cookie = 0;
4413
while (get_next_image_info(B_SYSTEM_TEAM, &cookie, &image) == B_OK)
4514
{
46-
if (image.api_version > 0)
15+
int32 ver = image.api_version;
16+
if (ver == 0) continue;
17+
18+
// https://github.com/haiku/haiku/blob/e63683b2fb337d2034059a7e053c170eaf978142/headers/os/BeBuild.h#L36
19+
if (ver < B_HAIKU_VERSION_1_ALPHA_1)
4720
{
48-
switch (image.api_version)
21+
switch (ver)
4922
{
50-
#define FF_TEST_HAIKU_VERSION(versionNum, versionStr) \
51-
case B_HAIKU_VERSION_ ## versionNum: \
52-
ffStrbufSetStatic(&os->version, versionStr); \
53-
break;
54-
55-
FF_TEST_HAIKU_VERSION(1_ALPHA_1, "R1A1")
56-
FF_TEST_HAIKU_VERSION(1_PRE_ALPHA_2, "R1A2-")
57-
FF_TEST_HAIKU_VERSION(1_ALPHA_2, "R1A2")
58-
FF_TEST_HAIKU_VERSION(1_PRE_ALPHA_3, "R1A3-")
59-
FF_TEST_HAIKU_VERSION(1_ALPHA_3, "R1A3")
60-
FF_TEST_HAIKU_VERSION(1_PRE_ALPHA_4, "R1A4-")
61-
FF_TEST_HAIKU_VERSION(1_ALPHA_4, "R1A4")
62-
FF_TEST_HAIKU_VERSION(1_PRE_BETA_1, "R1B1-")
63-
FF_TEST_HAIKU_VERSION(1_BETA_1, "R1B1")
64-
FF_TEST_HAIKU_VERSION(1_PRE_BETA_2, "R1B2-")
65-
FF_TEST_HAIKU_VERSION(1_BETA_2, "R1B2")
66-
FF_TEST_HAIKU_VERSION(1_PRE_BETA_3, "R1B3-")
67-
FF_TEST_HAIKU_VERSION(1_BETA_3, "R1B3")
68-
FF_TEST_HAIKU_VERSION(1_PRE_BETA_4, "R1B4-")
69-
FF_TEST_HAIKU_VERSION(1_BETA_4, "R1B4")
70-
FF_TEST_HAIKU_VERSION(1_PRE_BETA_5, "R1B5-")
71-
FF_TEST_HAIKU_VERSION(1_BETA_5, "R1B5")
72-
FF_TEST_HAIKU_VERSION(1_PRE_BETA_6, "R1B6-")
73-
FF_TEST_HAIKU_VERSION(1_BETA_6, "R1B6")
74-
FF_TEST_HAIKU_VERSION(1_PRE_BETA_7, "R1B7-")
75-
FF_TEST_HAIKU_VERSION(1_BETA_7, "R1B7")
76-
FF_TEST_HAIKU_VERSION(1_PRE_BETA_8, "R1B8-")
77-
FF_TEST_HAIKU_VERSION(1_BETA_8, "R1B8")
78-
FF_TEST_HAIKU_VERSION(1_PRE_BETA_9, "R1B9-")
79-
FF_TEST_HAIKU_VERSION(1_BETA_9, "R1B9")
80-
FF_TEST_HAIKU_VERSION(1, "R1")
23+
case B_HAIKU_VERSION_BEOS:
24+
ffStrbufSetStatic(&os->version, "BEOS");
25+
break;
26+
case B_HAIKU_VERSION_BONE:
27+
ffStrbufSetStatic(&os->version, "BONE");
28+
break;
29+
case B_HAIKU_VERSION_DANO:
30+
ffStrbufSetStatic(&os->version, "DANO");
31+
break;
32+
}
33+
}
34+
else
35+
{
36+
int32 relVer = ver / 0x10000;
37+
ver %= 0x10000;
38+
if (ver == 0)
39+
{
40+
ffStrbufSetF(&os->version, "R%d", relVer);
8141
}
42+
else
43+
{
44+
relVer++;
8245

83-
break;
46+
bool isPre = !!(ver & 1);
47+
if (ver < B_HAIKU_VERSION_1_PRE_BETA_1)
48+
{
49+
int32 alphaVer = ver / 0x100;
50+
if (isPre)
51+
ffStrbufSetF(&os->version, "R%dA%d-", relVer, alphaVer + 1);
52+
else
53+
ffStrbufSetF(&os->version, "R%dA%d", relVer, alphaVer);
54+
}
55+
else if (ver < 0x00010000 /* B_HAIKU_VERSION_1 */)
56+
{
57+
int32 betaVer = (ver - B_HAIKU_VERSION_1_ALPHA_4) / 0x100;
58+
if (isPre)
59+
ffStrbufSetF(&os->version, "R%dB%d-", relVer, betaVer + 1);
60+
else
61+
ffStrbufSetF(&os->version, "R%dB%d", relVer, betaVer);
62+
}
63+
}
8464
}
8565
}
8666

8767
if (!os->version.length)
8868
{
69+
system_info sys;
8970
if (get_system_info(&sys) == B_OK)
9071
ffStrbufAppendF(&os->version, "R%ldx", sys.kernel_version);
9172
}

0 commit comments

Comments
 (0)