From: Lennart Poettering Date: Fri, 20 Dec 2024 11:20:09 +0000 (+0100) Subject: analyze-chid: split out code that reads smbios into helper X-Git-Tag: v258-rc1~1796^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0eb51d99137a81a66b1e6c5e0915f354ca47d8a8;p=thirdparty%2Fsystemd.git analyze-chid: split out code that reads smbios into helper --- diff --git a/src/analyze/analyze-chid.c b/src/analyze/analyze-chid.c index 22f7b6d6035..7cc51ae4056 100644 --- a/src/analyze/analyze-chid.c +++ b/src/analyze/analyze-chid.c @@ -107,7 +107,7 @@ static void smbios_fields_free(char16_t *(*fields)[_CHID_SMBIOS_FIELDS_MAX]) { free(*i); } -int verb_chid(int argc, char *argv[], void *userdata) { +static int smbios_fields_acquire(char16_t *fields[static _CHID_SMBIOS_FIELDS_MAX]) { static const char *const smbios_files[_CHID_SMBIOS_FIELDS_MAX] = { [CHID_SMBIOS_MANUFACTURER] = "sys_vendor", @@ -118,24 +118,12 @@ int verb_chid(int argc, char *argv[], void *userdata) { [CHID_SMBIOS_BASEBOARD_PRODUCT] = "board_name", }; - _cleanup_(table_unrefp) Table *table = NULL; int r; - if (detect_container() > 0) - return log_error_errno(SYNTHETIC_ERRNO(ENOTRECOVERABLE), "Container environments do not have SMBIOS."); - - table = table_new("type", "input", "chid"); - if (!table) - return log_oom(); - - (void) table_set_align_percent(table, table_get_cell(table, 0, 0), 100); - (void) table_set_align_percent(table, table_get_cell(table, 0, 1), 50); - _cleanup_close_ int smbios_fd = open("/sys/class/dmi/id", O_RDONLY|O_DIRECTORY|O_CLOEXEC); if (smbios_fd < 0) return log_error_errno(errno, "Failed to open SMBIOS sysfs object: %m"); - _cleanup_(smbios_fields_free) char16_t* smbios_fields[_CHID_SMBIOS_FIELDS_MAX] = {}; for (ChidSmbiosFields f = 0; f < _CHID_SMBIOS_FIELDS_MAX; f++) { _cleanup_free_ char *buf = NULL; size_t size; @@ -164,11 +152,34 @@ int verb_chid(int argc, char *argv[], void *userdata) { size--; - smbios_fields[f] = utf8_to_utf16(buf, size); - if (!smbios_fields[f]) + fields[f] = utf8_to_utf16(buf, size); + if (!fields[f]) return log_oom(); } + return 0; +} + +int verb_chid(int argc, char *argv[], void *userdata) { + + _cleanup_(table_unrefp) Table *table = NULL; + int r; + + if (detect_container() > 0) + return log_error_errno(SYNTHETIC_ERRNO(ENOTRECOVERABLE), "Container environments do not have SMBIOS."); + + table = table_new("type", "input", "chid"); + if (!table) + return log_oom(); + + (void) table_set_align_percent(table, table_get_cell(table, 0, 0), 100); + (void) table_set_align_percent(table, table_get_cell(table, 0, 1), 50); + + _cleanup_(smbios_fields_free) char16_t* smbios_fields[_CHID_SMBIOS_FIELDS_MAX] = {}; + r = smbios_fields_acquire(smbios_fields); + if (r < 0) + return r; + EFI_GUID chids[CHID_TYPES_MAX] = {}; chid_calculate((const char16_t* const*) smbios_fields, chids);