diff options
author | Steven Rostedt (Google) <rostedt@goodmis.org> | 2022-02-05 17:09:45 -0500 |
---|---|---|
committer | Steven Rostedt (Google) <rostedt@goodmis.org> | 2022-02-05 17:09:45 -0500 |
commit | 92f2f92530a23ad7af0e14c65e077aeabfae8a9f (patch) | |
tree | 270cda14e271d7c3b728e97da4553ae8416efe6d | |
parent | 848166f4454cbf72752e1e3dc588bc4c34988352 (diff) | |
download | ktrace-92f2f92530a23ad7af0e14c65e077aeabfae8a9f.tar.gz |
ktrace: Add help infrastructure
Add a help function that will be used to describe the commands in more
detail. Currently a very limited help is added, but it will be extended.
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
-rw-r--r-- | include/ktrace.h | 12 | ||||
-rw-r--r-- | src/Makefile | 1 | ||||
-rw-r--r-- | src/help.c | 78 | ||||
-rw-r--r-- | src/ktrace.c | 3 |
4 files changed, 94 insertions, 0 deletions
diff --git a/include/ktrace.h b/include/ktrace.h index 11e1b83..cb0d537 100644 --- a/include/ktrace.h +++ b/include/ktrace.h @@ -12,6 +12,18 @@ #define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0])) +struct ktrace_commands { + const char *command; + const char *usage; + const char *help; +}; + +int help_completion(struct ccli *ccli, const char *command, + const char *line, int word, + char *match, char ***list, void *data); +int cmd_help(struct ccli *ccli, const char *command, const char *line, + void *data, int argc, char **argv); + int create_completion(struct ccli *ccli, const char *command, const char *line, int word, char *match, char ***list, void *data); diff --git a/src/Makefile b/src/Makefile index 8d4a373..8f282a0 100644 --- a/src/Makefile +++ b/src/Makefile @@ -4,6 +4,7 @@ include $(src)/scripts/utils.mk OBJS = OBJS += ktrace.o +OBJS += help.o OBJS += create.o OBJS += enable.o diff --git a/src/help.c b/src/help.c new file mode 100644 index 0000000..05ce439 --- /dev/null +++ b/src/help.c @@ -0,0 +1,78 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2022 Google Inc, Steven Rostedt <rostedt@goodmis.org> + */ +#include "ktrace.h" + +static struct ktrace_commands ktrace_cmds[] = +{ + { + "create", + "create (kprobe|eprobe|synthetic) options", + " kprobe - to create a kernel probe event.\n" + " eprobe - to create an event on top of another event.\n" + " synthetic - to create a synthetic event", + }, + { + "enable", + "enable (tracing|event)", + " tracing - to enable tracing if it is stopped.\n" + " event - to enable an event" + }, + { + "disable", + "disable (tracing|event)", + " tracing - to disable tracing, just stops writing to the ring buffer.\n" + " event - stop an event." + } +}; + +int cmd_help(struct ccli *ccli, const char *command, const char *line, + void *data, int argc, char **argv) +{ + int l = 1; + int i; + + if (argc < 2) { + for (i = 0; l > 0 && i < ARRAY_SIZE(ktrace_cmds); i++) { + if (i) + l = ccli_page(ccli, l, "\n"); + l = ccli_page(ccli, l, "command: %s\n", + ktrace_cmds[i].command); + l = ccli_page(ccli, l, "usage: %s\n", + ktrace_cmds[i].usage); + l = ccli_page(ccli, l, "%s\n", + ktrace_cmds[i].help); + } + return 0; + } + + for (i = 0; l > 0 && i < ARRAY_SIZE(ktrace_cmds); i++) { + if (strcmp(argv[1], ktrace_cmds[i].command) == 0) { + l = ccli_page(ccli, l, "usage: %s\n", + ktrace_cmds[i].usage); + l = ccli_page(ccli, l, "%s\n", + ktrace_cmds[i].help); + return 0; + } + } + return 0; +} + +int help_completion(struct ccli *ccli, const char *command, + const char *line, int word, + char *match, char ***list, void *data) +{ + int cnt = 0; + int ret = 0; + int i; + + if (word == 1) { + for (i = 0; ret >= 0 && i < ARRAY_SIZE(ktrace_cmds); i++) + ret = ccli_list_add(ccli, list, &cnt, + ktrace_cmds[i].command); + return ret; + } + return 0; +} + diff --git a/src/ktrace.c b/src/ktrace.c index 3be95bb..7874ff0 100644 --- a/src/ktrace.c +++ b/src/ktrace.c @@ -106,6 +106,9 @@ int main (int argc, char **argv) load_history(ccli); + ccli_register_command(ccli, "help", cmd_help, NULL); + ccli_register_completion(ccli, "help", help_completion); + ccli_register_command(ccli, "create", cmd_create, tep); ccli_register_completion(ccli, "create", create_completion); |