summaryrefslogtreecommitdiffstats
path: root/dmi.c
diff options
context:
space:
mode:
authorOlivier Blin <oblin@mandriva.com>2006-07-12 16:13:27 +0000
committerOlivier Blin <oblin@mandriva.com>2006-07-12 16:13:27 +0000
commit1e501fceaadaaf11d511d8a7920cbcb7a973cdd6 (patch)
tree8382acd486971596a0ffbfaf4cab0218f1a798d7 /dmi.c
parent91ec30475395310bd883380efc9751a93d1a0ac2 (diff)
downloadldetect-1e501fceaadaaf11d511d8a7920cbcb7a973cdd6.tar
ldetect-1e501fceaadaaf11d511d8a7920cbcb7a973cdd6.tar.gz
ldetect-1e501fceaadaaf11d511d8a7920cbcb7a973cdd6.tar.bz2
ldetect-1e501fceaadaaf11d511d8a7920cbcb7a973cdd6.tar.xz
ldetect-1e501fceaadaaf11d511d8a7920cbcb7a973cdd6.zip
dmidecode >= 2.7 support
Diffstat (limited to 'dmi.c')
-rw-r--r--dmi.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/dmi.c b/dmi.c
index 58e4184..f4d3e86 100644
--- a/dmi.c
+++ b/dmi.c
@@ -120,11 +120,20 @@ static struct criteria criteria_from_dmidecode(void) {
r.criteria = malloc(sizeof(*r.criteria) * MAX_DEVICES);
struct category *category = NULL;
+
+ /* dmidecode output is less indented as of 2.7 */
+ int tab_level = 1;
+ if (fgets(buf, sizeof(buf) - 1, f)) {
+ int major, minor;
+ if (sscanf(buf, "# dmidecode %d.%d", &major, &minor) == 2 && major >= 2 && minor >= 7)
+ tab_level = 0;
+ }
+
while (fgets(buf, sizeof(buf) - 1, f)) {
- if (!buf[0] || !buf[1] || buf[0] != '\t')
+ if (!buf[0] || !buf[1] || (tab_level && buf[0] != '\t'))
; /* don't care */
- else if (buf[1] != '\t') {
- char *s = buf + 1;
+ else if (buf[tab_level] != '\t') {
+ char *s = buf + tab_level;
if (!str_begins_with(s, "DMI type ")) {
remove_ending_spaces(s);
remove_suffix_in_place(s, " Information");
@@ -132,7 +141,7 @@ static struct criteria criteria_from_dmidecode(void) {
}
} else if (category) {
/* don't even look if we don't have an interesting category */
- char *s = buf + 2;
+ char *s = buf + tab_level + 1;
char *val = get_after_colon(s);
if (val && lookup_field(category, s)) {
struct criterion *criterion = &r.criteria[r.nb++];