dmidecode-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dmidecode] [PATCH v2 1/2] dmidecode: Add option to filter output based


From: Jerry Hoemann
Subject: [dmidecode] [PATCH v2 1/2] dmidecode: Add option to filter output based upon handle.
Date: Fri, 29 Jun 2018 15:33:00 -0600

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 <address@hidden>
---
 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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]