Host (Linux): fixes host is missing in some machine

Fixes #2279
This commit is contained in:
Carter Li
2026-04-23 09:35:03 +08:00
parent 768bc154d4
commit 3eaebd3359
+22 -11
View File
@@ -51,12 +51,32 @@ static bool getHostVendor(FFstrbuf* vendor) {
const char* ffDetectHost(FFHostResult* host) {
// This is a hack for Asahi Linux, whose product_family is empty
if (ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_family", "/sys/class/dmi/id/product_family", &host->family)) {
ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_name", "/sys/class/dmi/id/product_name", &host->name);
bool productName = ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_name", "/sys/class/dmi/id/product_name", &host->name);
bool productFamily = ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_family", "/sys/class/dmi/id/product_family", &host->family);
if (productName || productFamily) {
ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_version", "/sys/class/dmi/id/product_version", &host->version);
ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_sku", "/sys/class/dmi/id/product_sku", &host->sku);
ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_serial", "/sys/class/dmi/id/product_serial", &host->serial);
ffGetSmbiosValue("/sys/devices/virtual/dmi/id/sys_vendor", "/sys/class/dmi/id/sys_vendor", &host->vendor);
#if __x86_64__
ffHostDetectMac(host);
#endif
// KVM/Qemu virtual machine
if (ffStrbufStartsWithS(&host->name, "Standard PC")) {
ffStrbufPrependS(&host->name, "KVM/QEMU ");
}
#if __aarch64__
else if (host->family.length == 0 && ffStrbufEqualS(&host->vendor, "Apple Inc.") && ffStrbufStartsWithS(&host->name, "Mac")) {
// Hack for Asahi Linux
ffStrbufDestroy(&host->family);
ffStrbufInitMove(&host->family, &host->name);
getHostProductName(&host->name);
getHostSerialNumber(&host->serial);
}
#endif
} else {
getHostProductFamily(&host->family);
getHostProductName(&host->name);
@@ -64,15 +84,6 @@ const char* ffDetectHost(FFHostResult* host) {
getHostVendor(&host->vendor);
}
#ifdef __x86_64__
ffHostDetectMac(host);
#endif
// KVM/Qemu virtual machine
if (ffStrbufStartsWithS(&host->name, "Standard PC")) {
ffStrbufPrependS(&host->name, "KVM/QEMU ");
}
if (host->family.length == 0 && host->name.length == 0) {
const char* wslDistroName = getenv("WSL_DISTRO_NAME");
// On WSL, the real host can't be detected. Instead use WSL as host.