aboutsummaryrefslogtreecommitdiff
path: root/hardinfo/dmi_util.c
diff options
context:
space:
mode:
authorBurt P <pburt0@gmail.com>2019-07-17 22:44:25 -0500
committerLeandro A. F. Pereira <leandro@hardinfo.org>2019-07-29 19:41:44 -0700
commitc76abd986b499ee7a0c53a1a7fc9cc6ea041bccd (patch)
treec7152277e5fc3fdfd0a21c2d533f7bc476aac781 /hardinfo/dmi_util.c
parent39e61e06d9535adc7b5ef9d3bab15e640a1637f5 (diff)
dmi_util: extended handle data type
Signed-off-by: Burt P <pburt0@gmail.com>
Diffstat (limited to 'hardinfo/dmi_util.c')
-rw-r--r--hardinfo/dmi_util.c77
1 files changed, 67 insertions, 10 deletions
diff --git a/hardinfo/dmi_util.c b/hardinfo/dmi_util.c
index c82e86b4..5f9f6f9a 100644
--- a/hardinfo/dmi_util.c
+++ b/hardinfo/dmi_util.c
@@ -21,6 +21,52 @@
#include "hardinfo.h"
#include "dmi_util.h"
+static const char *dmi_type_strings[] = {
+ [0] = N_("BIOS Information"),
+ [1] = N_("System"),
+ [2] = N_("Base Board"),
+ [3] = N_("Chassis"),
+ [4] = N_("Processor"),
+ [5] = N_("Memory Controller"),
+ [6] = N_("Memory Module"),
+ [7] = N_("Cache"),
+ [8] = N_("Port Connector"),
+ [9] = N_("System Slots"),
+ [10] = N_("On Board Devices"),
+ [11] = N_("OEM Strings"),
+ [12] = N_("System Configuration Options"),
+ [13] = N_("BIOS Language"),
+ [14] = N_("Group Associations"),
+ [15] = N_("System Event Log"),
+ [16] = N_("Physical Memory Array"),
+ [17] = N_("Memory Device"),
+ [18] = N_("32-bit Memory Error"),
+ [19] = N_("Memory Array Mapped Address"),
+ [20] = N_("Memory Device Mapped Address"),
+ [21] = N_("Built-in Pointing Device"),
+ [22] = N_("Portable Battery"),
+ [23] = N_("System Reset"),
+ [24] = N_("Hardware Security"),
+ [25] = N_("System Power Controls"),
+ [26] = N_("Voltage Probe"),
+ [27] = N_("Cooling Device"),
+ [28] = N_("Temperature Probe"),
+ [29] = N_("Electrical Current Probe"),
+ [30] = N_("Out-of-band Remote Access"),
+ [31] = N_("Boot Integrity Services"),
+ [32] = N_("System Boot"),
+ [33] = N_("64-bit Memory Error"),
+ [34] = N_("Management Device"),
+ [35] = N_("Management Device Component"),
+ [36] = N_("Management Device Threshold Data"),
+ [37] = N_("Memory Channel"),
+ [38] = N_("IPMI Device"),
+ [39] = N_("Power Supply"),
+ [40] = N_("Additional Information"),
+ [41] = N_("Onboard Device"),
+ //127 = End of Table
+};
+
/* frees the string and sets it NULL if it is to be ignored
* returns -1 if error, 0 if ok, 1 if ignored */
static int ignore_placeholder_strings(gchar **pstr) {
@@ -269,7 +315,7 @@ char *dmidecode_read(const dmi_type *type) {
}
if (ret) {
- if (*type)
+ if (type)
dd_cache[*type] = g_strdup(ret);
else
dd_cache[127] = g_strdup(ret);
@@ -278,31 +324,40 @@ char *dmidecode_read(const dmi_type *type) {
return ret;
}
-dmi_handle_list *dmi_handle_list_add(dmi_handle_list *hl, dmi_handle new_handle) {
+dmi_handle_list *dmi_handle_list_add(dmi_handle_list *hl, dmi_handle_ext new_handle_ext) {
+ if (new_handle_ext.type < G_N_ELEMENTS(dmi_type_strings) )
+ new_handle_ext.type_str = dmi_type_strings[new_handle_ext.type];
if (!hl) {
hl = malloc(sizeof(dmi_handle_list));
hl->count = 1;
hl->handles = malloc(sizeof(dmi_handle) * hl->count);
+ hl->handles_ext = malloc(sizeof(dmi_handle_ext) * hl->count);
} else {
hl->count++;
hl->handles = realloc(hl->handles, sizeof(dmi_handle) * hl->count);
+ hl->handles_ext = realloc(hl->handles_ext, sizeof(dmi_handle_ext) * hl->count);
}
- hl->handles[hl->count - 1] = new_handle;
+ hl->handles_ext[hl->count - 1] = new_handle_ext;
+ hl->handles[hl->count - 1] = new_handle_ext.id;
+
return hl;
}
dmi_handle_list *dmidecode_handles(const dmi_type *type) {
gchar *full = NULL, *p = NULL, *next_nl = NULL;
dmi_handle_list *hl = NULL;
- unsigned int ch = 0;
+
+ // Handle 0x003B, DMI type 9, 17 bytes
full = dmidecode_read(type);
if (full) {
p = full;
while(next_nl = strchr(p, '\n')) {
+ unsigned int ch = 0, ct = 0, cb = 0;
strend(p, '\n');
- if (sscanf(p, "Handle 0x%X", &ch) > 0) {
- hl = dmi_handle_list_add(hl, ch);
+ if (sscanf(p, "Handle 0x%X, DMI type %u, %u bytes", &ch, &ct, &cb) > 0) {
+ if (type && !ct) ct = *type;
+ hl = dmi_handle_list_add(hl, (dmi_handle_ext){.id = ch, .type = ct, .size = cb});
}
p = next_nl + 1;
}
@@ -312,8 +367,10 @@ dmi_handle_list *dmidecode_handles(const dmi_type *type) {
}
void dmi_handle_list_free(dmi_handle_list *hl) {
- if (hl)
+ if (hl) {
free(hl->handles);
+ free(hl->handles_ext);
+ }
free(hl);
}
@@ -354,7 +411,7 @@ char *dmidecode_match(const char *name, const dmi_type *type, const dmi_handle *
dmi_handle_list *dmidecode_match_value(const char *name, const char *value, const dmi_type *type) {
dmi_handle_list *hl = NULL;
gchar *full = NULL, *p = NULL, *next_nl = NULL;
- unsigned int ch = 0;
+ unsigned int ch = 0, ct = 0, cb = 0;
int ln = 0, lnv = 0;
if (!name) return NULL;
@@ -366,14 +423,14 @@ dmi_handle_list *dmidecode_match_value(const char *name, const char *value, cons
p = full;
while(next_nl = strchr(p, '\n')) {
strend(p, '\n');
- if (!(sscanf(p, "Handle 0x%X", &ch) > 0) ) {
+ if (!(sscanf(p, "Handle 0x%X, DMI type %u, %u bytes", &ch, &ct, &cb) > 0)) {
while(*p == '\t') p++;
if (strncmp(p, name, ln) == 0) {
if (*(p + ln) == ':') {
p = p + ln + 1;
while(*p == ' ') p++;
if (!value || strncmp(p, value, lnv) == 0)
- hl = dmi_handle_list_add(hl, ch);
+ hl = dmi_handle_list_add(hl, (dmi_handle_ext){.id = ch, .type = ct, .size = cb});
}
}
}