Browse Source

Use kern.osproductversion to get Mac version in system::getOperatingSystemInfo().

tags/v2.6.5
Andrew Belt 3 months ago
parent
commit
ae29864ce3
1 changed files with 13 additions and 12 deletions
  1. +13
    -12
      src/system.cpp

+ 13
- 12
src/system.cpp View File

@@ -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));


Loading…
Cancel
Save