diff options
Diffstat (limited to 'hardinfo/dmi_util.c')
-rw-r--r-- | hardinfo/dmi_util.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/hardinfo/dmi_util.c b/hardinfo/dmi_util.c index 6479de6b..55e21c4d 100644 --- a/hardinfo/dmi_util.c +++ b/hardinfo/dmi_util.c @@ -234,6 +234,11 @@ char *dmi_chassis_type_str(int chassis_type, gboolean with_val) { return NULL; } +/* TODO: something better maybe */ +char *dd_cache[128] = {}; +void dmidecode_cache_free() +{ int i; for(i = 0; i < 128; i++) g_free(dd_cache[i]); } + char *dmidecode_read(const unsigned long *dmi_type) { gchar *ret = NULL; gchar full_path[PATH_MAX]; @@ -242,10 +247,15 @@ char *dmidecode_read(const unsigned long *dmi_type) { int i = 0; - if (dmi_type) + if (dmi_type) { + if (dd_cache[*dmi_type]) + return g_strdup(dd_cache[*dmi_type]); snprintf(full_path, PATH_MAX, "dmidecode -t %lu", *dmi_type); - else + } else { + if (dd_cache[127]) + return g_strdup(dd_cache[127]); snprintf(full_path, PATH_MAX, "dmidecode"); + } spawned = g_spawn_command_line_sync(full_path, &out, &err, &i, NULL); @@ -258,6 +268,13 @@ char *dmidecode_read(const unsigned long *dmi_type) { g_free(err); } + if (ret) { + if (*dmi_type) + dd_cache[*dmi_type] = g_strdup(ret); + else + dd_cache[127] = g_strdup(ret); + } + return ret; } |