From 4654a5e63dd1c3b86ae59480830f653ecbda9a33 Mon Sep 17 00:00:00 2001 From: Charlie Fenton Date: Wed, 7 Jun 2017 04:04:25 -0700 Subject: [PATCH] Mac backtrace: make detection of OS Version number more robust. --- lib/mac/mac_backtrace.cpp | 64 +++++++++++++++------------------------ 1 file changed, 24 insertions(+), 40 deletions(-) diff --git a/lib/mac/mac_backtrace.cpp b/lib/mac/mac_backtrace.cpp index 22f5e0bd9b..ae05bd973e 100644 --- a/lib/mac/mac_backtrace.cpp +++ b/lib/mac/mac_backtrace.cpp @@ -368,54 +368,38 @@ void GetNameOfAndPathToThisProcess(char *nameBuf, size_t nameBufLen, char* outbu // This is an alternative to using Gestalt(gestaltSystemVersion,..) so // we don't need the Carbon Framework static void PrintOSVersion(int *majorVersion, int *minorVersion) { - char buf[1024], *p1 = NULL, *p2 = NULL, *p3; + char vers[100], build[100], *p1 = NULL; FILE *f; - int n; //ToDo: f = popen("/usr/libexec/PlistBuddy -c \"Print :ProductUserVisibleVersion\" /System/Library/CoreServices/SystemVersion.plist"); // fgets(buf, f); // flcose(f); - f = fopen("/System/Library/CoreServices/SystemVersion.plist", "r"); - if (!f) - return; - - n = fread(buf, 1, sizeof(buf)-1, f); - buf[n] = '\0'; - p1 = strstr(buf, "ProductUserVisibleVersion"); - if (p1) { - p1 = strstr(p1, "") + 8; - p2 = strstr(p1, ""); - if (p2) { - // Extract the major system version number - *majorVersion = atoi(p1); - // Extract the minor system version number - p3 = strchr(p2, '.'); - *minorVersion = atoi(p3+1); // Pass minor version number back to caller - // Now print the full OS version string - fputs("System version: Macintosh OS ", stderr); - while (p1 < p2) { - fputc(*p1++, stderr); - } - } - } + vers[0] = '\0'; + f = popen("sw_vers -productVersion", "r"); + if (!f) return; + fscanf(f, "%s", vers); + pclose(f); + + if (vers[0] == '\0') return; + // Extract the major system version number + *majorVersion = atoi(vers); // Pass major version number back to caller + // Extract the minor system version number + p1 = strchr(vers, '.'); + *minorVersion = atoi(p1+1); // Pass minor version number back to caller - if (p2) { - p2 = NULL; - p1 = strstr(buf, "ProductBuildVersion"); - if (p1) { - p1 = strstr(p1, "") + 8; - p2 = strstr(p1, ""); - if (p2) { - fputs(" build ", stderr); - while (p1 < p2) { - fputc(*p1++, stderr); - } - } - } + // Now print the full OS version string + fputs("System version: Macintosh OS ", stderr); + fputs(vers, stderr); + + build[0] = '\0'; + f = popen("sw_vers -buildVersion", "r"); + if (f) { + fscanf(f, "%s", build); + pclose(f); + fputs(" build ", stderr); + fputs(build, stderr); } fputc('\n', stderr); - - fclose(f); }