121 lines
3.0 KiB
C++
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();
|
|
}
|
|
} |