1*58e6ee5fSAndroid Build Coastguard Worker // SPDX-License-Identifier: GPL-2.0
2*58e6ee5fSAndroid Build Coastguard Worker /*
3*58e6ee5fSAndroid Build Coastguard Worker * Copyright (C) 2008, 2009, 2010 Red Hat Inc, Steven Rostedt <[email protected]>
4*58e6ee5fSAndroid Build Coastguard Worker *
5*58e6ee5fSAndroid Build Coastguard Worker */
6*58e6ee5fSAndroid Build Coastguard Worker #include <stdio.h>
7*58e6ee5fSAndroid Build Coastguard Worker #include <string.h>
8*58e6ee5fSAndroid Build Coastguard Worker #include <getopt.h>
9*58e6ee5fSAndroid Build Coastguard Worker #include <unistd.h>
10*58e6ee5fSAndroid Build Coastguard Worker #include <dirent.h>
11*58e6ee5fSAndroid Build Coastguard Worker #include <errno.h>
12*58e6ee5fSAndroid Build Coastguard Worker #include <stdlib.h>
13*58e6ee5fSAndroid Build Coastguard Worker #include <sys/syscall.h>
14*58e6ee5fSAndroid Build Coastguard Worker
15*58e6ee5fSAndroid Build Coastguard Worker #include "trace-local.h"
16*58e6ee5fSAndroid Build Coastguard Worker
17*58e6ee5fSAndroid Build Coastguard Worker int silence_warnings;
18*58e6ee5fSAndroid Build Coastguard Worker int show_status;
19*58e6ee5fSAndroid Build Coastguard Worker
20*58e6ee5fSAndroid Build Coastguard Worker #ifndef gettid
21*58e6ee5fSAndroid Build Coastguard Worker #define gettid() syscall(__NR_gettid)
22*58e6ee5fSAndroid Build Coastguard Worker #endif
23*58e6ee5fSAndroid Build Coastguard Worker
warning(const char * fmt,...)24*58e6ee5fSAndroid Build Coastguard Worker void warning(const char *fmt, ...)
25*58e6ee5fSAndroid Build Coastguard Worker {
26*58e6ee5fSAndroid Build Coastguard Worker va_list ap;
27*58e6ee5fSAndroid Build Coastguard Worker
28*58e6ee5fSAndroid Build Coastguard Worker if (silence_warnings)
29*58e6ee5fSAndroid Build Coastguard Worker return;
30*58e6ee5fSAndroid Build Coastguard Worker
31*58e6ee5fSAndroid Build Coastguard Worker if (errno)
32*58e6ee5fSAndroid Build Coastguard Worker perror("trace-cmd");
33*58e6ee5fSAndroid Build Coastguard Worker errno = 0;
34*58e6ee5fSAndroid Build Coastguard Worker
35*58e6ee5fSAndroid Build Coastguard Worker va_start(ap, fmt);
36*58e6ee5fSAndroid Build Coastguard Worker fprintf(stderr, " ");
37*58e6ee5fSAndroid Build Coastguard Worker vfprintf(stderr, fmt, ap);
38*58e6ee5fSAndroid Build Coastguard Worker va_end(ap);
39*58e6ee5fSAndroid Build Coastguard Worker
40*58e6ee5fSAndroid Build Coastguard Worker fprintf(stderr, "\n");
41*58e6ee5fSAndroid Build Coastguard Worker }
42*58e6ee5fSAndroid Build Coastguard Worker
malloc_or_die(unsigned int size)43*58e6ee5fSAndroid Build Coastguard Worker void *malloc_or_die(unsigned int size)
44*58e6ee5fSAndroid Build Coastguard Worker {
45*58e6ee5fSAndroid Build Coastguard Worker void *data;
46*58e6ee5fSAndroid Build Coastguard Worker
47*58e6ee5fSAndroid Build Coastguard Worker data = malloc(size);
48*58e6ee5fSAndroid Build Coastguard Worker if (!data)
49*58e6ee5fSAndroid Build Coastguard Worker die("malloc");
50*58e6ee5fSAndroid Build Coastguard Worker return data;
51*58e6ee5fSAndroid Build Coastguard Worker }
52*58e6ee5fSAndroid Build Coastguard Worker
tracecmd_debug(const char * fmt,...)53*58e6ee5fSAndroid Build Coastguard Worker void tracecmd_debug(const char *fmt, ...)
54*58e6ee5fSAndroid Build Coastguard Worker {
55*58e6ee5fSAndroid Build Coastguard Worker va_list ap;
56*58e6ee5fSAndroid Build Coastguard Worker
57*58e6ee5fSAndroid Build Coastguard Worker if (!tracecmd_get_debug())
58*58e6ee5fSAndroid Build Coastguard Worker return;
59*58e6ee5fSAndroid Build Coastguard Worker
60*58e6ee5fSAndroid Build Coastguard Worker va_start(ap, fmt);
61*58e6ee5fSAndroid Build Coastguard Worker printf("[%d] ", (int)gettid());
62*58e6ee5fSAndroid Build Coastguard Worker vprintf(fmt, ap);
63*58e6ee5fSAndroid Build Coastguard Worker va_end(ap);
64*58e6ee5fSAndroid Build Coastguard Worker }
65*58e6ee5fSAndroid Build Coastguard Worker
66*58e6ee5fSAndroid Build Coastguard Worker static struct trace_log_severity {
67*58e6ee5fSAndroid Build Coastguard Worker int id;
68*58e6ee5fSAndroid Build Coastguard Worker const char *name;
69*58e6ee5fSAndroid Build Coastguard Worker } log_severity[] = {
70*58e6ee5fSAndroid Build Coastguard Worker { .id = TEP_LOG_NONE, .name = "none" },
71*58e6ee5fSAndroid Build Coastguard Worker { .id = TEP_LOG_CRITICAL, .name = "crit" },
72*58e6ee5fSAndroid Build Coastguard Worker { .id = TEP_LOG_ERROR, .name = "err" },
73*58e6ee5fSAndroid Build Coastguard Worker { .id = TEP_LOG_WARNING, .name = "warn" },
74*58e6ee5fSAndroid Build Coastguard Worker { .id = TEP_LOG_INFO, .name = "info" },
75*58e6ee5fSAndroid Build Coastguard Worker { .id = TEP_LOG_DEBUG, .name = "debug" },
76*58e6ee5fSAndroid Build Coastguard Worker { .id = TEP_LOG_ALL, .name = "all" },
77*58e6ee5fSAndroid Build Coastguard Worker };
78*58e6ee5fSAndroid Build Coastguard Worker
trace_set_verbose(char * level)79*58e6ee5fSAndroid Build Coastguard Worker int trace_set_verbose(char *level)
80*58e6ee5fSAndroid Build Coastguard Worker {
81*58e6ee5fSAndroid Build Coastguard Worker int id;
82*58e6ee5fSAndroid Build Coastguard Worker
83*58e6ee5fSAndroid Build Coastguard Worker /* Default level is info */
84*58e6ee5fSAndroid Build Coastguard Worker if (!level)
85*58e6ee5fSAndroid Build Coastguard Worker level = "info";
86*58e6ee5fSAndroid Build Coastguard Worker
87*58e6ee5fSAndroid Build Coastguard Worker if (isdigit(level[0])) {
88*58e6ee5fSAndroid Build Coastguard Worker id = atoi(level);
89*58e6ee5fSAndroid Build Coastguard Worker if (id >= TEP_LOG_NONE) {
90*58e6ee5fSAndroid Build Coastguard Worker if (id > TEP_LOG_ALL)
91*58e6ee5fSAndroid Build Coastguard Worker id = TEP_LOG_ALL;
92*58e6ee5fSAndroid Build Coastguard Worker tracecmd_set_loglevel(id);
93*58e6ee5fSAndroid Build Coastguard Worker return 0;
94*58e6ee5fSAndroid Build Coastguard Worker }
95*58e6ee5fSAndroid Build Coastguard Worker } else {
96*58e6ee5fSAndroid Build Coastguard Worker int size = ARRAY_SIZE(log_severity);
97*58e6ee5fSAndroid Build Coastguard Worker int i;
98*58e6ee5fSAndroid Build Coastguard Worker
99*58e6ee5fSAndroid Build Coastguard Worker for (i = 0; i < size; i++) {
100*58e6ee5fSAndroid Build Coastguard Worker if (!strncmp(level, log_severity[i].name, strlen(log_severity[i].name))) {
101*58e6ee5fSAndroid Build Coastguard Worker tracecmd_set_loglevel(log_severity[i].id);
102*58e6ee5fSAndroid Build Coastguard Worker return 0;
103*58e6ee5fSAndroid Build Coastguard Worker }
104*58e6ee5fSAndroid Build Coastguard Worker }
105*58e6ee5fSAndroid Build Coastguard Worker }
106*58e6ee5fSAndroid Build Coastguard Worker
107*58e6ee5fSAndroid Build Coastguard Worker return -1;
108*58e6ee5fSAndroid Build Coastguard Worker }
109*58e6ee5fSAndroid Build Coastguard Worker
110*58e6ee5fSAndroid Build Coastguard Worker /**
111*58e6ee5fSAndroid Build Coastguard Worker * struct command
112*58e6ee5fSAndroid Build Coastguard Worker * @name command name
113*58e6ee5fSAndroid Build Coastguard Worker * @run function to execute on command `name`
114*58e6ee5fSAndroid Build Coastguard Worker */
115*58e6ee5fSAndroid Build Coastguard Worker struct command {
116*58e6ee5fSAndroid Build Coastguard Worker char *name;
117*58e6ee5fSAndroid Build Coastguard Worker void (*run)(int argc, char **argv);
118*58e6ee5fSAndroid Build Coastguard Worker };
119*58e6ee5fSAndroid Build Coastguard Worker
120*58e6ee5fSAndroid Build Coastguard Worker
121*58e6ee5fSAndroid Build Coastguard Worker /**
122*58e6ee5fSAndroid Build Coastguard Worker * Lookup table that maps command names to functions
123*58e6ee5fSAndroid Build Coastguard Worker */
124*58e6ee5fSAndroid Build Coastguard Worker struct command commands[] = {
125*58e6ee5fSAndroid Build Coastguard Worker {"report", trace_report},
126*58e6ee5fSAndroid Build Coastguard Worker {"snapshot", trace_snapshot},
127*58e6ee5fSAndroid Build Coastguard Worker {"hist", trace_hist},
128*58e6ee5fSAndroid Build Coastguard Worker {"mem", trace_mem},
129*58e6ee5fSAndroid Build Coastguard Worker {"listen", trace_listen},
130*58e6ee5fSAndroid Build Coastguard Worker {"agent", trace_agent},
131*58e6ee5fSAndroid Build Coastguard Worker {"setup-guest", trace_setup_guest},
132*58e6ee5fSAndroid Build Coastguard Worker {"split", trace_split},
133*58e6ee5fSAndroid Build Coastguard Worker {"restore", trace_restore},
134*58e6ee5fSAndroid Build Coastguard Worker {"stack", trace_stack},
135*58e6ee5fSAndroid Build Coastguard Worker {"check-events", trace_check_events},
136*58e6ee5fSAndroid Build Coastguard Worker {"record", trace_record},
137*58e6ee5fSAndroid Build Coastguard Worker {"start", trace_start},
138*58e6ee5fSAndroid Build Coastguard Worker {"set", trace_set},
139*58e6ee5fSAndroid Build Coastguard Worker {"extract", trace_extract},
140*58e6ee5fSAndroid Build Coastguard Worker {"stop", trace_stop},
141*58e6ee5fSAndroid Build Coastguard Worker {"stream", trace_stream},
142*58e6ee5fSAndroid Build Coastguard Worker {"profile", trace_profile},
143*58e6ee5fSAndroid Build Coastguard Worker {"restart", trace_restart},
144*58e6ee5fSAndroid Build Coastguard Worker {"clear", trace_clear},
145*58e6ee5fSAndroid Build Coastguard Worker {"reset", trace_reset},
146*58e6ee5fSAndroid Build Coastguard Worker {"stat", trace_stat},
147*58e6ee5fSAndroid Build Coastguard Worker {"options", trace_option},
148*58e6ee5fSAndroid Build Coastguard Worker {"show", trace_show},
149*58e6ee5fSAndroid Build Coastguard Worker {"list", trace_list},
150*58e6ee5fSAndroid Build Coastguard Worker {"help", trace_usage},
151*58e6ee5fSAndroid Build Coastguard Worker {"dump", trace_dump},
152*58e6ee5fSAndroid Build Coastguard Worker {"convert", trace_convert},
153*58e6ee5fSAndroid Build Coastguard Worker {"-h", trace_usage},
154*58e6ee5fSAndroid Build Coastguard Worker };
155*58e6ee5fSAndroid Build Coastguard Worker
main(int argc,char ** argv)156*58e6ee5fSAndroid Build Coastguard Worker int main (int argc, char **argv)
157*58e6ee5fSAndroid Build Coastguard Worker {
158*58e6ee5fSAndroid Build Coastguard Worker int i;
159*58e6ee5fSAndroid Build Coastguard Worker
160*58e6ee5fSAndroid Build Coastguard Worker errno = 0;
161*58e6ee5fSAndroid Build Coastguard Worker
162*58e6ee5fSAndroid Build Coastguard Worker if (argc < 2)
163*58e6ee5fSAndroid Build Coastguard Worker trace_usage(argc, argv);
164*58e6ee5fSAndroid Build Coastguard Worker
165*58e6ee5fSAndroid Build Coastguard Worker for (i = 0; i < ARRAY_SIZE(commands); ++i) {
166*58e6ee5fSAndroid Build Coastguard Worker if (strcmp(argv[1], commands[i].name) == 0 ){
167*58e6ee5fSAndroid Build Coastguard Worker commands[i].run(argc, argv);
168*58e6ee5fSAndroid Build Coastguard Worker goto out;
169*58e6ee5fSAndroid Build Coastguard Worker }
170*58e6ee5fSAndroid Build Coastguard Worker }
171*58e6ee5fSAndroid Build Coastguard Worker
172*58e6ee5fSAndroid Build Coastguard Worker /* No valid command found, show help */
173*58e6ee5fSAndroid Build Coastguard Worker trace_usage(argc, argv);
174*58e6ee5fSAndroid Build Coastguard Worker out:
175*58e6ee5fSAndroid Build Coastguard Worker exit(0);
176*58e6ee5fSAndroid Build Coastguard Worker }
177