| // 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 "trace-local.h" | |
| int silence_warnings; | |
| int show_status; | |
| int debug; | |
| int quiet; | |
| 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 pr_stat(const char *fmt, ...) | |
| { | |
| va_list ap; | |
| if (!show_status) | |
| return; | |
| va_start(ap, fmt); | |
| vprintf(fmt, ap); | |
| va_end(ap); | |
| printf("\n"); | |
| } | |
| void *malloc_or_die(unsigned int size) | |
| { | |
| void *data; | |
| data = malloc(size); | |
| if (!data) | |
| die("malloc"); | |
| return data; | |
| } | |
| /** | |
| * 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}, | |
| {"split", trace_split}, | |
| {"restore", trace_restore}, | |
| {"stack", trace_stack}, | |
| {"check-events", trace_check_events}, | |
| {"record", trace_record}, | |
| {"start", trace_start}, | |
| {"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}, | |
| {"-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); | |
| } |