From ae29864ce30e2263b0c81d9e9ed37d8b1c5ef87a Mon Sep 17 00:00:00 2001 From: Andrew Belt Date: Wed, 22 Oct 2025 02:45:20 -0400 Subject: [PATCH] Use kern.osproductversion to get Mac version in system::getOperatingSystemInfo(). --- src/system.cpp | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/system.cpp b/src/system.cpp index 190b6da3..2a820ac8 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -831,28 +831,29 @@ std::string getOperatingSystemInfo() { #elif defined ARCH_MAC // From https://opensource.apple.com/source/cctools/cctools-973.0.1/libstuff/macosx_deployment_target.c.auto.html char osversion[32]; - int osversion_name[2] = {CTL_KERN, KERN_OSRELEASE}; size_t osversion_len = sizeof(osversion) - 1; - if (sysctl(osversion_name, 2, osversion, &osversion_len, NULL, 0) != 0) + + // Available in Mac >=10.13 + if (sysctlbyname("kern.osproductversion", osversion, &osversion_len, NULL, 0) == 0) + return string::f("Mac %s", osversion); + + // Fallback: Get Darwin version and convert to Mac version + if (sysctlbyname("kern.osrelease", osversion, &osversion_len, NULL, 0) != 0) return "Mac"; int major = 0; int minor = 0; if (sscanf(osversion, "%d.%d", &major, &minor) != 2) - return "Mac"; + return string::f("Mac Darwin %s", osversion); - // Try to match version numbers to retail versions - if (major >= 20) { - if (major == 22) { - minor -= 1; - } - major -= 9; - return string::f("Mac %d.%d", major, minor); - } - else { + if (5 <= major && major <= 19) { + // Darwin 5 -> Mac 10.1, through Mac 10.15 major -= 4; return string::f("Mac 10.%d.%d", major, minor); } + else { + return string::f("Mac Darwin %s", osversion); + } #elif defined ARCH_WIN OSVERSIONINFOW info; ZeroMemory(&info, sizeof(info));