From 4af44a40bfe5907d5088a46523fdbffc672db3b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 7 Jun 2023 14:30:03 +0800 Subject: [PATCH] OS (macOS): add fast path for code name detection --- src/detection/os/os_apple.m | 50 +++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/src/detection/os/os_apple.m b/src/detection/os/os_apple.m index 8f8174387..49a387d42 100644 --- a/src/detection/os/os_apple.m +++ b/src/detection/os/os_apple.m @@ -24,7 +24,52 @@ static void parseSystemVersion(FFOSResult* os) ffStrbufInitS(&os->buildID, value.UTF8String); } -void parseOSXSoftwareLicense(FFOSResult* os) +static bool detectOSCodeName(FFOSResult* os) +{ + // https://en.wikipedia.org/wiki/MacOS_version_history + char* str_end; + const char* version = os->version.chars; + unsigned long num = strtoul(version, &str_end, 10); + if (str_end == version) return false; + + switch (num) + { + case 14: ffStrbufAppendS(&os->codename, "Sonoma"); return true; + case 13: ffStrbufAppendS(&os->codename, "Ventura"); return true; + case 12: ffStrbufAppendS(&os->codename, "Monterey"); return true; + case 11: ffStrbufAppendS(&os->codename, "Big Sur"); return true; + case 10: { + version = str_end + 1; + num = strtoul(version, &str_end, 10); + if (str_end == version) return false; + + switch (num) + { + case 16: ffStrbufAppendS(&os->codename, "Big Sur"); return true; + case 15: ffStrbufAppendS(&os->codename, "Catalina"); return true; + case 14: ffStrbufAppendS(&os->codename, "Mojave"); return true; + case 13: ffStrbufAppendS(&os->codename, "High Sierra"); return true; + case 12: ffStrbufAppendS(&os->codename, "Sierra"); return true; + case 11: ffStrbufAppendS(&os->codename, "El Capitan"); return true; + case 10: ffStrbufAppendS(&os->codename, "Yosemite"); return true; + case 9: ffStrbufAppendS(&os->codename, "Mavericks"); return true; + case 8: ffStrbufAppendS(&os->codename, "Mountain Lion"); return true; + case 7: ffStrbufAppendS(&os->codename, "Lion"); return true; + case 6: ffStrbufAppendS(&os->codename, "Snow Leopard"); return true; + case 5: ffStrbufAppendS(&os->codename, "Leopard"); return true; + case 4: ffStrbufAppendS(&os->codename, "Tiger"); return true; + case 3: ffStrbufAppendS(&os->codename, "Panther"); return true; + case 2: ffStrbufAppendS(&os->codename, "Jaguar"); return true; + case 1: ffStrbufAppendS(&os->codename, "Puma"); return true; + case 0: ffStrbufAppendS(&os->codename, "Cheetah"); return true; + } + } + } + + return false; +} + +static void parseOSXSoftwareLicense(FFOSResult* os) { FILE* rtf = fopen("/System/Library/CoreServices/Setup Assistant.app/Contents/Resources/en.lproj/OSXSoftwareLicense.rtf", "r"); if(rtf == NULL) @@ -81,5 +126,6 @@ void ffDetectOSImpl(FFOSResult* os, const FFinstance* instance) ffStrbufAppend(&os->prettyName, &os->name); ffStrbufAppend(&os->versionID, &os->version); - parseOSXSoftwareLicense(os); + if(!detectOSCodeName(os)) + parseOSXSoftwareLicense(os); }