Add possibility to supply the container name to rv list:

  # rv list sched
  mon1
  mon2
  mon3

This lists only monitors in sched, without indentation.
Supplying -h, any option (string starting with -) or more than 1
argument will still print the usage.
Passing a non-existent container prints nothing and passing no container
continues to print all monitors, showing indentation for nested
monitors, reported after their container.

Signed-off-by: Gabriele Monaco <gmon...@redhat.com>
---
 tools/verification/rv/include/in_kernel.h |  2 +-
 tools/verification/rv/src/in_kernel.c     | 36 +++++++++++++++------
 tools/verification/rv/src/rv.c            | 38 +++++++++++++++--------
 3 files changed, 53 insertions(+), 23 deletions(-)

diff --git a/tools/verification/rv/include/in_kernel.h 
b/tools/verification/rv/include/in_kernel.h
index 3090638c8d710..f3bfd3b9895fe 100644
--- a/tools/verification/rv/include/in_kernel.h
+++ b/tools/verification/rv/include/in_kernel.h
@@ -1,3 +1,3 @@
 // SPDX-License-Identifier: GPL-2.0
-int ikm_list_monitors(void);
+int ikm_list_monitors(char *container);
 int ikm_run_monitor(char *monitor, int argc, char **argv);
diff --git a/tools/verification/rv/src/in_kernel.c 
b/tools/verification/rv/src/in_kernel.c
index 032b851019290..c0dcee795c0de 100644
--- a/tools/verification/rv/src/in_kernel.c
+++ b/tools/verification/rv/src/in_kernel.c
@@ -180,19 +180,25 @@ static char *ikm_read_desc(char *monitor_name)
 /*
  * ikm_fill_monitor_definition - fill monitor's definition
  *
- * Returns -1 on error, 0 otherwise.
+ * Returns -1 on error, 1 if the monitor does not belong in the container, 0 
otherwise.
+ * container can be NULL
  */
-static int ikm_fill_monitor_definition(char *name, struct monitor *ikm)
+static int ikm_fill_monitor_definition(char *name, struct monitor *ikm, char 
*container)
 {
        int enabled;
        char *desc, *nested_name;
 
        nested_name = strstr(name, ":");
        if (nested_name) {
+               /* it belongs in container if it starts with "container:" */
+               if (container && strstr(name, container) != name)
+                       return 1;
                *nested_name = '/';
                ++nested_name;
                ikm->nested = 1;
        } else {
+               if (container)
+                       return 1;
                nested_name = name;
                ikm->nested = 0;
        }
@@ -328,12 +334,12 @@ static int ikm_has_id(char *monitor_name)
  *
  * Returns 0 on success, -1 otherwise.
  */
-int ikm_list_monitors(void)
+int ikm_list_monitors(char *container)
 {
        char *available_monitors;
        struct monitor ikm = {0};
        char *curr, *next;
-       int retval;
+       int retval, list_monitor = 0;
 
        available_monitors = tracefs_instance_file_read(NULL, 
"rv/available_monitors", NULL);
 
@@ -347,17 +353,29 @@ int ikm_list_monitors(void)
                next = strstr(curr, "\n");
                *next = '\0';
 
-               retval = ikm_fill_monitor_definition(curr, &ikm);
-               if (retval)
+               retval = ikm_fill_monitor_definition(curr, &ikm, container);
+               if (retval < 0)
                        err_msg("ikm: error reading %d in kernel monitor, 
skipping\n", curr);
 
-               printf("%s%-*s %s %s\n", ikm.nested ? " - " : "",
-                      ikm.nested ? MAX_DA_NAME_LEN - 3 : MAX_DA_NAME_LEN,
-                      ikm.name, ikm.desc, ikm.enabled ? "[ON]" : "[OFF]");
+               if (!retval) {
+                       int indent = ikm.nested && !container;
+
+                       list_monitor = 1;
+                       printf("%s%-*s %s %s\n", indent ? " - " : "",
+                              indent ? MAX_DA_NAME_LEN - 3 : MAX_DA_NAME_LEN,
+                              ikm.name, ikm.desc, ikm.enabled ? "[ON]" : 
"[OFF]");
+               }
                curr = ++next;
 
        } while (strlen(curr));
 
+       if (!list_monitor) {
+               if (container)
+                       printf("-- No monitor found in container %s --\n", 
container);
+               else
+                       printf("-- No monitor found --\n");
+       }
+
        free(available_monitors);
 
        return 0;
diff --git a/tools/verification/rv/src/rv.c b/tools/verification/rv/src/rv.c
index 1ddb855328165..239de054d1e06 100644
--- a/tools/verification/rv/src/rv.c
+++ b/tools/verification/rv/src/rv.c
@@ -41,30 +41,42 @@ static void rv_list(int argc, char **argv)
 {
        static const char *const usage[] = {
                "",
-               "  usage: rv list [-h]",
+               "  usage: rv list [-h] [container]",
                "",
                "       list all available monitors",
                "",
                "       -h/--help: print this menu",
+               "",
+               "       [container]: list only monitors in this container",
                NULL,
        };
-       int i;
-
-       if (argc > 1) {
+       int i, print_help = 0, retval = 0;
+       char *container = NULL;
+
+       if (argc == 2) {
+               if (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) {
+                       print_help = 1;
+                       retval = 0;
+               } else if (argv[1][0] == '-') {
+                       /* assume invalid option */
+                       print_help = 1;
+                       retval = 1;
+               } else
+                       container = argv[1];
+       } else if (argc > 2) {
+               /* more than 2 is always usage */
+               print_help = 1;
+               retval = 1;
+       }
+       if (print_help) {
                fprintf(stderr, "rv version %s\n", VERSION);
-
-               /* more than 1 is always usage */
                for (i = 0; usage[i]; i++)
                        fprintf(stderr, "%s\n", usage[i]);
-
-               /* but only -h is valid */
-               if (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help"))
-                       exit(0);
-               else
-                       exit(1);
+               exit(retval);
        }
 
-       ikm_list_monitors();
+       ikm_list_monitors(container);
+
        exit(0);
 }
 
-- 
2.48.1


Reply via email to