aboutsummaryrefslogtreecommitdiff
path: root/tracecmd/trace-cmd.c
diff options
context:
space:
mode:
Diffstat (limited to 'tracecmd/trace-cmd.c')
-rw-r--r--tracecmd/trace-cmd.c176
1 files changed, 176 insertions, 0 deletions
diff --git a/tracecmd/trace-cmd.c b/tracecmd/trace-cmd.c
new file mode 100644
index 00000000..69800d26
--- /dev/null
+++ b/tracecmd/trace-cmd.c
@@ -0,0 +1,176 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2008, 2009, 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
+ *
+ */
+#include <stdio.h>
+#include <string.h>
+#include <getopt.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <sys/syscall.h>
+
+#include "trace-local.h"
+
+int silence_warnings;
+int show_status;
+
+#ifndef gettid
+#define gettid() syscall(__NR_gettid)
+#endif
+
+void warning(const char *fmt, ...)
+{
+ va_list ap;
+
+ if (silence_warnings)
+ return;
+
+ if (errno)
+ perror("trace-cmd");
+ errno = 0;
+
+ va_start(ap, fmt);
+ fprintf(stderr, " ");
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+
+ fprintf(stderr, "\n");
+}
+
+void *malloc_or_die(unsigned int size)
+{
+ void *data;
+
+ data = malloc(size);
+ if (!data)
+ die("malloc");
+ return data;
+}
+
+void tracecmd_debug(const char *fmt, ...)
+{
+ va_list ap;
+
+ if (!tracecmd_get_debug())
+ return;
+
+ va_start(ap, fmt);
+ printf("[%d] ", (int)gettid());
+ vprintf(fmt, ap);
+ va_end(ap);
+}
+
+static struct trace_log_severity {
+ int id;
+ const char *name;
+} log_severity[] = {
+ { .id = TEP_LOG_NONE, .name = "none" },
+ { .id = TEP_LOG_CRITICAL, .name = "crit" },
+ { .id = TEP_LOG_ERROR, .name = "err" },
+ { .id = TEP_LOG_WARNING, .name = "warn" },
+ { .id = TEP_LOG_INFO, .name = "info" },
+ { .id = TEP_LOG_DEBUG, .name = "debug" },
+ { .id = TEP_LOG_ALL, .name = "all" },
+};
+
+int trace_set_verbose(char *level)
+{
+ int id;
+
+ /* Default level is info */
+ if (!level)
+ level = "info";
+
+ if (isdigit(level[0])) {
+ id = atoi(level);
+ if (id >= TEP_LOG_NONE) {
+ if (id > TEP_LOG_ALL)
+ id = TEP_LOG_ALL;
+ tracecmd_set_loglevel(id);
+ return 0;
+ }
+ } else {
+ int size = ARRAY_SIZE(log_severity);
+ int i;
+
+ for (i = 0; i < size; i++) {
+ if (!strncmp(level, log_severity[i].name, strlen(log_severity[i].name))) {
+ tracecmd_set_loglevel(log_severity[i].id);
+ return 0;
+ }
+ }
+ }
+
+ return -1;
+}
+
+/**
+ * struct command
+ * @name command name
+ * @run function to execute on command `name`
+ */
+struct command {
+ char *name;
+ void (*run)(int argc, char **argv);
+};
+
+
+/**
+ * Lookup table that maps command names to functions
+ */
+struct command commands[] = {
+ {"report", trace_report},
+ {"snapshot", trace_snapshot},
+ {"hist", trace_hist},
+ {"mem", trace_mem},
+ {"listen", trace_listen},
+ {"agent", trace_agent},
+ {"setup-guest", trace_setup_guest},
+ {"split", trace_split},
+ {"restore", trace_restore},
+ {"stack", trace_stack},
+ {"check-events", trace_check_events},
+ {"record", trace_record},
+ {"start", trace_start},
+ {"set", trace_set},
+ {"extract", trace_extract},
+ {"stop", trace_stop},
+ {"stream", trace_stream},
+ {"profile", trace_profile},
+ {"restart", trace_restart},
+ {"clear", trace_clear},
+ {"reset", trace_reset},
+ {"stat", trace_stat},
+ {"options", trace_option},
+ {"show", trace_show},
+ {"list", trace_list},
+ {"help", trace_usage},
+ {"dump", trace_dump},
+ {"convert", trace_convert},
+ {"-h", trace_usage},
+};
+
+int main (int argc, char **argv)
+{
+ int i;
+
+ errno = 0;
+
+ if (argc < 2)
+ trace_usage(argc, argv);
+
+ for (i = 0; i < ARRAY_SIZE(commands); ++i) {
+ if (strcmp(argv[1], commands[i].name) == 0 ){
+ commands[i].run(argc, argv);
+ goto out;
+ }
+ }
+
+ /* No valid command found, show help */
+ trace_usage(argc, argv);
+out:
+ exit(0);
+}