From 80cc4e3f4ad62510ba184606eb2173a59e7e73a0 Mon Sep 17 00:00:00 2001 From: Carter Li Date: Mon, 8 Jan 2024 11:19:35 +0800 Subject: [PATCH] Host (Linux): detect serial number for Asahi Linux --- src/detection/host/host_linux.c | 60 +++++++++++++++++++++++---------- src/util/smbiosHelper.c | 7 ++-- src/util/smbiosHelper.h | 2 +- 3 files changed, 48 insertions(+), 21 deletions(-) diff --git a/src/detection/host/host_linux.c b/src/detection/host/host_linux.c index 372557a88..92b1c49f9 100644 --- a/src/detection/host/host_linux.c +++ b/src/detection/host/host_linux.c @@ -7,35 +7,61 @@ static void getHostProductName(FFstrbuf* name) { - ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_name", "/sys/class/dmi/id/product_name", name); - if(name->length > 0) - return; + if (ffReadFileBuffer("/sys/firmware/devicetree/base/model", name)) + { + ffStrbufTrimRightSpace(name); + ffStrbufTrimRight(name, '\0'); + if(ffIsSmbiosValueSet(name)) + return; + } - ffReadFileBuffer("/sys/firmware/devicetree/base/model", name); - if(ffIsSmbiosValueSet(name)) - return; + if (ffReadFileBuffer("/sys/firmware/devicetree/base/banner-name", name)) + { + ffStrbufTrimRightSpace(name); + ffStrbufTrimRight(name, '\0'); + if(ffIsSmbiosValueSet(name)) + return; + } - ffReadFileBuffer("/sys/firmware/devicetree/base/banner-name", name); - if(ffIsSmbiosValueSet(name)) - return; - - //does a clear before the read - ffReadFileBuffer("/tmp/sysinfo/model", name); - if(ffIsSmbiosValueSet(name)) - return; + if (ffReadFileBuffer("/tmp/sysinfo/model", name)) + { + ffStrbufTrimRightSpace(name); + ffStrbufTrimRight(name, '\0'); + if(ffIsSmbiosValueSet(name)) + return; + } ffStrbufClear(name); } +static void getHostSerialNumber(FFstrbuf* serial) +{ + if (ffReadFileBuffer("/sys/firmware/devicetree/base/serial-number", serial)) + { + ffStrbufTrimRightSpace(serial); + ffStrbufTrimRight(serial, '\0'); + if(ffIsSmbiosValueSet(serial)) + return; + } + + ffStrbufClear(serial); +} + const char* ffDetectHost(FFHostResult* host) { ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_family", "/sys/class/dmi/id/product_family", &host->family); - getHostProductName(&host->name); + if (!ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_name", "/sys/class/dmi/id/product_name", &host->name)) + getHostProductName(&host->name); 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); + if (!ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_serial", "/sys/class/dmi/id/product_serial", &host->serial)) + getHostSerialNumber(&host->serial); ffGetSmbiosValue("/sys/devices/virtual/dmi/id/product_uuid", "/sys/class/dmi/id/product_uuid", &host->uuid); - ffGetSmbiosValue("/sys/devices/virtual/dmi/id/sys_vendor", "/sys/class/dmi/id/sys_vendor", &host->vendor); + if (!ffGetSmbiosValue("/sys/devices/virtual/dmi/id/sys_vendor", "/sys/class/dmi/id/sys_vendor", &host->vendor)) + { + if (ffStrbufStartsWithS(&host->name, "Apple ")) + ffStrbufSetStatic(&host->vendor, "Apple Inc."); + } //KVM/Qemu virtual machine if(ffStrbufStartsWithS(&host->name, "Standard PC")) diff --git a/src/util/smbiosHelper.c b/src/util/smbiosHelper.c index 4ba518079..a9ab4e857 100644 --- a/src/util/smbiosHelper.c +++ b/src/util/smbiosHelper.c @@ -31,23 +31,24 @@ bool ffIsSmbiosValueSet(FFstrbuf* value) } #ifdef __linux__ -void ffGetSmbiosValue(const char* devicesPath, const char* classPath, FFstrbuf* buffer) +bool ffGetSmbiosValue(const char* devicesPath, const char* classPath, FFstrbuf* buffer) { if (ffReadFileBuffer(devicesPath, buffer)) { ffStrbufTrimRightSpace(buffer); if(ffIsSmbiosValueSet(buffer)) - return; + return true; } if (ffReadFileBuffer(classPath, buffer)) { ffStrbufTrimRightSpace(buffer); if(ffIsSmbiosValueSet(buffer)) - return; + return true; } ffStrbufClear(buffer); + return false; } #elif defined(_WIN32) #include diff --git a/src/util/smbiosHelper.h b/src/util/smbiosHelper.h index e59211889..6a80b3ab5 100644 --- a/src/util/smbiosHelper.h +++ b/src/util/smbiosHelper.h @@ -13,7 +13,7 @@ static inline void ffCleanUpSmbiosValue(FFstrbuf* value) } #ifdef __linux__ -void ffGetSmbiosValue(const char* devicesPath, const char* classPath, FFstrbuf* buffer); +bool ffGetSmbiosValue(const char* devicesPath, const char* classPath, FFstrbuf* buffer); #elif defined(_WIN32) // https://github.com/KunYi/DumpSMBIOS // https://www.dmtf.org/sites/default/files/standards/documents/DSP0134_3.7.0.pdf