/* SPDX-FileCopyrightText: 2026 Project Tick * SPDX-FileContributor: Project Tick * SPDX-License-Identifier: GPL-3.0-or-later * * MeshMC - A Custom Launcher for Minecraft * Copyright (C) 2026 Project Tick * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "sys.h" #include "distroutils.h" #include #include #include #include #include #include Sys::KernelInfo Sys::getKernelInfo() { Sys::KernelInfo out; struct utsname buf; uname(&buf); // NOTE: we assume linux here. this needs further elaboration out.kernelType = KernelType::Linux; out.kernelName = buf.sysname; QString release = out.kernelVersion = buf.release; // linux binary running on WSL is cursed. out.isCursed = release.contains("WSL", Qt::CaseInsensitive) || release.contains("Microsoft", Qt::CaseInsensitive); out.kernelMajor = 0; out.kernelMinor = 0; out.kernelPatch = 0; auto sections = release.split('-'); if (sections.size() >= 1) { auto versionParts = sections[0].split('.'); if (versionParts.size() >= 3) { out.kernelMajor = versionParts[0].toInt(); out.kernelMinor = versionParts[1].toInt(); out.kernelPatch = versionParts[2].toInt(); } else { qWarning() << "Not enough version numbers in " << sections[0] << " found " << versionParts.size(); } } else { qWarning() << "Not enough '-' sections in " << release << " found " << sections.size(); } return out; } uint64_t Sys::getSystemRam() { std::string token; #ifdef Q_OS_LINUX std::ifstream file("/proc/meminfo"); while (file >> token) { if (token == "MemTotal:") { uint64_t mem; if (file >> mem) { return mem * 1024ull; } else { return 0; } } // ignore rest of the line file.ignore(std::numeric_limits::max(), '\n'); } #elif defined(Q_OS_FREEBSD) char buff[512]; FILE* fp = popen("sysctl hw.physmem", "r"); if (fp != NULL) { while (fgets(buff, 512, fp) != NULL) { std::string str(buff); uint64_t mem = std::stoull(str.substr(12, std::string::npos)); return mem * 1024ull; } } #endif return 0; // nothing found } bool Sys::isCPU64bit() { return isSystem64bit(); } bool Sys::isSystem64bit() { // kernel build arch on linux return QSysInfo::currentCpuArchitecture() == "x86_64"; } Sys::DistributionInfo Sys::getDistributionInfo() { DistributionInfo systemd_info = read_os_release(); DistributionInfo lsb_info = read_lsb_release(); DistributionInfo legacy_info = read_legacy_release(); DistributionInfo result = systemd_info + lsb_info + legacy_info; if (result.distributionName.isNull()) { result.distributionName = "unknown"; } if (result.distributionVersion.isNull()) { if (result.distributionName == "arch") { result.distributionVersion = "rolling"; } else { result.distributionVersion = "unknown"; } } return result; }