|
5 | 5 |
|
6 | 6 | #include <IOKit/IOKitLib.h> |
7 | 7 |
|
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 | | - |
181 | 8 | const char* getProductNameWithIokit(FFstrbuf* result) |
182 | 9 | { |
183 | 10 | FF_IOOBJECT_AUTO_RELEASE io_registry_entry_t registryEntry = IOServiceGetMatchingService(MACH_PORT_NULL, IOServiceNameMatching("product")); |
@@ -212,12 +39,14 @@ const char* getOthersByIokit(FFHostResult* host) |
212 | 39 | return NULL; |
213 | 40 | } |
214 | 41 |
|
| 42 | +const char* ffHostGetMacProductNameWithHwModel(const FFstrbuf* hwModel); |
| 43 | + |
215 | 44 | const char* ffDetectHost(FFHostResult* host) |
216 | 45 | { |
217 | 46 | const char* error = ffSysctlGetString("hw.model", &host->family); |
218 | 47 | if (error) return error; |
219 | 48 |
|
220 | | - ffStrbufSetStatic(&host->name, getProductNameWithHwModel(&host->family)); |
| 49 | + ffStrbufSetStatic(&host->name, ffHostGetMacProductNameWithHwModel(&host->family)); |
221 | 50 | if (host->name.length == 0) |
222 | 51 | getProductNameWithIokit(&host->name); |
223 | 52 | if (host->name.length == 0) |
|
0 commit comments