You can get several config items as below,

    # perf config report.queue-size call-graph.record-mode

but it would be needed to more precisely check arguments,
before show_spec_config() takes over the arguments.
The function would be also used for config write functionality
in the near future.

Cc: Namhyung Kim <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Wang Nan <[email protected]>
Signed-off-by: Taeung Song <[email protected]>
---
 tools/perf/builtin-config.c | 42 ++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 40 insertions(+), 2 deletions(-)

diff --git a/tools/perf/builtin-config.c b/tools/perf/builtin-config.c
index 7b24789..02def73 100644
--- a/tools/perf/builtin-config.c
+++ b/tools/perf/builtin-config.c
@@ -82,6 +82,38 @@ static int show_config(struct perf_config_set *set)
        return 0;
 }
 
+static int parse_config_arg(const char *arg, char **var)
+{
+       const char *last_dot;
+       char *key;
+
+       key = strdup(arg);
+       if (!key) {
+               pr_err("%s: strdup failed\n", __func__);
+               return -1;
+       }
+
+       last_dot = strchr(key, '.');
+       /*
+        * Since "key" actually contains the section name and the real
+        * config variable name separated by a dot, we have to know where the 
dot is.
+        */
+       if (last_dot == NULL || last_dot == key) {
+               pr_err("The config variable does not contain a section: %s\n", 
arg);
+               goto out_err;
+       }
+       if (!last_dot[1]) {
+               pr_err("The config varible does not contain variable name: 
%s\n", arg);
+               goto out_err;
+       }
+
+       *var = key;
+       return 0;
+out_err:
+       free(key);
+       return -1;
+}
+
 int cmd_config(int argc, const char **argv, const char *prefix __maybe_unused)
 {
        int i, ret = 0;
@@ -135,8 +167,14 @@ int cmd_config(int argc, const char **argv, const char 
*prefix __maybe_unused)
                        break;
                }
 
-               for (i = 0; argv[i]; i++)
-                       ret = show_spec_config(set, argv[i]);
+               for (i = 0; argv[i]; i++) {
+                       char *var = NULL;
+
+                       if (parse_config_arg(argv[i], &var) < 0)
+                               break;
+                       ret = show_spec_config(set, var);
+                       free(var);
+               }
        }
 
        perf_config_set__delete(set);
-- 
2.7.4

Reply via email to