AuroraRuntime/Source/SWInfo/AuSWInfo.Linux.cpp

121 lines
3.0 KiB
C++

/***
Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved.
File: AuSWInfo.Linux.cpp
Date: 2022-4-6
Author: Reece
***/
#include <Source/RuntimeInternal.hpp>
#include "AuSWInfo.hpp"
#include "AuSWInfo.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<AuString> 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();
}
}