Add option "--handle HANDLE" to dmiopt to allow user to filter ouput to only those entrie(s) that match HANDLE.
Signed-off-by: Jerry Hoemann <[email protected]> --- dmidecode.c | 2 ++ dmiopt.c | 28 +++++++++++++++++++++++++++- dmiopt.h | 1 + man/dmidecode.8 | 4 ++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/dmidecode.c b/dmidecode.c index f8c3b30..fa6ecf1 100644 --- a/dmidecode.c +++ b/dmidecode.c @@ -4732,6 +4732,7 @@ static void dmi_table_decode(u8 *buf, u32 len, u16 num, u16 ver, u32 flags) to_dmi_header(&h, data); display = ((opt.type == NULL || opt.type[h.type]) + && (opt.handle == ~0U || opt.handle == h.handle) && !((opt.flags & FLAG_QUIET) && (h.type == 126 || h.type == 127)) && !opt.string); @@ -5144,6 +5145,7 @@ int main(int argc, char * const argv[]) /* Set default option values */ opt.devmem = DEFAULT_MEM_DEV; opt.flags = 0; + opt.handle = ~0U; if (parse_command_line(argc, argv)<0) { diff --git a/dmiopt.c b/dmiopt.c index a36cf16..7a9963c 100644 --- a/dmiopt.c +++ b/dmiopt.c @@ -240,6 +240,19 @@ static int parse_opt_oem_string(const char *arg) return 0; } +static u32 parse_opt_handle(const char *arg) +{ + u32 val; + char *next; + + val = strtoul(arg, &next, 0); + if (next == arg || *next != '\0' || val > 0xffff) + { + fprintf(stderr, "Invalid handle number: %s\n", arg); + return ~0; + } + return val; +} /* * Command line options handling @@ -249,13 +262,14 @@ static int parse_opt_oem_string(const char *arg) int parse_command_line(int argc, char * const argv[]) { int option; - const char *optstring = "d:hqs:t:uV"; + const char *optstring = "d:hqs:t:H:uV"; struct option longopts[] = { { "dev-mem", required_argument, NULL, 'd' }, { "help", no_argument, NULL, 'h' }, { "quiet", no_argument, NULL, 'q' }, { "string", required_argument, NULL, 's' }, { "type", required_argument, NULL, 't' }, + { "handle", required_argument, NULL, 'H' }, { "dump", no_argument, NULL, 'u' }, { "dump-bin", required_argument, NULL, 'B' }, { "from-dump", required_argument, NULL, 'F' }, @@ -300,6 +314,11 @@ int parse_command_line(int argc, char * const argv[]) if (opt.type == NULL) return -1; break; + case 'H': + opt.handle = parse_opt_handle(optarg); + if (opt.handle == ~0U) + return -1; + break; case 'u': opt.flags |= FLAG_DUMP; break; @@ -332,6 +351,12 @@ int parse_command_line(int argc, char * const argv[]) return -1; } + if (opt.string && opt.handle != ~0U) + { + fprintf(stderr, "Options --string and --handle are mutually exclusive\n"); + return -1; + } + if ((opt.flags & FLAG_FROM_DUMP) && (opt.flags & FLAG_DUMP_BIN)) { fprintf(stderr, "Options --from-dump and --dump-bin are mutually exclusive\n"); @@ -351,6 +376,7 @@ void print_help(void) " -q, --quiet Less verbose output\n" " -s, --string KEYWORD Only display the value of the given DMI string\n" " -t, --type TYPE Only display the entries of given type\n" + " -H, --handle HANDLE Only display the entry of given handle\n" " -u, --dump Do not decode the entries\n" " --dump-bin FILE Dump the DMI data to a binary file\n" " --from-dump FILE Read the DMI data from a binary file\n" diff --git a/dmiopt.h b/dmiopt.h index c676308..2374637 100644 --- a/dmiopt.h +++ b/dmiopt.h @@ -35,6 +35,7 @@ struct opt u8 *type; const struct string_keyword *string; char *dumpfile; + u32 handle; }; extern struct opt opt; diff --git a/man/dmidecode.8 b/man/dmidecode.8 index e3b6b2a..df861e1 100644 --- a/man/dmidecode.8 +++ b/man/dmidecode.8 @@ -115,6 +115,10 @@ is printed and .B dmidecode exits with an error. .TP +.BR "-H" ", " "--handle HANDLE" +Only display the entry whose handle matches \fBHANDLE\fR. \fBHANDLE\fR +is a 16-bit integer. +.TP .BR "-u" ", " "--dump" Do not decode the entries, dump their contents as hexadecimal instead. Note that this is still a text output, no binary data will be thrown upon -- 2.13.6 _______________________________________________ https://lists.nongnu.org/mailman/listinfo/dmidecode-devel
