summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt (Google) <rostedt@goodmis.org>2022-02-05 17:09:45 -0500
committerSteven Rostedt (Google) <rostedt@goodmis.org>2022-02-05 17:09:45 -0500
commit92f2f92530a23ad7af0e14c65e077aeabfae8a9f (patch)
tree270cda14e271d7c3b728e97da4553ae8416efe6d
parent848166f4454cbf72752e1e3dc588bc4c34988352 (diff)
downloadktrace-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.h12
-rw-r--r--src/Makefile1
-rw-r--r--src/help.c78
-rw-r--r--src/ktrace.c3
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);