Skip to content

Commit 8410a66

Browse files
committed
Host (Linux): report mac product name
1 parent 856d229 commit 8410a66

File tree

4 files changed

+194
-174
lines changed

4 files changed

+194
-174
lines changed

CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,7 @@ if(LINUX)
502502
src/detection/gpu/gpu_pci.c
503503
src/detection/gtk_qt/gtk.c
504504
src/detection/host/host_linux.c
505+
src/detection/host/host_mac.c
505506
src/detection/icons/icons_linux.c
506507
src/detection/initsystem/initsystem_linux.c
507508
src/detection/keyboard/keyboard_linux.c
@@ -881,6 +882,7 @@ elseif(APPLE)
881882
src/detection/gpu/gpu_apple.c
882883
src/detection/gpu/gpu_apple.m
883884
src/detection/host/host_apple.c
885+
src/detection/host/host_mac.c
884886
src/detection/icons/icons_nosupport.c
885887
src/detection/initsystem/initsystem_linux.c
886888
src/detection/keyboard/keyboard_apple.c

src/detection/host/host_apple.c

Lines changed: 3 additions & 174 deletions
Original file line numberDiff line numberDiff line change
@@ -5,179 +5,6 @@
55

66
#include <IOKit/IOKitLib.h>
77

8-
static const char* getProductNameWithHwModel(const FFstrbuf* hwModel)
9-
{
10-
// Macbook Pro: https://support.apple.com/en-us/HT201300
11-
// Macbook Air: https://support.apple.com/en-us/HT201862
12-
// Mac mini: https://support.apple.com/en-us/HT201894
13-
// iMac: https://support.apple.com/en-us/HT201634
14-
// Mac Pro: https://support.apple.com/en-us/HT202888
15-
// Mac Studio: https://support.apple.com/en-us/HT213073
16-
17-
if(ffStrbufStartsWithS(hwModel, "MacBookPro"))
18-
{
19-
const char* version = hwModel->chars + strlen("MacBookPro");
20-
if(ffStrEquals(version, "18,3") ||
21-
ffStrEquals(version, "18,4")) return "MacBook Pro (14-inch, 2021)";
22-
if(ffStrEquals(version, "18,1") ||
23-
ffStrEquals(version, "18,2")) return "MacBook Pro (16-inch, 2021)";
24-
if(ffStrEquals(version, "17,1")) return "MacBook Pro (13-inch, M1, 2020)";
25-
if(ffStrEquals(version, "16,3")) return "MacBook Pro (13-inch, 2020, Two Thunderbolt 3 ports)";
26-
if(ffStrEquals(version, "16,2")) return "MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)";
27-
if(ffStrEquals(version, "16,4") ||
28-
ffStrEquals(version, "16,1")) return "MacBook Pro (16-inch, 2019)";
29-
if(ffStrEquals(version, "15,4")) return "MacBook Pro (13-inch, 2019, Two Thunderbolt 3 ports)";
30-
if(ffStrEquals(version, "15,3")) return "MacBook Pro (15-inch, 2019)";
31-
if(ffStrEquals(version, "15,2")) return "MacBook Pro (13-inch, 2018/2019, Four Thunderbolt 3 ports)";
32-
if(ffStrEquals(version, "15,1")) return "MacBook Pro (15-inch, 2018/2019)";
33-
if(ffStrEquals(version, "14,3")) return "MacBook Pro (15-inch, 2017)";
34-
if(ffStrEquals(version, "14,2")) return "MacBook Pro (13-inch, 2017, Four Thunderbolt 3 ports)";
35-
if(ffStrEquals(version, "14,1")) return "MacBook Pro (13-inch, 2017, Two Thunderbolt 3 ports)";
36-
if(ffStrEquals(version, "13,3")) return "MacBook Pro (15-inch, 2016)";
37-
if(ffStrEquals(version, "13,2")) return "MacBook Pro (13-inch, 2016, Four Thunderbolt 3 ports)";
38-
if(ffStrEquals(version, "13,1")) return "MacBook Pro (13-inch, 2016, Two Thunderbolt 3 ports)";
39-
if(ffStrEquals(version, "12,1")) return "MacBook Pro (Retina, 13-inch, Early 2015)";
40-
if(ffStrEquals(version, "11,4") ||
41-
ffStrEquals(version, "11,5")) return "MacBook Pro (Retina, 15-inch, Mid 2015)";
42-
if(ffStrEquals(version, "11,2") ||
43-
ffStrEquals(version, "11,3")) return "MacBook Pro (Retina, 15-inch, Late 2013/Mid 2014)";
44-
if(ffStrEquals(version, "11,1")) return "MacBook Pro (Retina, 13-inch, Late 2013/Mid 2014)";
45-
if(ffStrEquals(version, "10,2")) return "MacBook Pro (Retina, 13-inch, Late 2012/Early 2013)";
46-
if(ffStrEquals(version, "10,1")) return "MacBook Pro (Retina, 15-inch, Mid 2012/Early 2013)";
47-
if(ffStrEquals(version, "9,2")) return "MacBook Pro (13-inch, Mid 2012)";
48-
if(ffStrEquals(version, "9,1")) return "MacBook Pro (15-inch, Mid 2012)";
49-
if(ffStrEquals(version, "8,3")) return "MacBook Pro (17-inch, 2011)";
50-
if(ffStrEquals(version, "8,2")) return "MacBook Pro (15-inch, 2011)";
51-
if(ffStrEquals(version, "8,1")) return "MacBook Pro (13-inch, 2011)";
52-
if(ffStrEquals(version, "7,1")) return "MacBook Pro (13-inch, Mid 2010)";
53-
if(ffStrEquals(version, "6,2")) return "MacBook Pro (15-inch, Mid 2010)";
54-
if(ffStrEquals(version, "6,1")) return "MacBook Pro (17-inch, Mid 2010)";
55-
if(ffStrEquals(version, "5,5")) return "MacBook Pro (13-inch, Mid 2009)";
56-
if(ffStrEquals(version, "5,3")) return "MacBook Pro (15-inch, Mid 2009)";
57-
if(ffStrEquals(version, "5,2")) return "MacBook Pro (17-inch, Mid/Early 2009)";
58-
if(ffStrEquals(version, "5,1")) return "MacBook Pro (15-inch, Late 2008)";
59-
if(ffStrEquals(version, "4,1")) return "MacBook Pro (17/15-inch, Early 2008)";
60-
}
61-
else if(ffStrbufStartsWithS(hwModel, "MacBookAir"))
62-
{
63-
const char* version = hwModel->chars + strlen("MacBookAir");
64-
if(ffStrEquals(version, "10,1")) return "MacBook Air (M1, 2020)";
65-
if(ffStrEquals(version, "9,1")) return "MacBook Air (Retina, 13-inch, 2020)";
66-
if(ffStrEquals(version, "8,2")) return "MacBook Air (Retina, 13-inch, 2019)";
67-
if(ffStrEquals(version, "8,1")) return "MacBook Air (Retina, 13-inch, 2018)";
68-
if(ffStrEquals(version, "7,2")) return "MacBook Air (13-inch, Early 2015/2017)";
69-
if(ffStrEquals(version, "7,1")) return "MacBook Air (11-inch, Early 2015)";
70-
if(ffStrEquals(version, "6,2")) return "MacBook Air (13-inch, Mid 2013/Early 2014)";
71-
if(ffStrEquals(version, "6,1")) return "MacBook Air (11-inch, Mid 2013/Early 2014)";
72-
if(ffStrEquals(version, "5,2")) return "MacBook Air (13-inch, Mid 2012)";
73-
if(ffStrEquals(version, "5,1")) return "MacBook Air (11-inch, Mid 2012)";
74-
if(ffStrEquals(version, "4,2")) return "MacBook Air (13-inch, Mid 2011)";
75-
if(ffStrEquals(version, "4,1")) return "MacBook Air (11-inch, Mid 2011)";
76-
if(ffStrEquals(version, "3,2")) return "MacBook Air (13-inch, Late 2010)";
77-
if(ffStrEquals(version, "3,1")) return "MacBook Air (11-inch, Late 2010)";
78-
if(ffStrEquals(version, "2,1")) return "MacBook Air (Mid 2009)";
79-
}
80-
else if(ffStrbufStartsWithS(hwModel, "Macmini"))
81-
{
82-
const char* version = hwModel->chars + strlen("Macmini");
83-
if(ffStrEquals(version, "9,1")) return "Mac mini (M1, 2020)";
84-
if(ffStrEquals(version, "8,1")) return "Mac mini (2018)";
85-
if(ffStrEquals(version, "7,1")) return "Mac mini (Mid 2014)";
86-
if(ffStrEquals(version, "6,1") ||
87-
ffStrEquals(version, "6,2")) return "Mac mini (Late 2012)";
88-
if(ffStrEquals(version, "5,1") ||
89-
ffStrEquals(version, "5,2")) return "Mac mini (Mid 2011)";
90-
if(ffStrEquals(version, "4,1")) return "Mac mini (Mid 2010)";
91-
if(ffStrEquals(version, "3,1")) return "Mac mini (Early/Late 2009)";
92-
}
93-
else if(ffStrbufStartsWithS(hwModel, "MacBook"))
94-
{
95-
const char* version = hwModel->chars + strlen("MacBook");
96-
if(ffStrEquals(version, "10,1")) return "MacBook (Retina, 12-inch, 2017)";
97-
if(ffStrEquals(version, "9,1")) return "MacBook (Retina, 12-inch, Early 2016)";
98-
if(ffStrEquals(version, "8,1")) return "MacBook (Retina, 12-inch, Early 2015)";
99-
if(ffStrEquals(version, "7,1")) return "MacBook (13-inch, Mid 2010)";
100-
if(ffStrEquals(version, "6,1")) return "MacBook (13-inch, Late 2009)";
101-
if(ffStrEquals(version, "5,2")) return "MacBook (13-inch, Early/Mid 2009)";
102-
}
103-
else if(ffStrbufStartsWithS(hwModel, "MacPro"))
104-
{
105-
const char* version = hwModel->chars + strlen("MacPro");
106-
if(ffStrEquals(version, "7,1")) return "Mac Pro (2019)";
107-
if(ffStrEquals(version, "6,1")) return "Mac Pro (Late 2013)";
108-
if(ffStrEquals(version, "5,1")) return "Mac Pro (Mid 2010 - Mid 2012)";
109-
if(ffStrEquals(version, "4,1")) return "Mac Pro (Early 2009)";
110-
}
111-
else if(ffStrbufStartsWithS(hwModel, "Mac"))
112-
{
113-
const char* version = hwModel->chars + strlen("Mac");
114-
if(ffStrEquals(version, "16,3")) return "iMac (24-inch, 2024, Four Thunderbolt / USB 4 ports)";
115-
if(ffStrEquals(version, "16,2")) return "iMac (24-inch, 2024, Two Thunderbolt / USB 4 ports)";
116-
if(ffStrEquals(version, "16,1") ||
117-
ffStrEquals(version, "16,6") ||
118-
ffStrEquals(version, "16,8")) return "MacBook Pro (14-inch, 2024, Three Thunderbolt 4 ports)";
119-
if(ffStrEquals(version, "16,7") ||
120-
ffStrEquals(version, "16,5")) return "MacBook Pro (16-inch, 2024, Three Thunderbolt 4 ports)";
121-
if(ffStrEquals(version, "16,15") ||
122-
ffStrEquals(version, "16,10")) return "Mac mini (2024)";
123-
if(ffStrEquals(version, "15,13")) return "MacBook Air (15-inch, M3, 2024)";
124-
if(ffStrEquals(version, "15,2")) return "MacBook Air (13-inch, M3, 2024)";
125-
if(ffStrEquals(version, "15,3")) return "MacBook Pro (14-inch, Nov 2023, Two Thunderbolt / USB 4 ports)";
126-
if(ffStrEquals(version, "15,4")) return "iMac (24-inch, 2023, Two Thunderbolt / USB 4 ports)";
127-
if(ffStrEquals(version, "15,5")) return "iMac (24-inch, 2023, Two Thunderbolt / USB 4 ports, Two USB 3 ports)";
128-
if(ffStrEquals(version, "15,6") ||
129-
ffStrEquals(version, "15,8") ||
130-
ffStrEquals(version, "15,10")) return "MacBook Pro (14-inch, Nov 2023, Three Thunderbolt 4 ports)";
131-
if(ffStrEquals(version, "15,7") ||
132-
ffStrEquals(version, "15,9") ||
133-
ffStrEquals(version, "15,11")) return "MacBook Pro (16-inch, Nov 2023, Three Thunderbolt 4 ports)";
134-
if(ffStrEquals(version, "14,15")) return "MacBook Air (15-inch, M2, 2023)";
135-
if(ffStrEquals(version, "14,14")) return "Mac Studio (M2 Ultra, 2023, Two Thunderbolt 4 front ports)";
136-
if(ffStrEquals(version, "14,13")) return "Mac Studio (M2 Max, 2023, Two USB-C front ports)";
137-
if(ffStrEquals(version, "14,8")) return "Mac Pro (2023)";
138-
if(ffStrEquals(version, "14,6") ||
139-
ffStrEquals(version, "14,10")) return "MacBook Pro (16-inch, 2023)";
140-
if(ffStrEquals(version, "14,5") ||
141-
ffStrEquals(version, "14,9")) return "MacBook Pro (14-inch, 2023)";
142-
if(ffStrEquals(version, "14,3")) return "Mac mini (M2, 2023, Two Thunderbolt 4 ports)";
143-
if(ffStrEquals(version, "14,12")) return "Mac mini (M2, 2023, Four Thunderbolt 4 ports)";
144-
if(ffStrEquals(version, "14,7")) return "MacBook Pro (13-inch, M2, 2022)";
145-
if(ffStrEquals(version, "14,2")) return "MacBook Air (M2, 2022)";
146-
if(ffStrEquals(version, "13,1")) return "Mac Studio (M1 Max, 2022, Two USB-C front ports)";
147-
if(ffStrEquals(version, "13,2")) return "Mac Studio (M1 Ultra, 2022, Two Thunderbolt 4 front ports)";
148-
}
149-
else if(ffStrbufStartsWithS(hwModel, "iMac"))
150-
{
151-
const char* version = hwModel->chars + strlen("iMac");
152-
if(ffStrEquals(version, "21,1")) return "iMac (24-inch, M1, 2021, Two Thunderbolt / USB 4 ports, Two USB 3 ports)";
153-
if(ffStrEquals(version, "21,2")) return "iMac (24-inch, M1, 2021, Two Thunderbolt / USB 4 ports)";
154-
if(ffStrEquals(version, "20,1") ||
155-
ffStrEquals(version, "20,2")) return "iMac (Retina 5K, 27-inch, 2020)";
156-
if(ffStrEquals(version, "19,1")) return "iMac (Retina 5K, 27-inch, 2019)";
157-
if(ffStrEquals(version, "19,2")) return "iMac (Retina 4K, 21.5-inch, 2019)";
158-
if(ffStrEquals(version, "Pro1,1")) return "iMac Pro (2017)";
159-
if(ffStrEquals(version, "18,3")) return "iMac (Retina 5K, 27-inch, 2017)";
160-
if(ffStrEquals(version, "18,2")) return "iMac (Retina 4K, 21.5-inch, 2017)";
161-
if(ffStrEquals(version, "18,1")) return "iMac (21.5-inch, 2017)";
162-
if(ffStrEquals(version, "17,1")) return "iMac (Retina 5K, 27-inch, Late 2015)";
163-
if(ffStrEquals(version, "16,2")) return "iMac (Retina 4K, 21.5-inch, Late 2015)";
164-
if(ffStrEquals(version, "16,1")) return "iMac (21.5-inch, Late 2015)";
165-
if(ffStrEquals(version, "15,1")) return "iMac (Retina 5K, 27-inch, Late 2014 - Mid 2015)";
166-
if(ffStrEquals(version, "14,4")) return "iMac (21.5-inch, Mid 2014)";
167-
if(ffStrEquals(version, "14,2")) return "iMac (27-inch, Late 2013)";
168-
if(ffStrEquals(version, "14,1")) return "iMac (21.5-inch, Late 2013)";
169-
if(ffStrEquals(version, "13,2")) return "iMac (27-inch, Late 2012)";
170-
if(ffStrEquals(version, "13,1")) return "iMac (21.5-inch, Late 2012)";
171-
if(ffStrEquals(version, "12,2")) return "iMac (27-inch, Mid 2011)";
172-
if(ffStrEquals(version, "12,1")) return "iMac (21.5-inch, Mid 2011)";
173-
if(ffStrEquals(version, "11,3")) return "iMac (27-inch, Mid 2010)";
174-
if(ffStrEquals(version, "11,2")) return "iMac (21.5-inch, Mid 2010)";
175-
if(ffStrEquals(version, "10,1")) return "iMac (27/21.5-inch, Late 2009)";
176-
if(ffStrEquals(version, "9,1")) return "iMac (24/20-inch, Early 2009)";
177-
}
178-
return NULL;
179-
}
180-
1818
const char* getProductNameWithIokit(FFstrbuf* result)
1829
{
18310
FF_IOOBJECT_AUTO_RELEASE io_registry_entry_t registryEntry = IOServiceGetMatchingService(MACH_PORT_NULL, IOServiceNameMatching("product"));
@@ -212,12 +39,14 @@ const char* getOthersByIokit(FFHostResult* host)
21239
return NULL;
21340
}
21441

