From: Arnaud Ferraris Date: Tue, 14 Sep 2021 13:40:42 +0000 (+0200) Subject: hostnamed: add support for getting the chassis type from device-tree X-Git-Tag: v250-rc1~665^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e6e6ca82515d69c58f4940ec8189f78bb5880eb2;p=thirdparty%2Fsystemd.git hostnamed: add support for getting the chassis type from device-tree Device-tree based devices can't get the chassis type from DMI or ACPI, and so far need a custom `/etc/machine-info` to set this property right. A new 'chassis-type' toplevel device tree property has recently been approved into the DT specification, making it possible to automate chassis type detection on such devices. This patch therefore falls back to reading this device-tree property if nothing is available through both DMI and ACPI. Signed-off-by: Arnaud Ferraris --- diff --git a/src/hostname/hostnamed.c b/src/hostname/hostnamed.c index 2557d6d8071..bcd24498619 100644 --- a/src/hostname/hostnamed.c +++ b/src/hostname/hostnamed.c @@ -166,10 +166,10 @@ static void context_read_os_release(Context *c) { c->etc_os_release_stat = current_stat; } -static bool valid_chassis(const char *chassis) { +static const char* valid_chassis(const char *chassis) { assert(chassis); - return nulstr_contains( + return nulstr_get( "vm\0" "container\0" "desktop\0" @@ -190,6 +190,7 @@ static bool valid_deployment(const char *deployment) { } static const char* fallback_chassis(void) { + const char *chassis; char *type; unsigned t; int v, r; @@ -261,14 +262,14 @@ try_acpi: r = read_one_line_file("/sys/firmware/acpi/pm_profile", &type); if (r < 0) { log_debug_errno(r, "Failed read ACPI PM profile, ignoring: %m"); - return NULL; + goto try_devicetree; } r = safe_atou(type, &t); free(type); if (r < 0) { log_debug_errno(r, "Failed parse ACPI PM profile, ignoring: %m"); - return NULL; + goto try_devicetree; } /* We only list the really obvious cases here as the ACPI data is not really super reliable. @@ -300,7 +301,24 @@ try_acpi: log_debug("Unhandled ACPI PM profile 0x%02x, ignoring.", t); } - return NULL; +try_devicetree: + r = read_one_line_file("/sys/firmware/devicetree/base/chassis-type", &type); + if (r < 0) { + log_debug_errno(r, "Failed to read device-tree chassis type, ignoring: %m"); + return NULL; + } + + /* Note that the Devicetree specification uses the very same vocabulary + * of chassis types as we do, hence we do not need to translate these types: + * + * https://github.com/devicetree-org/devicetree-specification/blob/master/source/chapter3-devicenodes.rst */ + chassis = valid_chassis(type); + if (!chassis) + log_debug("Invalid device-tree chassis type '%s', ignoring.", type); + + free(type); + + return chassis; } static char* context_fallback_icon_name(Context *c) {