diff options
-rw-r--r-- | dmidecode.c | 15 | ||||
-rw-r--r-- | dmiopt.c | 40 | ||||
-rw-r--r-- | man/dmidecode.8 | 7 |
3 files changed, 61 insertions, 1 deletions
diff --git a/dmidecode.c b/dmidecode.c index ea06610..6559567 100644 --- a/dmidecode.c +++ b/dmidecode.c @@ -4555,6 +4555,21 @@ static void dmi_table_string(const struct dmi_header *h, const u8 *data, u16 ver int key; u8 offset = opt.string->offset; + if (opt.string->type == 11) /* OEM strings */ + { + if (h->length < 5 || offset > data[4]) + { + fprintf(stderr, "No OEM string number %u\n", offset); + return; + } + + if (offset) + printf("%s\n", dmi_string(h, offset)); + else + printf("%u\n", data[4]); /* count */ + return; + } + if (offset >= h->length) return; @@ -20,6 +20,7 @@ */ #include <stdio.h> +#include <string.h> #include <strings.h> #include <stdlib.h> #include <getopt.h> @@ -171,6 +172,10 @@ static const struct string_keyword opt_string_keyword[] = { { "processor-frequency", 4, 0x16 }, /* dmi_processor_frequency() */ }; +/* This is a template, 3rd field is set at runtime. */ +static struct string_keyword opt_oem_string_keyword = + { NULL, 11, 0x00 }; + static void print_opt_string_list(void) { unsigned int i; @@ -206,6 +211,34 @@ static int parse_opt_string(const char *arg) return -1; } +static int parse_opt_oem_string(const char *arg) +{ + unsigned long val; + char *next; + + if (opt.string) + { + fprintf(stderr, "Only one string can be specified\n"); + return -1; + } + + /* Return the number of OEM strings */ + if (strcmp(arg, "count") == 0) + goto done; + + val = strtoul(arg, &next, 10); + if (next == arg || val == 0x00 || val > 0xff) + { + fprintf(stderr, "Invalid OEM string number: %s\n", arg); + return -1; + } + + opt_oem_string_keyword.offset = val; +done: + opt.string = &opt_oem_string_keyword; + return 0; +} + /* * Command line options handling @@ -225,6 +258,7 @@ int parse_command_line(int argc, char * const argv[]) { "dump", no_argument, NULL, 'u' }, { "dump-bin", required_argument, NULL, 'B' }, { "from-dump", required_argument, NULL, 'F' }, + { "oem-string", required_argument, NULL, 'O' }, { "no-sysfs", no_argument, NULL, 'S' }, { "version", no_argument, NULL, 'V' }, { NULL, 0, NULL, 0 } @@ -255,6 +289,11 @@ int parse_command_line(int argc, char * const argv[]) return -1; opt.flags |= FLAG_QUIET; break; + case 'O': + if (parse_opt_oem_string(optarg) < 0) + return -1; + opt.flags |= FLAG_QUIET; + break; case 't': opt.type = parse_opt_type(opt.type, optarg); if (opt.type == NULL) @@ -315,6 +354,7 @@ void print_help(void) " --dump-bin FILE Dump the DMI data to a binary file\n" " --from-dump FILE Read the DMI data from a binary file\n" " --no-sysfs Do not attempt to read DMI data from sysfs files\n" + " --oem-string N Only display the value of the given OEM string\n" " -V, --version Display the version and exit\n"; printf("%s", help); diff --git a/man/dmidecode.8 b/man/dmidecode.8 index a64cf5d..bef204e 100644 --- a/man/dmidecode.8 +++ b/man/dmidecode.8 @@ -134,13 +134,18 @@ Read the DMI data from a binary file previously generated using Do not attempt to read DMI data from sysfs files. This is mainly useful for debugging. .TP +.BR " " " " "--oem-string N" +Only display the value of the \s-1OEM\s0 string number \fBN\fR. The first +\s-1OEM\s0 string has number 1. With special value "count", return the +number of OEM strings instead. +.TP .BR "-h" ", " "--help" Display usage information and exit .TP .BR "-V" ", " "--version" Display the version and exit .P -Options --string, --type and --dump-bin +Options --string, --type, --dump-bin and --oem-string determine the output format and are mutually exclusive. .P Please note in case of |