summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt (Google) <rostedt@goodmis.org>2022-02-01 18:41:06 -0500
committerSteven Rostedt (Google) <rostedt@goodmis.org>2022-02-01 19:01:42 -0500
commit360f786918feace4484ed11e5d9311c6f1feb0d1 (patch)
tree24067e1c35b4a4eb9ba29fab26c11d7a60c6b078
parent2d0605085f43af718f554b9448dd023cc4e6334d (diff)
downloadktrace-360f786918feace4484ed11e5d9311c6f1feb0d1.tar.gz
ktrace: Add enable completion and command
Add the enable command that will enable tracing and an event. As well as completions for the commands. Note, so far only printing the "echo" commands are being done. In the future the commands will actually commit, but for now its still in development mode. Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
-rw-r--r--src/Makefile1
-rw-r--r--src/create.c12
-rw-r--r--src/enable.c115
-rw-r--r--src/ktrace.c3
-rw-r--r--src/ktrace.h11
5 files changed, 136 insertions, 6 deletions
diff --git a/src/Makefile b/src/Makefile
index 51c7de8..8d4a373 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -5,6 +5,7 @@ include $(src)/scripts/utils.mk
OBJS =
OBJS += ktrace.o
OBJS += create.o
+OBJS += enable.o
OBJS := $(OBJS:%.o=$(bdir)/%.o)
DEPS := $(OBJS:$(bdir)/%.o=$(bdir)/.%.d)
diff --git a/src/create.c b/src/create.c
index 6e6d9d2..3b5eaf7 100644
--- a/src/create.c
+++ b/src/create.c
@@ -732,8 +732,8 @@ static int kprobe_completion(struct ccli *ccli, void *data,
return 0;
}
-static int event_completion(struct ccli *ccli, struct tep_handle *tep,
- char ***list, char *match, char append)
+int event_completion(struct ccli *ccli, struct tep_handle *tep,
+ char ***list, char *match, char append)
{
char **systems;
char **events;
@@ -784,7 +784,7 @@ static int event_completion(struct ccli *ccli, struct tep_handle *tep,
return ret;
}
-static struct tep_event *find_event(struct tep_handle *tep, char *ename)
+struct tep_event *find_event(struct tep_handle *tep, char *ename)
{
struct tep_event *event;
char *system;
@@ -803,9 +803,9 @@ static struct tep_event *find_event(struct tep_handle *tep, char *ename)
return event;
}
-static int field_completion(struct ccli *ccli,
- struct tep_event *event, char ***list, char *prefix,
- int *cnt)
+int field_completion(struct ccli *ccli,
+ struct tep_event *event, char ***list, char *prefix,
+ int *cnt)
{
struct tep_format_field **common_fields;
struct tep_format_field **fields;
diff --git a/src/enable.c b/src/enable.c
new file mode 100644
index 0000000..3187135
--- /dev/null
+++ b/src/enable.c
@@ -0,0 +1,115 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2022 Google Inc, Steven Rostedt <rostedt@goodmis.org>
+ */
+#include "ktrace.h"
+
+static void enable_usage(struct ccli *ccli)
+{
+ ccli_printf(ccli, "usage: enable <type> <type-command>\n"
+ " <type> : tracing, event\n");
+}
+
+static int enable_tracing(struct ccli *ccli, void *data,
+ int argc, char **argv)
+{
+ ccli_printf(ccli, "# echo 1 > %s/tracing_on\n", tracefs_tracing_dir());
+ return 0;
+}
+
+static char *get_event(struct ccli *ccli, void *data, char *ename)
+{
+ struct tep_handle *tep = data;
+ struct tep_event *event;
+ char *sav;
+
+ sav = strdup(ename);
+ /* Failure above will just print "(nul)" below */
+
+ event = find_event(tep, ename);
+ if (!event) {
+ ccli_printf(ccli, "# Event '%s' not found\n", sav);
+ return 0;
+ }
+ free(sav);
+
+ return tracefs_event_get_file(NULL, event->system, event->name, "enable");
+}
+
+static int enable_event(struct ccli *ccli, void *data,
+ int argc, char **argv)
+{
+ char *file;
+
+ if (argc < 1) {
+ ccli_printf(ccli, "usage: enable event system/event\n");
+ return 0;
+ }
+
+ file = get_event(ccli, data, argv[0]);
+ if (file)
+ ccli_printf(ccli, "# echo 1 > %s\n", file);
+ tracefs_put_tracing_file(file);
+ return 0;
+}
+
+int cmd_enable(struct ccli *ccli, const char *command, const char *line,
+ void *data, int argc, char **argv)
+{
+ if (argc < 2) {
+ enable_usage(ccli);
+ return 0;
+ }
+
+ if (strcmp(argv[1], "tracing") == 0)
+ return enable_tracing(ccli, data, argc - 2, argv + 2);
+
+ if (strcmp(argv[1], "event") == 0)
+ return enable_event(ccli, data, argc - 2, argv + 2);
+
+ enable_usage(ccli);
+
+ return 0;
+}
+
+static int enable_event_completion(struct ccli *ccli, void *data,
+ int argc, char **argv,
+ char ***list, int word, char *match)
+{
+ struct tep_handle *tep = data;
+
+ if (word == 0)
+ return event_completion(ccli, tep, list, match, 0);
+
+ return 0;
+}
+
+int enable_completion(struct ccli *ccli, const char *command,
+ const char *line, int word,
+ char *match, char ***list, void *data)
+{
+ char *types[] = { "tracing", "event" };
+ char **argv;
+ int argc;
+ int cnt = 0;
+ int ret = 0;
+ int i;
+
+ if (word == 1) {
+ for (i = 0; ret >= 0 && i < ARRAY_SIZE(types); i++)
+ ret = ccli_list_add(ccli, list, &cnt, types[i]);
+ return ret;
+ }
+
+ argc = ccli_line_parse(line, &argv);
+ if (argc < 0)
+ return 0;
+
+ if (strcmp(argv[1], "event") == 0)
+ ret = enable_event_completion(ccli, data, argc - 2, argv + 2,
+ list, word - 2, match);
+
+ ccli_argv_free(argv);
+
+ return ret;
+}
diff --git a/src/ktrace.c b/src/ktrace.c
index 9603e04..62ae831 100644
--- a/src/ktrace.c
+++ b/src/ktrace.c
@@ -109,6 +109,9 @@ int main (int argc, char **argv)
ccli_register_command(ccli, "create", cmd_create, tep);
ccli_register_completion(ccli, "create", create_completion);
+ ccli_register_command(ccli, "enable", cmd_enable, tep);
+ ccli_register_completion(ccli, "enable", enable_completion);
+
ccli_loop(ccli);
save_history(ccli);
diff --git a/src/ktrace.h b/src/ktrace.h
index 1b8853c..ef2e490 100644
--- a/src/ktrace.h
+++ b/src/ktrace.h
@@ -18,4 +18,15 @@ int create_completion(struct ccli *ccli, const char *command,
int cmd_create(struct ccli *ccli, const char *command, const char *line,
void *data, int argc, char **argv);
+int enable_completion(struct ccli *ccli, const char *command,
+ const char *line, int word,
+ char *match, char ***list, void *data);
+int cmd_enable(struct ccli *ccli, const char *command, const char *line,
+ void *data, int argc, char **argv);
+
+struct tep_event *find_event(struct tep_handle *tep, char *ename);
+
+int event_completion(struct ccli *ccli, struct tep_handle *tep,
+ char ***list, char *match, char append);
+
#endif