/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: SWInfo.Linux.cpp Date: 2022-4-6 Author: Reece ***/ #include #include "SWInfo.hpp" #include "SWInfo.Linux.hpp" namespace Aurora::SWInfo { static AuString gKernelString; static AuString gUserlandBrand; static AuString gUserlandDesktopEnv; static AuString gBuildString; static void SetProcVersion() { AuIOFS::ReadString("/proc/version", gBuildString); if (gBuildString.size() && gBuildString[gBuildString.size() - 1] == '\n') { gBuildString.pop_back(); } } static void SetVersion(OSInformation &osInfo) { char *endPtr; auto versionItr = gBuildString.find("ersion "); if (versionItr == AuString::npos) return; if (versionItr > 2) { gKernelString = gBuildString.substr(0, versionItr - 2); } auto ptr = gBuildString.c_str() + (7 + AuUInt(versionItr)); osInfo.uKernelMajor = strtoll(ptr, &endPtr, 10); if (errno == ERANGE) return; if (*endPtr != '.') return; endPtr++; osInfo.uKernelMinor = strtoll(endPtr, &endPtr, 10); if (errno == ERANGE) return; if (*endPtr != '.') return; endPtr++; osInfo.uKernelPatch = strtoll(endPtr, &endPtr, 10); } static void ParseOSRel(OSInformation &osInfo) { AuString osRel; if (!AuIOFS::ReadString("/etc/os-release", osRel)) return; AuReplaceAll(osRel, "\"", ""); AuList versionNumbers; Parse::SplitNewlines(osRel, [&](const AuString &line) { if (AuStartsWith(line, "NAME=")) { gUserlandBrand = line.substr(5); } else if (AuStartsWith(line, "VERSION=")) { versionNumbers.push_back(line.substr(8)); } else if (AuStartsWith(line, "VERSION_ID=")) { versionNumbers.push_back(line.substr(11)); } else if (AuStartsWith(line, "BUILD_ID=")) { versionNumbers.push_back(line.substr(9)); } }); // TODO: parse uUserlandMajor, uUserlandMinor, uUserlandPatch } static void SetDesktopWindowManager() { const char *name; name = ::getenv("XDG_CURRENT_DESKTOP"); if (!name) { name = ::getenv("XDG_SESSION_DESKTOP"); } if (!name) { name = ::getenv("DESKTOP_SESSION"); } if (name) { gUserlandDesktopEnv = name; } } void InitLinuxInfo(OSInformation &osInfo) { osInfo = AuMove(OSInformation(&gKernelString, &gUserlandBrand, &gUserlandDesktopEnv, &gBuildString, Aurora::Build::EPlatform::eEnumInvalid)); SetProcVersion(); SetVersion(osInfo); ParseOSRel(osInfo); SetDesktopWindowManager(); } }