ultimatepp/bazaar/SysInfo/os.cpp
koldo 997f899751 SysInfo: Changes due to 74 bits warnings
git-svn-id: svn://ultimatepp.org/upp/trunk@6012 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2013-05-01 06:47:22 +00:00

353 lines
No EOL
14 KiB
C++

#include "SysInfo_in.h"
NAMESPACE_UPP
#if defined(PLATFORM_WIN32) || defined (PLATFORM_WIN64)
#if !defined(PRODUCT_ULTIMATE)
#define PRODUCT_UNDEFINED 0x00000000
#define PRODUCT_ULTIMATE 0x00000001
#define PRODUCT_HOME_BASIC 0x00000002
#define PRODUCT_HOME_PREMIUM 0x00000003
#define PRODUCT_ENTERPRISE 0x00000004
#define PRODUCT_HOME_BASIC_N 0x00000005
#define PRODUCT_BUSINESS 0x00000006
#define PRODUCT_STANDARD_SERVER 0x00000007
#define PRODUCT_DATACENTER_SERVER 0x00000008
#define PRODUCT_SMALLBUSINESS_SERVER 0x00000009
#define PRODUCT_ENTERPRISE_SERVER 0x0000000A
#define PRODUCT_STARTER 0x0000000B
#define PRODUCT_DATACENTER_SERVER_CORE 0x0000000C
#define PRODUCT_STANDARD_SERVER_CORE 0x0000000D
#define PRODUCT_ENTERPRISE_SERVER_CORE 0x0000000E
#define PRODUCT_ENTERPRISE_SERVER_IA64 0x0000000F
#define PRODUCT_BUSINESS_N 0x00000010
#define PRODUCT_WEB_SERVER 0x00000011
#define PRODUCT_CLUSTER_SERVER 0x00000012
#define PRODUCT_HOME_SERVER 0x00000013
#define PRODUCT_STORAGE_EXPRESS_SERVER 0x00000014
#define PRODUCT_STORAGE_STANDARD_SERVER 0x00000015
#define PRODUCT_STORAGE_WORKGROUP_SERVER 0x00000016
#define PRODUCT_STORAGE_ENTERPRISE_SERVER 0x00000017
#define PRODUCT_SERVER_FOR_SMALLBUSINESS 0x00000018
#define PRODUCT_SMALLBUSINESS_SERVER_PREMIUM 0x00000019
#define PRODUCT_UNLICENSED 0xABCDABCD
#endif
#if !defined(SM_SERVERR2)
#define SM_SERVERR2 89
#endif
#if !defined(VER_SUITE_WH_SERVER)
#define VER_SUITE_WH_SERVER 0x00008000
#endif
typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
typedef BOOL (WINAPI *PGPI)(DWORD, DWORD, DWORD, DWORD, PDWORD);
bool GetOsInfo(String &kernel, String &kerVersion, String &kerArchitecture, String &distro,
String &distVersion, String &desktop, String &deskVersion)
{
OSVERSIONINFOEX osvi;
SYSTEM_INFO si;
PGNSI pGNSI;
PGPI pGPI;
BOOL bOsVersionInfoEx;
ZeroMemory(&si, sizeof(SYSTEM_INFO));
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
if(!(bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO *)&osvi)))
return false;
// Call GetNativeSystemInfo if supported or GetSystemInfo otherwise.
pGNSI = (PGNSI) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetNativeSystemInfo");
if(NULL != pGNSI)
pGNSI(&si);
else
GetSystemInfo(&si);
kerVersion = Format("%d.%d", (int)osvi.dwMajorVersion, (int)osvi.dwMinorVersion);
kernel = "Windows";
switch(si.wProcessorArchitecture) {
case PROCESSOR_ARCHITECTURE_AMD64: kerArchitecture = "64 bits"; break;
case PROCESSOR_ARCHITECTURE_IA64: kerArchitecture = "Itanium 64 bits"; break;
case PROCESSOR_ARCHITECTURE_INTEL: kerArchitecture = "32 bits"; break;
default: kerArchitecture = "Unknown";
}
if (VER_PLATFORM_WIN32_NT == osvi.dwPlatformId && osvi.dwMajorVersion > 4 ) {
// Test for the specific product.
if (osvi.dwMajorVersion == 6) {
if (osvi.dwMinorVersion == 1) {
if (osvi.wProductType == VER_NT_WORKSTATION)
kernel.Cat(" Seven");
else
kernel.Cat(" Server 2008 R2");
} else if (osvi.dwMinorVersion == 0) {
if (osvi.wProductType == VER_NT_WORKSTATION)
kernel.Cat(" Vista");
else
kernel.Cat(" Server 2008");
}
pGPI = (PGPI)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetProductInfo");
DWORD dwType;
if (pGPI(osvi.dwMajorVersion, osvi.dwMinorVersion, 0, 0, &dwType)) {
switch(dwType) {
case PRODUCT_UNLICENSED: distro = "Unlicensed"; break;
case PRODUCT_ULTIMATE: distro = "Ultimate Edition"; break;
case PRODUCT_HOME_PREMIUM: distro = "Home Premium Edition";break;
case PRODUCT_HOME_BASIC:
case PRODUCT_HOME_BASIC_N: distro = "Home Basic Edition"; break;
case PRODUCT_ENTERPRISE: distro = "Enterprise Edition"; break;
case PRODUCT_BUSINESS:
case PRODUCT_BUSINESS_N: distro = "Business Edition"; break;
case PRODUCT_STARTER: distro = "Starter Edition"; break;
case PRODUCT_CLUSTER_SERVER: distro = "Cluster Server Edition"; break;
case PRODUCT_DATACENTER_SERVER: distro = "Datacenter Edition"; break;
case PRODUCT_DATACENTER_SERVER_CORE: distro = "Datacenter Edition (core installation)"; break;
case PRODUCT_ENTERPRISE_SERVER: distro = "Enterprise Edition"; break;
case PRODUCT_ENTERPRISE_SERVER_CORE: distro = "Enterprise Edition (core installation)"; break;
case PRODUCT_ENTERPRISE_SERVER_IA64: distro = "Enterprise Edition for Itanium-based Systems";break;
case PRODUCT_SMALLBUSINESS_SERVER: distro = "Small Business Server"; break;
case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM: distro = "Small Business Server Premium Edition"; break;
case PRODUCT_STANDARD_SERVER: distro = "Standard Edition"; break;
case PRODUCT_STANDARD_SERVER_CORE: distro = "Standard Edition (core installation)"; break;
case PRODUCT_WEB_SERVER: distro = "Web Server Edition"; break;
case PRODUCT_UNDEFINED: distro = "Undefined"; break;
}
}
} else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2) {
if (GetSystemMetrics(SM_SERVERR2) )
kernel.Cat(" Server 2003 R2");
else if (osvi.wSuiteMask & VER_SUITE_STORAGE_SERVER)
kernel.Cat(" Storage Server 2003");
else if (osvi.wSuiteMask & VER_SUITE_WH_SERVER)
kernel.Cat(" Home Server");
else if( osvi.wProductType == VER_NT_WORKSTATION && si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
kernel.Cat(" XP Professional x64 Edition");
else
kernel.Cat(" Server 2003");
// Test for the server type.
if (osvi.wProductType != VER_NT_WORKSTATION ) {
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 ) {
if(osvi.wSuiteMask & VER_SUITE_DATACENTER )
distro = "Datacenter Edition for Itanium-based Systems";
else if(osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
distro = "Enterprise Edition for Itanium-based Systems";
}
} else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ) {
if(osvi.wSuiteMask & VER_SUITE_DATACENTER )
distro = "Datacenter x64 Edition";
else if(osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
distro = "Enterprise x64 Edition";
else
distro = "Standard x64 Edition";
} else {
if (osvi.wSuiteMask & VER_SUITE_COMPUTE_SERVER )
distro = "Compute Cluster Edition";
else if(osvi.wSuiteMask & VER_SUITE_DATACENTER )
distro = "Datacenter Edition";
else if(osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
distro = "Enterprise Edition";
else if (osvi.wSuiteMask & VER_SUITE_BLADE )
distro = "Web Edition";
else
distro = "Standard Edition";
}
} else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 ) {
kernel.Cat(" XP");
if(osvi.wSuiteMask & VER_SUITE_PERSONAL )
distro = "Home Edition";
else
distro = "Professional";
} else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 ) {
kernel.Cat(" 2000");
if (osvi.wProductType == VER_NT_WORKSTATION)
distro = "Professional";
else {
if(osvi.wSuiteMask & VER_SUITE_DATACENTER)
distro = "Datacenter Server";
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
distro = "Advanced Server";
else
distro = "Server";
}
}
// Include service pack (if any) and build number.
if(osvi.wServicePackMajor > 0)
kerVersion.Cat(Format(" %s", osvi.szCSDVersion));
kerVersion.Cat(Format(" (Build %d)", (int)osvi.dwBuildNumber));
} else if (osvi.dwPlatformId == 1) {
switch(osvi.dwMinorVersion) {
case 0:
kernel.Cat(" 95");
break;
case 10:
kernel.Cat(" 98");
break;
case 90:
kernel.Cat(" Millennium");
break;
}
distro = "";
} else if (osvi.dwPlatformId == 2) {
switch(osvi.dwMajorVersion) {
kernel.Cat(" NT");
case 3:
kernel.Cat(" 3.51");
break;
case 4:
kernel.Cat(" 4.0");
break;
}
distro = "";
}
desktop = kernel;
distVersion = deskVersion = "";
return true;
}
#endif
#ifdef PLATFORM_POSIX
bool GetOsInfo_CheckLsb(String &distro, String &distVersion) {
StringParse lsb;
lsb = LoadFile_Safe("/etc/lsb-release");
if (lsb == "")
return false;
if(!lsb.GoAfter("DISTRIB_ID="))
return false;
distro = ToLower(lsb.GetText());
if (distro == "")
return false;
lsb.GoAfter_Init("DISTRIB_RELEASE=");
distVersion = lsb.GetText();
return true;
}
bool GetOsInfo(String &kernel, String &kerVersion, String &kerArchitecture, String &distro, String &distVersion, String &desktop, String &deskVersion)
{
struct utsname buf;
if (0 == uname(&buf)) {
kernel = buf.sysname;
kerVersion = String(buf.release) + " " + String(buf.version);
kerArchitecture = buf.machine;
}
if (kernel == "")
kernel = LoadFile_Safe("/proc/sys/kernel/ostype");
if (kernel == "")
kernel = LoadFile_Safe("/proc/version");
if (kernel == "") {
if (Sys("sysctl_cmd -n kern.version").Find("FreeBSD") >= 0)
kernel = "freebsd";
}
if (kerVersion == "")
kerVersion = LoadFile_Safe("/proc/sys/kernel/osrelease") + " " + LoadFile_Safe("/proc/sys/kernel/version");
if (kerArchitecture == "")
kerArchitecture = Sys("uname -m"); // Kernel. See too /proc/version, /proc/version_signature and uname -a looking for architecture
if (kernel == "")
kernel = kerVersion = kerArchitecture = "UNKNOWN";
// Desktop
if(GetEnv("GNOME_DESKTOP_SESSION_ID").GetCount() || GetEnv("GNOME_KEYRING_SOCKET").GetCount()) {
desktop = "gnome";
StringParse gnomeVersion = Sys("gnome-about --version");
gnomeVersion.GoAfter("gnome-about");
deskVersion = gnomeVersion.GetText();
} else if(GetEnv("KDE_FULL_SESSION").GetCount() || GetEnv("KDEDIR").GetCount() || GetEnv("KDE_MULTIHEAD").GetCount()) {
desktop = "kde";
StringParse konsole = Sys("konsole --version");
konsole.GoAfter("KDE:");
deskVersion = konsole.GetText("\r\n");
if (deskVersion == "")
deskVersion = GetEnv("KDE_SESSION_VERSION");
} else {
StringParse desktopStr;
if (Sys("xprop -root _DT_SAVE_MODE").Find("xfce") >= 0)
desktop = "xfce";
else if ((desktopStr = Sys("xprop -root")).Find("ENLIGHTENMENT") >= 0) {
desktop = "enlightenment";
desktopStr.GoAfter("ENLIGHTENMENT_VERSION(STRING)", "=");
desktopStr = desktopStr.GetText();
if (desktopStr.GetText() == "Enlightenment")
deskVersion = desktopStr.GetText();
} else
desktop = GetEnv("DESKTOP_SESSION");
}
if (desktop == "")
desktop = deskVersion = "UNKNOWN";
// Distro
if (GetOsInfo_CheckLsb(distro, distVersion))
;
else if (FileExists("/usr/share/doc/ubuntu-minimal") || FileExists("/usr/share/ubuntu-docs"))
distro = "ubuntu";
else if (FileExists("/etc/fedora-release")) {
distro = "fedora";
StringParse strFile = LoadFile_Safe("/etc/fedora-release");
String str;
do {
str = strFile.GetText();
if ((str != "fedora") && (str != "release"))
distVersion << str << " ";
} while (str != "");
} else if (FileExists("/etc/redhat-release")) {
distro = "redhat";
distVersion = LoadFile_Safe("/etc/redhat-release");
} else if (FileExists("/etc/SuSE-release")) {
StringParse strFile = LoadFile_Safe("/etc/SuSE-release");
distro = strFile.GetText();
strFile.GoAfter_Init("VERSION", "=");
distVersion = strFile.GetText();
} else if (FileExists("/etc/mandrake-release")) {
distro = "mandrake";
distVersion = LoadFile_Safe("/etc/mandrake-release");
} else if (FileExists("/etc/mandriva-release")) {
distro = "mandriva";
distVersion = LoadFile_Safe("/etc/mandriva-release");
} else if (FileExists("/etc/aurox-release")) {
distro = "aurox";
distVersion = LoadFile_Safe("/etc/aurox-release");
} else if (FileExists("/etc/altlinux-release")) {
distro = "altlinux";
distVersion = LoadFile_Safe("/etc/altlinux-releas");
} else if (FileExists("/etc/yellowdog-release")) {
distro = "yellowdog";
distVersion = LoadFile_Safe("/etc/gentoo-yellowdog");
} else if (FileExists("/etc/gentoo-release")) {
distro = "gentoo";
distVersion = LoadFile_Safe("/etc/gentoo-release");
} else if (FileExists("/usr/portage")) {
distro = "gentoo";
distVersion = LoadFile_Safe("/usr/portage");
} else if (FileExists("/etc/slackware-version")) {
distro = "slackware";
StringParse strFile = LoadFile_Safe("/etc/slackware-version");
strFile.GetText();
distVersion = strFile.GetText();
} else if (FileExists("/etc/debian_version")) {
distro = "debian";
distVersion = LoadFile_Safe("/etc/debian_version");
} else if (LoadFile_Safe("/etc/release").Find("Solaris") >= 0)
distro = "solaris";
else if (Sys("uname -r").Find("solaris") >= 0)
distro = "solaris";
else { // If not try with /etc/osname_version
distro = LoadFile_Safe("/etc/osname_version");
distVersion = "";
}
if (distro == "")
distro = LoadFile_Safe("/etc/issue");
if (distro == "")
distro = distVersion = "UNKNOWN";
return true;
}
#endif
END_UPP_NAMESPACE