aboutsummaryrefslogtreecommitdiff
path: root/hardinfo/dmi_util.c
diff options
context:
space:
mode:
Diffstat (limited to 'hardinfo/dmi_util.c')
-rw-r--r--hardinfo/dmi_util.c21
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;
}