From b5b2bf1d5263824091483802fc68728227e4aadc Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Mon, 15 Mar 2021 01:59:43 +0000 Subject: [PATCH] Add OS detection for Darwin. --- setter/src/darwin/os.c | 241 ++++++++++++++++++++++++++++++++++++++++- setter/src/unix/os.c | 11 +- 2 files changed, 245 insertions(+), 7 deletions(-) diff --git a/setter/src/darwin/os.c b/setter/src/darwin/os.c index e675e14..ed6d5c1 100644 --- a/setter/src/darwin/os.c +++ b/setter/src/darwin/os.c @@ -24,17 +24,23 @@ Copyright (C) 2011-2021 Natalia Portillo #include #include +#include #include #include -#include "../include/defs.h" #include "../log.h" void DarwinGetOsInfo() { struct utsname buf; int ret; - struct stat finder; + struct stat finder; + struct stat server; + int macosx; + int macosx_server; + int major = 0, minor = 0, release = 0; + char sysname[256]; + char sysversion[256]; ret = uname(&buf); @@ -44,9 +50,232 @@ void DarwinGetOsInfo() return; } + // Darwin does not have Finder, Mac OS X does + // TODO: Mac OS X Server 1.x + memset(&finder, 0, sizeof(struct stat)); + ret = stat("/System/Library/CoreServices/Finder.app", &finder); + macosx = ret == 0; + + memset(&server, 0, sizeof(struct stat)); + ret = stat("/System/Library/CoreServices/ServerVersion.plist", &server); + macosx_server = ret == 0; + + memset(sysname, 0, 256); + memset(sysversion, 0, 256); + + memcpy(sysname, buf.sysname, strlen(buf.sysname)); + memcpy(sysversion, buf.release, strlen(buf.release)); + + if(macosx) + { + sscanf(buf.release, "%d.%d.%d", &major, &minor, &release); + + memset(sysname, 0, 256); + sprintf(sysname, "%s", macosx_server ? "Mac OS X Server" : "Mac OS X"); + + switch(major) + { + case 0: + if(minor == 2) + { + memset(sysname, 0, 256); + memset(sysversion, 0, 256); + + sprintf(sysname, "Mac OS X Server"); + sprintf(sysversion, "1.0.1"); + + break; + } + + break; + case 1: + switch(minor) + { + case 0: + memset(sysversion, 0, 256); + sprintf(sysversion, "Developer Preview 3"); + + break; + case 1: + memset(sysversion, 0, 256); + sprintf(sysversion, "Developer Preview 4"); + + break; + case 2: + if(release == 1) + { + memset(sysversion, 0, 256); + sprintf(sysversion, "Public Beta"); + } + + break; + case 3: + if(release == 1) + { + memset(sysversion, 0, 256); + sprintf(sysversion, "\"Cheetah\" 10.0"); + } + + break; + case 4: + if(release == 1) + { + memset(sysversion, 0, 256); + sprintf(sysversion, "\"Puma\" 10.1"); + } + + break; + } + + break; + case 5: + memset(sysname, 0, 256); + sprintf(sysname, "%s", macosx_server ? "Mac OS X Server \"Puma\"" : "Mac OS X \"Puma\""); + memset(sysversion, 0, 256); + sprintf(sysversion, "10.1.%d", minor); + + break; + case 6: + memset(sysname, 0, 256); + sprintf(sysname, "%s", macosx_server ? "Mac OS X Server \"Jaguar\"" : "Mac OS X \"Jaguar\""); + memset(sysversion, 0, 256); + if(minor > 0) sprintf(sysversion, "10.2.%d", minor); + else + sprintf(sysversion, "10.2"); + + break; + case 7: + memset(sysname, 0, 256); + sprintf(sysname, "%s", macosx_server ? "Mac OS X Server \"Panther\"" : "Mac OS X \"Panther\""); + memset(sysversion, 0, 256); + if(minor > 0) sprintf(sysversion, "10.3.%d", minor); + else + sprintf(sysversion, "10.3"); + + break; + case 8: + memset(sysname, 0, 256); + sprintf(sysname, "%s", macosx_server ? "Mac OS X Server \"Tiger\"" : "Mac OS X \"Tiger\""); + memset(sysversion, 0, 256); + if(minor > 0) sprintf(sysversion, "10.4.%d", minor); + else + sprintf(sysversion, "10.4"); + + break; + case 9: + memset(sysname, 0, 256); + sprintf(sysname, "%s", macosx_server ? "Mac OS X Server \"Leopard\"" : "Mac OS X \"Leopard\""); + memset(sysversion, 0, 256); + if(minor > 0) sprintf(sysversion, "10.5.%d", minor); + else + sprintf(sysversion, "10.5"); + + break; + case 10: + memset(sysname, 0, 256); + sprintf( + sysname, "%s", macosx_server ? "Mac OS X Server \"Snow Leopard\"" : "Mac OS X \"Snow Leopard\""); + memset(sysversion, 0, 256); + if(minor > 0) sprintf(sysversion, "10.6.%d", minor); + else + sprintf(sysversion, "10.6"); + + break; + case 11: + memset(sysname, 0, 256); + sprintf(sysname, "Mac OS X \"Lion\""); + memset(sysversion, 0, 256); + if(minor > 0) sprintf(sysversion, "10.7.%d", minor); + else + sprintf(sysversion, "10.7"); + + break; + case 12: + memset(sysname, 0, 256); + sprintf(sysname, "OS X \"Mountain Lion\""); + memset(sysversion, 0, 256); + if(minor > 0) sprintf(sysversion, "10.8.%d", minor); + else + sprintf(sysversion, "10.8"); + + break; + case 13: + memset(sysname, 0, 256); + sprintf(sysname, "OS X \"Mavericks\""); + memset(sysversion, 0, 256); + if(minor > 0) sprintf(sysversion, "10.9.%d", minor); + else + sprintf(sysversion, "10.9"); + + break; + case 14: + memset(sysname, 0, 256); + sprintf(sysname, "OS X \"Yosemite\""); + memset(sysversion, 0, 256); + if(minor > 0) sprintf(sysversion, "10.10.%d", minor); + else + sprintf(sysversion, "10.10"); + + break; + case 15: + memset(sysname, 0, 256); + sprintf(sysname, "OS X \"El Capitan\""); + memset(sysversion, 0, 256); + if(minor > 0) sprintf(sysversion, "10.11.%d", minor); + else + sprintf(sysversion, "10.11"); + + break; + case 16: + memset(sysname, 0, 256); + sprintf(sysname, "macOS \"Sierra\""); + memset(sysversion, 0, 256); + if(minor > 0) sprintf(sysversion, "10.12.%d", minor); + else + sprintf(sysversion, "10.12"); + + break; + case 17: + memset(sysname, 0, 256); + sprintf(sysname, "macOS \"High Sierra\""); + memset(sysversion, 0, 256); + if(minor > 0) sprintf(sysversion, "10.13.%d", minor); + else + sprintf(sysversion, "10.13"); + + break; + case 18: + memset(sysname, 0, 256); + sprintf(sysname, "macOS \"Mojave\""); + memset(sysversion, 0, 256); + if(minor > 0) sprintf(sysversion, "10.14.%d", minor); + else + sprintf(sysversion, "10.14"); + + break; + case 19: + memset(sysname, 0, 256); + sprintf(sysname, "macOS \"Catalina\""); + memset(sysversion, 0, 256); + if(minor > 0) sprintf(sysversion, "10.15.%d", minor); + else + sprintf(sysversion, "10.15"); + + break; + case 20: + memset(sysname, 0, 256); + sprintf(sysname, "macOS \"Big Sur\""); + memset(sysversion, 0, 256); + if(minor > 0) sprintf(sysversion, "11.%d", minor); + else + sprintf(sysversion, "11"); + + break; + } + } + log_write("OS information:\n"); - log_write("\tOS name: %s\n", buf.sysname); - log_write("\tRelease: %s\n", buf.release); - log_write("\tVersion: %s\n", buf.version); - log_write("\tMachine: %s\n", buf.machine); + log_write("\t%s %s\n", sysname, sysversion); + log_write("\tKernel version: %s\n", buf.version); + log_write("\tArchitecture: %s\n", buf.machine); } diff --git a/setter/src/unix/os.c b/setter/src/unix/os.c index 9cd4579..0ca386a 100644 --- a/setter/src/unix/os.c +++ b/setter/src/unix/os.c @@ -22,15 +22,23 @@ Aaru Data Preservation Suite Copyright (C) 2011-2021 Natalia Portillo *****************************************************************************/ +#if defined(__APPLE__) && defined(__MACH__) +#include "../darwin/darwin.h" +#else #include #include #include -#include "../include/defs.h" #include "../log.h" +#endif + +#include "../include/defs.h" void GetOsInfo() { +#if defined(__APPLE__) && defined(__MACH__) + DarwinGetOsInfo(); +#else struct utsname buf; int ret; @@ -47,4 +55,5 @@ void GetOsInfo() log_write("\tRelease: %s\n", buf.release); log_write("\tVersion: %s\n", buf.version); log_write("\tMachine: %s\n", buf.machine); +#endif }