42+
const char* ffHostGetMacProductNameWithHwModel(const FFstrbuf* hwModel);
43+
21544
const char* ffDetectHost(FFHostResult* host)
21645
{
21746
const char* error = ffSysctlGetString("hw.model", &host->family);
21847
if (error) return error;
21948

220-
ffStrbufSetStatic(&host->name, getProductNameWithHwModel(&host->family));
49+
ffStrbufSetStatic(&host->name, ffHostGetMacProductNameWithHwModel(&host->family));
22150
if (host->name.length == 0)
22251
getProductNameWithIokit(&host->name);
22352
if (host->name.length == 0)

src/detection/host/host_linux.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
#include <stdlib.h>
77

8+
const char* ffHostGetMacProductNameWithHwModel(const FFstrbuf* hwModel);
9+
810
static void getHostProductName(FFstrbuf* name)
911
{
1012
if (ffReadFileBuffer("/sys/firmware/devicetree/base/model", name))
@@ -62,6 +64,18 @@ const char* ffDetectHost(FFHostResult* host)
6264
if (ffStrbufStartsWithS(&host->name, "Apple "))
6365
ffStrbufSetStatic(&host->vendor, "Apple Inc.");
6466
}
67+
#ifdef __x86_64__
68+
else if (ffStrbufEqualS(&host->family, "Mac") && ffStrbufEqualS(&host->vendor, "Apple Inc."))
69+
{
70+
const char* productName = ffHostGetMacProductNameWithHwModel(&host->name);
71+
if (productName)
72+
{
73+
ffStrbufDestroy(&host->family);
74+
ffStrbufInitMove(&host->family, &host->name);
75+
ffStrbufSetStatic(&host->name, productName);
76+
}
77+
}
78+
#endif
6579

6680
//KVM/Qemu virtual machine
6781
if(ffStrbufStartsWithS(&host->name, "Standard PC"))

0 commit comments

Comments
 (0)