1*58e6ee5fSAndroid Build Coastguard Worker // SPDX-License-Identifier: GPL-2.0
2*58e6ee5fSAndroid Build Coastguard Worker /*
3*58e6ee5fSAndroid Build Coastguard Worker * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <[email protected]>
4*58e6ee5fSAndroid Build Coastguard Worker *
5*58e6ee5fSAndroid Build Coastguard Worker */
6*58e6ee5fSAndroid Build Coastguard Worker
7*58e6ee5fSAndroid Build Coastguard Worker #include <stdlib.h>
8*58e6ee5fSAndroid Build Coastguard Worker #include <sys/stat.h>
9*58e6ee5fSAndroid Build Coastguard Worker
10*58e6ee5fSAndroid Build Coastguard Worker #include "tracefs.h"
11*58e6ee5fSAndroid Build Coastguard Worker #include "trace-local.h"
12*58e6ee5fSAndroid Build Coastguard Worker
13*58e6ee5fSAndroid Build Coastguard Worker
dump_file_content(const char * path)14*58e6ee5fSAndroid Build Coastguard Worker static void dump_file_content(const char *path)
15*58e6ee5fSAndroid Build Coastguard Worker {
16*58e6ee5fSAndroid Build Coastguard Worker char buf[BUFSIZ];
17*58e6ee5fSAndroid Build Coastguard Worker ssize_t n;
18*58e6ee5fSAndroid Build Coastguard Worker FILE *fp;
19*58e6ee5fSAndroid Build Coastguard Worker
20*58e6ee5fSAndroid Build Coastguard Worker fp = fopen(path, "r");
21*58e6ee5fSAndroid Build Coastguard Worker if (!fp)
22*58e6ee5fSAndroid Build Coastguard Worker die("reading %s", path);
23*58e6ee5fSAndroid Build Coastguard Worker
24*58e6ee5fSAndroid Build Coastguard Worker do {
25*58e6ee5fSAndroid Build Coastguard Worker n = fread(buf, 1, BUFSIZ, fp);
26*58e6ee5fSAndroid Build Coastguard Worker if (n > 0)
27*58e6ee5fSAndroid Build Coastguard Worker fwrite(buf, 1, n, stdout);
28*58e6ee5fSAndroid Build Coastguard Worker } while (n > 0);
29*58e6ee5fSAndroid Build Coastguard Worker fclose(fp);
30*58e6ee5fSAndroid Build Coastguard Worker }
31*58e6ee5fSAndroid Build Coastguard Worker
32*58e6ee5fSAndroid Build Coastguard Worker
33*58e6ee5fSAndroid Build Coastguard Worker
show_instance_file(struct buffer_instance * instance,const char * name)34*58e6ee5fSAndroid Build Coastguard Worker void show_instance_file(struct buffer_instance *instance, const char *name)
35*58e6ee5fSAndroid Build Coastguard Worker {
36*58e6ee5fSAndroid Build Coastguard Worker char *path;
37*58e6ee5fSAndroid Build Coastguard Worker
38*58e6ee5fSAndroid Build Coastguard Worker path = tracefs_instance_get_file(instance->tracefs, name);
39*58e6ee5fSAndroid Build Coastguard Worker dump_file_content(path);
40*58e6ee5fSAndroid Build Coastguard Worker tracefs_put_tracing_file(path);
41*58e6ee5fSAndroid Build Coastguard Worker }
42*58e6ee5fSAndroid Build Coastguard Worker
43*58e6ee5fSAndroid Build Coastguard Worker enum {
44*58e6ee5fSAndroid Build Coastguard Worker SHOW_EVENT_FORMAT = 1 << 0,
45*58e6ee5fSAndroid Build Coastguard Worker SHOW_EVENT_FILTER = 1 << 1,
46*58e6ee5fSAndroid Build Coastguard Worker SHOW_EVENT_TRIGGER = 1 << 2,
47*58e6ee5fSAndroid Build Coastguard Worker SHOW_EVENT_FULL = 1 << 3,
48*58e6ee5fSAndroid Build Coastguard Worker };
49*58e6ee5fSAndroid Build Coastguard Worker
50*58e6ee5fSAndroid Build Coastguard Worker
show_file(const char * name)51*58e6ee5fSAndroid Build Coastguard Worker void show_file(const char *name)
52*58e6ee5fSAndroid Build Coastguard Worker {
53*58e6ee5fSAndroid Build Coastguard Worker char *path;
54*58e6ee5fSAndroid Build Coastguard Worker
55*58e6ee5fSAndroid Build Coastguard Worker path = tracefs_get_tracing_file(name);
56*58e6ee5fSAndroid Build Coastguard Worker dump_file_content(path);
57*58e6ee5fSAndroid Build Coastguard Worker tracefs_put_tracing_file(path);
58*58e6ee5fSAndroid Build Coastguard Worker }
59*58e6ee5fSAndroid Build Coastguard Worker
60*58e6ee5fSAndroid Build Coastguard Worker typedef int (*process_file_func)(char *buf, int len, int flags);
61*58e6ee5fSAndroid Build Coastguard Worker
process_file_re(process_file_func func,const char * name,const char * re,int flags)62*58e6ee5fSAndroid Build Coastguard Worker static void process_file_re(process_file_func func,
63*58e6ee5fSAndroid Build Coastguard Worker const char *name, const char *re, int flags)
64*58e6ee5fSAndroid Build Coastguard Worker {
65*58e6ee5fSAndroid Build Coastguard Worker regex_t reg;
66*58e6ee5fSAndroid Build Coastguard Worker char *path;
67*58e6ee5fSAndroid Build Coastguard Worker char *buf = NULL;
68*58e6ee5fSAndroid Build Coastguard Worker char *str;
69*58e6ee5fSAndroid Build Coastguard Worker FILE *fp;
70*58e6ee5fSAndroid Build Coastguard Worker ssize_t n;
71*58e6ee5fSAndroid Build Coastguard Worker size_t l = strlen(re);
72*58e6ee5fSAndroid Build Coastguard Worker
73*58e6ee5fSAndroid Build Coastguard Worker /* Just in case :-p */
74*58e6ee5fSAndroid Build Coastguard Worker if (!re || l == 0) {
75*58e6ee5fSAndroid Build Coastguard Worker show_file(name);
76*58e6ee5fSAndroid Build Coastguard Worker return;
77*58e6ee5fSAndroid Build Coastguard Worker }
78*58e6ee5fSAndroid Build Coastguard Worker
79*58e6ee5fSAndroid Build Coastguard Worker /* Handle the newline at end of names for the user */
80*58e6ee5fSAndroid Build Coastguard Worker str = malloc(l + 3);
81*58e6ee5fSAndroid Build Coastguard Worker if (!str)
82*58e6ee5fSAndroid Build Coastguard Worker die("Failed to allocate reg ex %s", re);
83*58e6ee5fSAndroid Build Coastguard Worker strcpy(str, re);
84*58e6ee5fSAndroid Build Coastguard Worker if (re[l-1] == '$')
85*58e6ee5fSAndroid Build Coastguard Worker strcpy(&str[l-1], "\n*$");
86*58e6ee5fSAndroid Build Coastguard Worker
87*58e6ee5fSAndroid Build Coastguard Worker if (regcomp(®, str, REG_ICASE|REG_NOSUB))
88*58e6ee5fSAndroid Build Coastguard Worker die("invalid function regex '%s'", re);
89*58e6ee5fSAndroid Build Coastguard Worker
90*58e6ee5fSAndroid Build Coastguard Worker free(str);
91*58e6ee5fSAndroid Build Coastguard Worker
92*58e6ee5fSAndroid Build Coastguard Worker path = tracefs_get_tracing_file(name);
93*58e6ee5fSAndroid Build Coastguard Worker fp = fopen(path, "r");
94*58e6ee5fSAndroid Build Coastguard Worker if (!fp)
95*58e6ee5fSAndroid Build Coastguard Worker die("reading %s", path);
96*58e6ee5fSAndroid Build Coastguard Worker tracefs_put_tracing_file(path);
97*58e6ee5fSAndroid Build Coastguard Worker
98*58e6ee5fSAndroid Build Coastguard Worker do {
99*58e6ee5fSAndroid Build Coastguard Worker n = getline(&buf, &l, fp);
100*58e6ee5fSAndroid Build Coastguard Worker if (n > 0 && regexec(®, buf, 0, NULL, 0) == 0)
101*58e6ee5fSAndroid Build Coastguard Worker func(buf, n, flags);
102*58e6ee5fSAndroid Build Coastguard Worker } while (n > 0);
103*58e6ee5fSAndroid Build Coastguard Worker free(buf);
104*58e6ee5fSAndroid Build Coastguard Worker fclose(fp);
105*58e6ee5fSAndroid Build Coastguard Worker
106*58e6ee5fSAndroid Build Coastguard Worker regfree(®);
107*58e6ee5fSAndroid Build Coastguard Worker }
108*58e6ee5fSAndroid Build Coastguard Worker
show_event(process_file_func func,const char * system,const char * event,int flags)109*58e6ee5fSAndroid Build Coastguard Worker static void show_event(process_file_func func, const char *system,
110*58e6ee5fSAndroid Build Coastguard Worker const char *event, int flags)
111*58e6ee5fSAndroid Build Coastguard Worker {
112*58e6ee5fSAndroid Build Coastguard Worker char *buf;
113*58e6ee5fSAndroid Build Coastguard Worker int ret;
114*58e6ee5fSAndroid Build Coastguard Worker
115*58e6ee5fSAndroid Build Coastguard Worker ret = asprintf(&buf, "%s:%s", system, event);
116*58e6ee5fSAndroid Build Coastguard Worker if (ret < 0)
117*58e6ee5fSAndroid Build Coastguard Worker die("Can not allocate event");
118*58e6ee5fSAndroid Build Coastguard Worker func(buf, strlen(buf), flags);
119*58e6ee5fSAndroid Build Coastguard Worker free(buf);
120*58e6ee5fSAndroid Build Coastguard Worker }
121*58e6ee5fSAndroid Build Coastguard Worker
show_system(process_file_func func,const char * system,int flags)122*58e6ee5fSAndroid Build Coastguard Worker static void show_system(process_file_func func, const char *system, int flags)
123*58e6ee5fSAndroid Build Coastguard Worker {
124*58e6ee5fSAndroid Build Coastguard Worker char **events;
125*58e6ee5fSAndroid Build Coastguard Worker int e;
126*58e6ee5fSAndroid Build Coastguard Worker
127*58e6ee5fSAndroid Build Coastguard Worker events = tracefs_system_events(NULL, system);
128*58e6ee5fSAndroid Build Coastguard Worker if (!events) /* die? */
129*58e6ee5fSAndroid Build Coastguard Worker return;
130*58e6ee5fSAndroid Build Coastguard Worker
131*58e6ee5fSAndroid Build Coastguard Worker for (e = 0; events[e]; e++)
132*58e6ee5fSAndroid Build Coastguard Worker show_event(func, system, events[e], flags);
133*58e6ee5fSAndroid Build Coastguard Worker }
134*58e6ee5fSAndroid Build Coastguard Worker
show_event_systems(process_file_func func,char ** systems,int flags)135*58e6ee5fSAndroid Build Coastguard Worker static void show_event_systems(process_file_func func, char **systems, int flags)
136*58e6ee5fSAndroid Build Coastguard Worker {
137*58e6ee5fSAndroid Build Coastguard Worker int s;
138*58e6ee5fSAndroid Build Coastguard Worker
139*58e6ee5fSAndroid Build Coastguard Worker for (s = 0; systems[s]; s++)
140*58e6ee5fSAndroid Build Coastguard Worker show_system(func, systems[s], flags);
141*58e6ee5fSAndroid Build Coastguard Worker }
142*58e6ee5fSAndroid Build Coastguard Worker
match_system_events(process_file_func func,const char * system,regex_t * reg,int flags)143*58e6ee5fSAndroid Build Coastguard Worker static void match_system_events(process_file_func func, const char *system,
144*58e6ee5fSAndroid Build Coastguard Worker regex_t *reg, int flags)
145*58e6ee5fSAndroid Build Coastguard Worker {
146*58e6ee5fSAndroid Build Coastguard Worker char **events;
147*58e6ee5fSAndroid Build Coastguard Worker int e;
148*58e6ee5fSAndroid Build Coastguard Worker
149*58e6ee5fSAndroid Build Coastguard Worker events = tracefs_system_events(NULL, system);
150*58e6ee5fSAndroid Build Coastguard Worker if (!events) /* die? */
151*58e6ee5fSAndroid Build Coastguard Worker return;
152*58e6ee5fSAndroid Build Coastguard Worker for (e = 0; events[e]; e++) {
153*58e6ee5fSAndroid Build Coastguard Worker if (regexec(reg, events[e], 0, NULL, 0) == 0)
154*58e6ee5fSAndroid Build Coastguard Worker show_event(func, system, events[e], flags);
155*58e6ee5fSAndroid Build Coastguard Worker }
156*58e6ee5fSAndroid Build Coastguard Worker tracefs_list_free(events);
157*58e6ee5fSAndroid Build Coastguard Worker }
158*58e6ee5fSAndroid Build Coastguard Worker
process_events(process_file_func func,const char * re,int flags)159*58e6ee5fSAndroid Build Coastguard Worker static void process_events(process_file_func func, const char *re, int flags)
160*58e6ee5fSAndroid Build Coastguard Worker {
161*58e6ee5fSAndroid Build Coastguard Worker const char *ftrace = "ftrace";
162*58e6ee5fSAndroid Build Coastguard Worker regex_t system_reg;
163*58e6ee5fSAndroid Build Coastguard Worker regex_t event_reg;
164*58e6ee5fSAndroid Build Coastguard Worker char *str;
165*58e6ee5fSAndroid Build Coastguard Worker size_t l = strlen(re);
166*58e6ee5fSAndroid Build Coastguard Worker bool just_systems = true;
167*58e6ee5fSAndroid Build Coastguard Worker char **systems;
168*58e6ee5fSAndroid Build Coastguard Worker char *system;
169*58e6ee5fSAndroid Build Coastguard Worker char *event;
170*58e6ee5fSAndroid Build Coastguard Worker int s;
171*58e6ee5fSAndroid Build Coastguard Worker
172*58e6ee5fSAndroid Build Coastguard Worker systems = tracefs_event_systems(NULL);
173*58e6ee5fSAndroid Build Coastguard Worker if (!systems)
174*58e6ee5fSAndroid Build Coastguard Worker return process_file_re(func, "available_events", re, flags);
175*58e6ee5fSAndroid Build Coastguard Worker
176*58e6ee5fSAndroid Build Coastguard Worker if (!re || l == 0) {
177*58e6ee5fSAndroid Build Coastguard Worker show_event_systems(func, systems, flags);
178*58e6ee5fSAndroid Build Coastguard Worker return;
179*58e6ee5fSAndroid Build Coastguard Worker }
180*58e6ee5fSAndroid Build Coastguard Worker
181*58e6ee5fSAndroid Build Coastguard Worker str = strdup(re);
182*58e6ee5fSAndroid Build Coastguard Worker if (!str)
183*58e6ee5fSAndroid Build Coastguard Worker die("Can not allocate momory for regex");
184*58e6ee5fSAndroid Build Coastguard Worker
185*58e6ee5fSAndroid Build Coastguard Worker system = strtok(str, ":");
186*58e6ee5fSAndroid Build Coastguard Worker event = strtok(NULL, "");
187*58e6ee5fSAndroid Build Coastguard Worker
188*58e6ee5fSAndroid Build Coastguard Worker if (regcomp(&system_reg, system, REG_ICASE|REG_NOSUB))
189*58e6ee5fSAndroid Build Coastguard Worker die("invalid regex '%s'", system);
190*58e6ee5fSAndroid Build Coastguard Worker
191*58e6ee5fSAndroid Build Coastguard Worker if (event) {
192*58e6ee5fSAndroid Build Coastguard Worker if (regcomp(&event_reg, event, REG_ICASE|REG_NOSUB))
193*58e6ee5fSAndroid Build Coastguard Worker die("invalid regex '%s'", event);
194*58e6ee5fSAndroid Build Coastguard Worker } else {
195*58e6ee5fSAndroid Build Coastguard Worker /*
196*58e6ee5fSAndroid Build Coastguard Worker * If the regex ends with ":", then event would be null,
197*58e6ee5fSAndroid Build Coastguard Worker * but we do not want to match events.
198*58e6ee5fSAndroid Build Coastguard Worker */
199*58e6ee5fSAndroid Build Coastguard Worker if (re[l-1] != ':')
200*58e6ee5fSAndroid Build Coastguard Worker just_systems = false;
201*58e6ee5fSAndroid Build Coastguard Worker }
202*58e6ee5fSAndroid Build Coastguard Worker free(str);
203*58e6ee5fSAndroid Build Coastguard Worker
204*58e6ee5fSAndroid Build Coastguard Worker /*
205*58e6ee5fSAndroid Build Coastguard Worker * See if this matches the special ftrace system, as ftrace is not included
206*58e6ee5fSAndroid Build Coastguard Worker * in the systems list, but can get events from tracefs_system_events().
207*58e6ee5fSAndroid Build Coastguard Worker */
208*58e6ee5fSAndroid Build Coastguard Worker if (regexec(&system_reg, ftrace, 0, NULL, 0) == 0) {
209*58e6ee5fSAndroid Build Coastguard Worker if (!event)
210*58e6ee5fSAndroid Build Coastguard Worker show_system(func, ftrace, flags);
211*58e6ee5fSAndroid Build Coastguard Worker else
212*58e6ee5fSAndroid Build Coastguard Worker match_system_events(func, ftrace, &event_reg, flags);
213*58e6ee5fSAndroid Build Coastguard Worker } else if (!just_systems) {
214*58e6ee5fSAndroid Build Coastguard Worker match_system_events(func, ftrace, &system_reg, flags);
215*58e6ee5fSAndroid Build Coastguard Worker }
216*58e6ee5fSAndroid Build Coastguard Worker
217*58e6ee5fSAndroid Build Coastguard Worker for (s = 0; systems[s]; s++) {
218*58e6ee5fSAndroid Build Coastguard Worker
219*58e6ee5fSAndroid Build Coastguard Worker if (regexec(&system_reg, systems[s], 0, NULL, 0) == 0) {
220*58e6ee5fSAndroid Build Coastguard Worker if (!event) {
221*58e6ee5fSAndroid Build Coastguard Worker show_system(func, systems[s], flags);
222*58e6ee5fSAndroid Build Coastguard Worker continue;
223*58e6ee5fSAndroid Build Coastguard Worker }
224*58e6ee5fSAndroid Build Coastguard Worker match_system_events(func, systems[s], &event_reg, flags);
225*58e6ee5fSAndroid Build Coastguard Worker continue;
226*58e6ee5fSAndroid Build Coastguard Worker }
227*58e6ee5fSAndroid Build Coastguard Worker if (just_systems)
228*58e6ee5fSAndroid Build Coastguard Worker continue;
229*58e6ee5fSAndroid Build Coastguard Worker
230*58e6ee5fSAndroid Build Coastguard Worker match_system_events(func, systems[s], &system_reg, flags);
231*58e6ee5fSAndroid Build Coastguard Worker }
232*58e6ee5fSAndroid Build Coastguard Worker tracefs_list_free(systems);
233*58e6ee5fSAndroid Build Coastguard Worker
234*58e6ee5fSAndroid Build Coastguard Worker regfree(&system_reg);
235*58e6ee5fSAndroid Build Coastguard Worker if (event)
236*58e6ee5fSAndroid Build Coastguard Worker regfree(&event_reg);
237*58e6ee5fSAndroid Build Coastguard Worker }
238*58e6ee5fSAndroid Build Coastguard Worker
show_file_write(char * buf,int len,int flags)239*58e6ee5fSAndroid Build Coastguard Worker static int show_file_write(char *buf, int len, int flags)
240*58e6ee5fSAndroid Build Coastguard Worker {
241*58e6ee5fSAndroid Build Coastguard Worker return fwrite(buf, 1, len, stdout);
242*58e6ee5fSAndroid Build Coastguard Worker }
243*58e6ee5fSAndroid Build Coastguard Worker
show_file_re(const char * name,const char * re)244*58e6ee5fSAndroid Build Coastguard Worker static void show_file_re(const char *name, const char *re)
245*58e6ee5fSAndroid Build Coastguard Worker {
246*58e6ee5fSAndroid Build Coastguard Worker process_file_re(show_file_write, name, re, 0);
247*58e6ee5fSAndroid Build Coastguard Worker }
248*58e6ee5fSAndroid Build Coastguard Worker
get_event_file(const char * type,char * buf,int len)249*58e6ee5fSAndroid Build Coastguard Worker static char *get_event_file(const char *type, char *buf, int len)
250*58e6ee5fSAndroid Build Coastguard Worker {
251*58e6ee5fSAndroid Build Coastguard Worker char *system;
252*58e6ee5fSAndroid Build Coastguard Worker char *event;
253*58e6ee5fSAndroid Build Coastguard Worker char *path;
254*58e6ee5fSAndroid Build Coastguard Worker char *file;
255*58e6ee5fSAndroid Build Coastguard Worker int ret;
256*58e6ee5fSAndroid Build Coastguard Worker
257*58e6ee5fSAndroid Build Coastguard Worker if (buf[len-1] == '\n')
258*58e6ee5fSAndroid Build Coastguard Worker buf[len-1] = '\0';
259*58e6ee5fSAndroid Build Coastguard Worker
260*58e6ee5fSAndroid Build Coastguard Worker system = strtok(buf, ":");
261*58e6ee5fSAndroid Build Coastguard Worker if (!system)
262*58e6ee5fSAndroid Build Coastguard Worker die("no system found in %s", buf);
263*58e6ee5fSAndroid Build Coastguard Worker
264*58e6ee5fSAndroid Build Coastguard Worker event = strtok(NULL, ":");
265*58e6ee5fSAndroid Build Coastguard Worker if (!event)
266*58e6ee5fSAndroid Build Coastguard Worker die("no event found in %s\n", buf);
267*58e6ee5fSAndroid Build Coastguard Worker
268*58e6ee5fSAndroid Build Coastguard Worker path = tracefs_get_tracing_file("events");
269*58e6ee5fSAndroid Build Coastguard Worker ret = asprintf(&file, "%s/%s/%s/%s", path, system, event, type);
270*58e6ee5fSAndroid Build Coastguard Worker if (ret < 0)
271*58e6ee5fSAndroid Build Coastguard Worker die("Failed to allocate event file %s %s", system, event);
272*58e6ee5fSAndroid Build Coastguard Worker
273*58e6ee5fSAndroid Build Coastguard Worker tracefs_put_tracing_file(path);
274*58e6ee5fSAndroid Build Coastguard Worker
275*58e6ee5fSAndroid Build Coastguard Worker return file;
276*58e6ee5fSAndroid Build Coastguard Worker }
277*58e6ee5fSAndroid Build Coastguard Worker
event_filter_write(char * buf,int len,int flags)278*58e6ee5fSAndroid Build Coastguard Worker static int event_filter_write(char *buf, int len, int flags)
279*58e6ee5fSAndroid Build Coastguard Worker {
280*58e6ee5fSAndroid Build Coastguard Worker char *file;
281*58e6ee5fSAndroid Build Coastguard Worker
282*58e6ee5fSAndroid Build Coastguard Worker if (buf[len-1] == '\n')
283*58e6ee5fSAndroid Build Coastguard Worker buf[len-1] = '\0';
284*58e6ee5fSAndroid Build Coastguard Worker
285*58e6ee5fSAndroid Build Coastguard Worker printf("%s\n", buf);
286*58e6ee5fSAndroid Build Coastguard Worker
287*58e6ee5fSAndroid Build Coastguard Worker file = get_event_file("filter", buf, len);
288*58e6ee5fSAndroid Build Coastguard Worker dump_file_content(file);
289*58e6ee5fSAndroid Build Coastguard Worker free(file);
290*58e6ee5fSAndroid Build Coastguard Worker printf("\n");
291*58e6ee5fSAndroid Build Coastguard Worker
292*58e6ee5fSAndroid Build Coastguard Worker return 0;
293*58e6ee5fSAndroid Build Coastguard Worker }
294*58e6ee5fSAndroid Build Coastguard Worker
event_trigger_write(char * buf,int len,int flags)295*58e6ee5fSAndroid Build Coastguard Worker static int event_trigger_write(char *buf, int len, int flags)
296*58e6ee5fSAndroid Build Coastguard Worker {
297*58e6ee5fSAndroid Build Coastguard Worker char *file;
298*58e6ee5fSAndroid Build Coastguard Worker
299*58e6ee5fSAndroid Build Coastguard Worker if (buf[len-1] == '\n')
300*58e6ee5fSAndroid Build Coastguard Worker buf[len-1] = '\0';
301*58e6ee5fSAndroid Build Coastguard Worker
302*58e6ee5fSAndroid Build Coastguard Worker printf("%s\n", buf);
303*58e6ee5fSAndroid Build Coastguard Worker
304*58e6ee5fSAndroid Build Coastguard Worker file = get_event_file("trigger", buf, len);
305*58e6ee5fSAndroid Build Coastguard Worker dump_file_content(file);
306*58e6ee5fSAndroid Build Coastguard Worker free(file);
307*58e6ee5fSAndroid Build Coastguard Worker printf("\n");
308*58e6ee5fSAndroid Build Coastguard Worker
309*58e6ee5fSAndroid Build Coastguard Worker return 0;
310*58e6ee5fSAndroid Build Coastguard Worker }
311*58e6ee5fSAndroid Build Coastguard Worker
event_format_write(char * fbuf,int len,int flags)312*58e6ee5fSAndroid Build Coastguard Worker static int event_format_write(char *fbuf, int len, int flags)
313*58e6ee5fSAndroid Build Coastguard Worker {
314*58e6ee5fSAndroid Build Coastguard Worker char *file = get_event_file("format", fbuf, len);
315*58e6ee5fSAndroid Build Coastguard Worker char *buf = NULL;
316*58e6ee5fSAndroid Build Coastguard Worker size_t l;
317*58e6ee5fSAndroid Build Coastguard Worker FILE *fp;
318*58e6ee5fSAndroid Build Coastguard Worker bool full;
319*58e6ee5fSAndroid Build Coastguard Worker int n;
320*58e6ee5fSAndroid Build Coastguard Worker
321*58e6ee5fSAndroid Build Coastguard Worker full = flags & SHOW_EVENT_FULL;
322*58e6ee5fSAndroid Build Coastguard Worker
323*58e6ee5fSAndroid Build Coastguard Worker /* The get_event_file() crops system in fbuf */
324*58e6ee5fSAndroid Build Coastguard Worker printf("system: %s\n", fbuf);
325*58e6ee5fSAndroid Build Coastguard Worker
326*58e6ee5fSAndroid Build Coastguard Worker /* Don't print the print fmt, it's ugly */
327*58e6ee5fSAndroid Build Coastguard Worker
328*58e6ee5fSAndroid Build Coastguard Worker fp = fopen(file, "r");
329*58e6ee5fSAndroid Build Coastguard Worker if (!fp)
330*58e6ee5fSAndroid Build Coastguard Worker die("reading %s", file);
331*58e6ee5fSAndroid Build Coastguard Worker
332*58e6ee5fSAndroid Build Coastguard Worker do {
333*58e6ee5fSAndroid Build Coastguard Worker n = getline(&buf, &l, fp);
334*58e6ee5fSAndroid Build Coastguard Worker if (n > 0) {
335*58e6ee5fSAndroid Build Coastguard Worker if (!full && strncmp(buf, "print fmt", 9) == 0)
336*58e6ee5fSAndroid Build Coastguard Worker break;
337*58e6ee5fSAndroid Build Coastguard Worker fwrite(buf, 1, n, stdout);
338*58e6ee5fSAndroid Build Coastguard Worker }
339*58e6ee5fSAndroid Build Coastguard Worker } while (n > 0);
340*58e6ee5fSAndroid Build Coastguard Worker fclose(fp);
341*58e6ee5fSAndroid Build Coastguard Worker free(buf);
342*58e6ee5fSAndroid Build Coastguard Worker free(file);
343*58e6ee5fSAndroid Build Coastguard Worker
344*58e6ee5fSAndroid Build Coastguard Worker return 0;
345*58e6ee5fSAndroid Build Coastguard Worker }
346*58e6ee5fSAndroid Build Coastguard Worker
event_name(char * buf,int len,int flags)347*58e6ee5fSAndroid Build Coastguard Worker static int event_name(char *buf, int len, int flags)
348*58e6ee5fSAndroid Build Coastguard Worker {
349*58e6ee5fSAndroid Build Coastguard Worker printf("%s\n", buf);
350*58e6ee5fSAndroid Build Coastguard Worker
351*58e6ee5fSAndroid Build Coastguard Worker return 0;
352*58e6ee5fSAndroid Build Coastguard Worker }
353*58e6ee5fSAndroid Build Coastguard Worker
show_event_filter_re(const char * re)354*58e6ee5fSAndroid Build Coastguard Worker static void show_event_filter_re(const char *re)
355*58e6ee5fSAndroid Build Coastguard Worker {
356*58e6ee5fSAndroid Build Coastguard Worker process_events(event_filter_write, re, 0);
357*58e6ee5fSAndroid Build Coastguard Worker }
358*58e6ee5fSAndroid Build Coastguard Worker
359*58e6ee5fSAndroid Build Coastguard Worker
show_event_trigger_re(const char * re)360*58e6ee5fSAndroid Build Coastguard Worker static void show_event_trigger_re(const char *re)
361*58e6ee5fSAndroid Build Coastguard Worker {
362*58e6ee5fSAndroid Build Coastguard Worker process_events(event_trigger_write, re, 0);
363*58e6ee5fSAndroid Build Coastguard Worker }
364*58e6ee5fSAndroid Build Coastguard Worker
365*58e6ee5fSAndroid Build Coastguard Worker
show_event_format_re(const char * re,int flags)366*58e6ee5fSAndroid Build Coastguard Worker static void show_event_format_re(const char *re, int flags)
367*58e6ee5fSAndroid Build Coastguard Worker {
368*58e6ee5fSAndroid Build Coastguard Worker process_events(event_format_write, re, flags);
369*58e6ee5fSAndroid Build Coastguard Worker }
370*58e6ee5fSAndroid Build Coastguard Worker
show_event_names_re(const char * re)371*58e6ee5fSAndroid Build Coastguard Worker static void show_event_names_re(const char *re)
372*58e6ee5fSAndroid Build Coastguard Worker {
373*58e6ee5fSAndroid Build Coastguard Worker process_events(event_name, re, 0);
374*58e6ee5fSAndroid Build Coastguard Worker }
375*58e6ee5fSAndroid Build Coastguard Worker
show_events(const char * eventre,int flags)376*58e6ee5fSAndroid Build Coastguard Worker static void show_events(const char *eventre, int flags)
377*58e6ee5fSAndroid Build Coastguard Worker {
378*58e6ee5fSAndroid Build Coastguard Worker if (flags && !eventre)
379*58e6ee5fSAndroid Build Coastguard Worker die("When specifying event files, an event must be named");
380*58e6ee5fSAndroid Build Coastguard Worker
381*58e6ee5fSAndroid Build Coastguard Worker if (eventre) {
382*58e6ee5fSAndroid Build Coastguard Worker if (flags & SHOW_EVENT_FORMAT)
383*58e6ee5fSAndroid Build Coastguard Worker show_event_format_re(eventre, flags);
384*58e6ee5fSAndroid Build Coastguard Worker
385*58e6ee5fSAndroid Build Coastguard Worker else if (flags & SHOW_EVENT_FILTER)
386*58e6ee5fSAndroid Build Coastguard Worker show_event_filter_re(eventre);
387*58e6ee5fSAndroid Build Coastguard Worker
388*58e6ee5fSAndroid Build Coastguard Worker else if (flags & SHOW_EVENT_TRIGGER)
389*58e6ee5fSAndroid Build Coastguard Worker show_event_trigger_re(eventre);
390*58e6ee5fSAndroid Build Coastguard Worker else
391*58e6ee5fSAndroid Build Coastguard Worker show_event_names_re(eventre);
392*58e6ee5fSAndroid Build Coastguard Worker } else
393*58e6ee5fSAndroid Build Coastguard Worker show_file("available_events");
394*58e6ee5fSAndroid Build Coastguard Worker }
395*58e6ee5fSAndroid Build Coastguard Worker
396*58e6ee5fSAndroid Build Coastguard Worker
show_tracers(void)397*58e6ee5fSAndroid Build Coastguard Worker static void show_tracers(void)
398*58e6ee5fSAndroid Build Coastguard Worker {
399*58e6ee5fSAndroid Build Coastguard Worker show_file("available_tracers");
400*58e6ee5fSAndroid Build Coastguard Worker }
401*58e6ee5fSAndroid Build Coastguard Worker
show_options(const char * prefix,struct buffer_instance * buffer)402*58e6ee5fSAndroid Build Coastguard Worker void show_options(const char *prefix, struct buffer_instance *buffer)
403*58e6ee5fSAndroid Build Coastguard Worker {
404*58e6ee5fSAndroid Build Coastguard Worker struct tracefs_instance *instance = buffer ? buffer->tracefs : NULL;
405*58e6ee5fSAndroid Build Coastguard Worker struct dirent *dent;
406*58e6ee5fSAndroid Build Coastguard Worker struct stat st;
407*58e6ee5fSAndroid Build Coastguard Worker char *path;
408*58e6ee5fSAndroid Build Coastguard Worker DIR *dir;
409*58e6ee5fSAndroid Build Coastguard Worker
410*58e6ee5fSAndroid Build Coastguard Worker if (!prefix)
411*58e6ee5fSAndroid Build Coastguard Worker prefix = "";
412*58e6ee5fSAndroid Build Coastguard Worker
413*58e6ee5fSAndroid Build Coastguard Worker path = tracefs_instance_get_file(instance, "options");
414*58e6ee5fSAndroid Build Coastguard Worker if (!path)
415*58e6ee5fSAndroid Build Coastguard Worker goto show_file;
416*58e6ee5fSAndroid Build Coastguard Worker if (stat(path, &st) < 0)
417*58e6ee5fSAndroid Build Coastguard Worker goto show_file;
418*58e6ee5fSAndroid Build Coastguard Worker
419*58e6ee5fSAndroid Build Coastguard Worker if ((st.st_mode & S_IFMT) != S_IFDIR)
420*58e6ee5fSAndroid Build Coastguard Worker goto show_file;
421*58e6ee5fSAndroid Build Coastguard Worker
422*58e6ee5fSAndroid Build Coastguard Worker dir = opendir(path);
423*58e6ee5fSAndroid Build Coastguard Worker if (!dir)
424*58e6ee5fSAndroid Build Coastguard Worker die("Can not read instance directory");
425*58e6ee5fSAndroid Build Coastguard Worker
426*58e6ee5fSAndroid Build Coastguard Worker while ((dent = readdir(dir))) {
427*58e6ee5fSAndroid Build Coastguard Worker const char *name = dent->d_name;
428*58e6ee5fSAndroid Build Coastguard Worker long long val;
429*58e6ee5fSAndroid Build Coastguard Worker char *file;
430*58e6ee5fSAndroid Build Coastguard Worker int ret;
431*58e6ee5fSAndroid Build Coastguard Worker
432*58e6ee5fSAndroid Build Coastguard Worker if (strcmp(name, ".") == 0 ||
433*58e6ee5fSAndroid Build Coastguard Worker strcmp(name, "..") == 0)
434*58e6ee5fSAndroid Build Coastguard Worker continue;
435*58e6ee5fSAndroid Build Coastguard Worker
436*58e6ee5fSAndroid Build Coastguard Worker ret = asprintf(&file, "options/%s", name);
437*58e6ee5fSAndroid Build Coastguard Worker if (ret < 0)
438*58e6ee5fSAndroid Build Coastguard Worker die("Failed to allocate file name");
439*58e6ee5fSAndroid Build Coastguard Worker ret = tracefs_instance_file_read_number(instance, file, &val);
440*58e6ee5fSAndroid Build Coastguard Worker if (!ret) {
441*58e6ee5fSAndroid Build Coastguard Worker if (val)
442*58e6ee5fSAndroid Build Coastguard Worker printf("%s%s\n", prefix, name);
443*58e6ee5fSAndroid Build Coastguard Worker else
444*58e6ee5fSAndroid Build Coastguard Worker printf("%sno%s\n", prefix, name);
445*58e6ee5fSAndroid Build Coastguard Worker }
446*58e6ee5fSAndroid Build Coastguard Worker free(file);
447*58e6ee5fSAndroid Build Coastguard Worker }
448*58e6ee5fSAndroid Build Coastguard Worker closedir(dir);
449*58e6ee5fSAndroid Build Coastguard Worker tracefs_put_tracing_file(path);
450*58e6ee5fSAndroid Build Coastguard Worker return;
451*58e6ee5fSAndroid Build Coastguard Worker
452*58e6ee5fSAndroid Build Coastguard Worker show_file:
453*58e6ee5fSAndroid Build Coastguard Worker tracefs_put_tracing_file(path);
454*58e6ee5fSAndroid Build Coastguard Worker show_file("trace_options");
455*58e6ee5fSAndroid Build Coastguard Worker }
456*58e6ee5fSAndroid Build Coastguard Worker
show_clocks(void)457*58e6ee5fSAndroid Build Coastguard Worker static void show_clocks(void)
458*58e6ee5fSAndroid Build Coastguard Worker {
459*58e6ee5fSAndroid Build Coastguard Worker char *clocks;
460*58e6ee5fSAndroid Build Coastguard Worker int size;
461*58e6ee5fSAndroid Build Coastguard Worker
462*58e6ee5fSAndroid Build Coastguard Worker clocks = tracefs_instance_file_read(NULL, "trace_clock", &size);
463*58e6ee5fSAndroid Build Coastguard Worker if (!clocks)
464*58e6ee5fSAndroid Build Coastguard Worker die("getting clocks");
465*58e6ee5fSAndroid Build Coastguard Worker if (clocks[size - 1] == '\n')
466*58e6ee5fSAndroid Build Coastguard Worker clocks[size - 1] = 0;
467*58e6ee5fSAndroid Build Coastguard Worker
468*58e6ee5fSAndroid Build Coastguard Worker if (trace_tsc2nsec_is_supported())
469*58e6ee5fSAndroid Build Coastguard Worker printf("%s %s\n", clocks, TSCNSEC_CLOCK);
470*58e6ee5fSAndroid Build Coastguard Worker else
471*58e6ee5fSAndroid Build Coastguard Worker printf("%s\n", clocks);
472*58e6ee5fSAndroid Build Coastguard Worker
473*58e6ee5fSAndroid Build Coastguard Worker free(clocks);
474*58e6ee5fSAndroid Build Coastguard Worker }
475*58e6ee5fSAndroid Build Coastguard Worker
476*58e6ee5fSAndroid Build Coastguard Worker
show_functions(const char * funcre)477*58e6ee5fSAndroid Build Coastguard Worker static void show_functions(const char *funcre)
478*58e6ee5fSAndroid Build Coastguard Worker {
479*58e6ee5fSAndroid Build Coastguard Worker if (funcre)
480*58e6ee5fSAndroid Build Coastguard Worker show_file_re("available_filter_functions", funcre);
481*58e6ee5fSAndroid Build Coastguard Worker else
482*58e6ee5fSAndroid Build Coastguard Worker show_file("available_filter_functions");
483*58e6ee5fSAndroid Build Coastguard Worker }
484*58e6ee5fSAndroid Build Coastguard Worker
485*58e6ee5fSAndroid Build Coastguard Worker
show_buffers(void)486*58e6ee5fSAndroid Build Coastguard Worker static void show_buffers(void)
487*58e6ee5fSAndroid Build Coastguard Worker {
488*58e6ee5fSAndroid Build Coastguard Worker struct dirent *dent;
489*58e6ee5fSAndroid Build Coastguard Worker DIR *dir;
490*58e6ee5fSAndroid Build Coastguard Worker char *path;
491*58e6ee5fSAndroid Build Coastguard Worker int printed = 0;
492*58e6ee5fSAndroid Build Coastguard Worker
493*58e6ee5fSAndroid Build Coastguard Worker path = tracefs_get_tracing_file("instances");
494*58e6ee5fSAndroid Build Coastguard Worker dir = opendir(path);
495*58e6ee5fSAndroid Build Coastguard Worker tracefs_put_tracing_file(path);
496*58e6ee5fSAndroid Build Coastguard Worker if (!dir)
497*58e6ee5fSAndroid Build Coastguard Worker die("Can not read instance directory");
498*58e6ee5fSAndroid Build Coastguard Worker
499*58e6ee5fSAndroid Build Coastguard Worker while ((dent = readdir(dir))) {
500*58e6ee5fSAndroid Build Coastguard Worker const char *name = dent->d_name;
501*58e6ee5fSAndroid Build Coastguard Worker
502*58e6ee5fSAndroid Build Coastguard Worker if (strcmp(name, ".") == 0 ||
503*58e6ee5fSAndroid Build Coastguard Worker strcmp(name, "..") == 0)
504*58e6ee5fSAndroid Build Coastguard Worker continue;
505*58e6ee5fSAndroid Build Coastguard Worker
506*58e6ee5fSAndroid Build Coastguard Worker printf("%s\n", name);
507*58e6ee5fSAndroid Build Coastguard Worker printed = 1;
508*58e6ee5fSAndroid Build Coastguard Worker }
509*58e6ee5fSAndroid Build Coastguard Worker closedir(dir);
510*58e6ee5fSAndroid Build Coastguard Worker
511*58e6ee5fSAndroid Build Coastguard Worker if (!printed)
512*58e6ee5fSAndroid Build Coastguard Worker printf("No buffer instances defined\n");
513*58e6ee5fSAndroid Build Coastguard Worker }
514*58e6ee5fSAndroid Build Coastguard Worker
515*58e6ee5fSAndroid Build Coastguard Worker
show_systems(void)516*58e6ee5fSAndroid Build Coastguard Worker static void show_systems(void)
517*58e6ee5fSAndroid Build Coastguard Worker {
518*58e6ee5fSAndroid Build Coastguard Worker struct dirent *dent;
519*58e6ee5fSAndroid Build Coastguard Worker char *path;
520*58e6ee5fSAndroid Build Coastguard Worker DIR *dir;
521*58e6ee5fSAndroid Build Coastguard Worker
522*58e6ee5fSAndroid Build Coastguard Worker path = tracefs_get_tracing_file("events");
523*58e6ee5fSAndroid Build Coastguard Worker dir = opendir(path);
524*58e6ee5fSAndroid Build Coastguard Worker
525*58e6ee5fSAndroid Build Coastguard Worker if (!dir)
526*58e6ee5fSAndroid Build Coastguard Worker die("Can not read events directory");
527*58e6ee5fSAndroid Build Coastguard Worker
528*58e6ee5fSAndroid Build Coastguard Worker while ((dent = readdir(dir))) {
529*58e6ee5fSAndroid Build Coastguard Worker const char *name = dent->d_name;
530*58e6ee5fSAndroid Build Coastguard Worker struct stat st;
531*58e6ee5fSAndroid Build Coastguard Worker char *spath;
532*58e6ee5fSAndroid Build Coastguard Worker int ret;
533*58e6ee5fSAndroid Build Coastguard Worker
534*58e6ee5fSAndroid Build Coastguard Worker if (strcmp(name, ".") == 0 ||
535*58e6ee5fSAndroid Build Coastguard Worker strcmp(name, "..") == 0)
536*58e6ee5fSAndroid Build Coastguard Worker continue;
537*58e6ee5fSAndroid Build Coastguard Worker
538*58e6ee5fSAndroid Build Coastguard Worker if (asprintf(&spath, "%s/%s", path, name) < 0)
539*58e6ee5fSAndroid Build Coastguard Worker continue;
540*58e6ee5fSAndroid Build Coastguard Worker ret = stat(spath, &st);
541*58e6ee5fSAndroid Build Coastguard Worker if (!ret && S_ISDIR(st.st_mode))
542*58e6ee5fSAndroid Build Coastguard Worker printf("%s\n", name);
543*58e6ee5fSAndroid Build Coastguard Worker
544*58e6ee5fSAndroid Build Coastguard Worker free(spath);
545*58e6ee5fSAndroid Build Coastguard Worker }
546*58e6ee5fSAndroid Build Coastguard Worker
547*58e6ee5fSAndroid Build Coastguard Worker printf("\n");
548*58e6ee5fSAndroid Build Coastguard Worker closedir(dir);
549*58e6ee5fSAndroid Build Coastguard Worker tracefs_put_tracing_file(path);
550*58e6ee5fSAndroid Build Coastguard Worker }
551*58e6ee5fSAndroid Build Coastguard Worker
show_plugin_options(void)552*58e6ee5fSAndroid Build Coastguard Worker static void show_plugin_options(void)
553*58e6ee5fSAndroid Build Coastguard Worker {
554*58e6ee5fSAndroid Build Coastguard Worker struct tep_handle *pevent;
555*58e6ee5fSAndroid Build Coastguard Worker struct tep_plugin_list *list;
556*58e6ee5fSAndroid Build Coastguard Worker struct trace_seq s;
557*58e6ee5fSAndroid Build Coastguard Worker
558*58e6ee5fSAndroid Build Coastguard Worker tracecmd_ftrace_load_options();
559*58e6ee5fSAndroid Build Coastguard Worker
560*58e6ee5fSAndroid Build Coastguard Worker pevent = tep_alloc();
561*58e6ee5fSAndroid Build Coastguard Worker if (!pevent)
562*58e6ee5fSAndroid Build Coastguard Worker die("Can not allocate pevent\n");
563*58e6ee5fSAndroid Build Coastguard Worker
564*58e6ee5fSAndroid Build Coastguard Worker trace_seq_init(&s);
565*58e6ee5fSAndroid Build Coastguard Worker
566*58e6ee5fSAndroid Build Coastguard Worker list = trace_load_plugins(pevent, 0);
567*58e6ee5fSAndroid Build Coastguard Worker tep_plugin_print_options(&s);
568*58e6ee5fSAndroid Build Coastguard Worker trace_seq_do_printf(&s);
569*58e6ee5fSAndroid Build Coastguard Worker tep_unload_plugins(list, pevent);
570*58e6ee5fSAndroid Build Coastguard Worker tep_free(pevent);
571*58e6ee5fSAndroid Build Coastguard Worker }
572*58e6ee5fSAndroid Build Coastguard Worker
573*58e6ee5fSAndroid Build Coastguard Worker
trace_option(int argc,char ** argv)574*58e6ee5fSAndroid Build Coastguard Worker void trace_option(int argc, char **argv)
575*58e6ee5fSAndroid Build Coastguard Worker {
576*58e6ee5fSAndroid Build Coastguard Worker show_plugin_options();
577*58e6ee5fSAndroid Build Coastguard Worker }
578*58e6ee5fSAndroid Build Coastguard Worker
579*58e6ee5fSAndroid Build Coastguard Worker
show_plugins(void)580*58e6ee5fSAndroid Build Coastguard Worker static void show_plugins(void)
581*58e6ee5fSAndroid Build Coastguard Worker {
582*58e6ee5fSAndroid Build Coastguard Worker struct tep_handle *pevent;
583*58e6ee5fSAndroid Build Coastguard Worker struct tep_plugin_list *list;
584*58e6ee5fSAndroid Build Coastguard Worker struct trace_seq s;
585*58e6ee5fSAndroid Build Coastguard Worker
586*58e6ee5fSAndroid Build Coastguard Worker pevent = tep_alloc();
587*58e6ee5fSAndroid Build Coastguard Worker if (!pevent)
588*58e6ee5fSAndroid Build Coastguard Worker die("Can not allocate pevent\n");
589*58e6ee5fSAndroid Build Coastguard Worker
590*58e6ee5fSAndroid Build Coastguard Worker trace_seq_init(&s);
591*58e6ee5fSAndroid Build Coastguard Worker
592*58e6ee5fSAndroid Build Coastguard Worker list = trace_load_plugins(pevent, 0);
593*58e6ee5fSAndroid Build Coastguard Worker tep_print_plugins(&s, " ", "\n", list);
594*58e6ee5fSAndroid Build Coastguard Worker
595*58e6ee5fSAndroid Build Coastguard Worker trace_seq_do_printf(&s);
596*58e6ee5fSAndroid Build Coastguard Worker tep_unload_plugins(list, pevent);
597*58e6ee5fSAndroid Build Coastguard Worker tep_free(pevent);
598*58e6ee5fSAndroid Build Coastguard Worker }
599*58e6ee5fSAndroid Build Coastguard Worker
show_compression(void)600*58e6ee5fSAndroid Build Coastguard Worker static void show_compression(void)
601*58e6ee5fSAndroid Build Coastguard Worker {
602*58e6ee5fSAndroid Build Coastguard Worker char **versions, **names;
603*58e6ee5fSAndroid Build Coastguard Worker int c, i;
604*58e6ee5fSAndroid Build Coastguard Worker
605*58e6ee5fSAndroid Build Coastguard Worker c = tracecmd_compress_protos_get(&names, &versions);
606*58e6ee5fSAndroid Build Coastguard Worker if (c <= 0) {
607*58e6ee5fSAndroid Build Coastguard Worker printf("No compression algorithms are supported\n");
608*58e6ee5fSAndroid Build Coastguard Worker return;
609*58e6ee5fSAndroid Build Coastguard Worker }
610*58e6ee5fSAndroid Build Coastguard Worker printf("Supported compression algorithms:\n");
611*58e6ee5fSAndroid Build Coastguard Worker for (i = 0; i < c; i++)
612*58e6ee5fSAndroid Build Coastguard Worker printf("\t%s, %s\n", names[i], versions[i]);
613*58e6ee5fSAndroid Build Coastguard Worker
614*58e6ee5fSAndroid Build Coastguard Worker free(names);
615*58e6ee5fSAndroid Build Coastguard Worker free(versions);
616*58e6ee5fSAndroid Build Coastguard Worker }
617*58e6ee5fSAndroid Build Coastguard Worker
trace_list(int argc,char ** argv)618*58e6ee5fSAndroid Build Coastguard Worker void trace_list(int argc, char **argv)
619*58e6ee5fSAndroid Build Coastguard Worker {
620*58e6ee5fSAndroid Build Coastguard Worker int events = 0;
621*58e6ee5fSAndroid Build Coastguard Worker int tracer = 0;
622*58e6ee5fSAndroid Build Coastguard Worker int options = 0;
623*58e6ee5fSAndroid Build Coastguard Worker int funcs = 0;
624*58e6ee5fSAndroid Build Coastguard Worker int buffers = 0;
625*58e6ee5fSAndroid Build Coastguard Worker int clocks = 0;
626*58e6ee5fSAndroid Build Coastguard Worker int plug = 0;
627*58e6ee5fSAndroid Build Coastguard Worker int plug_op = 0;
628*58e6ee5fSAndroid Build Coastguard Worker int flags = 0;
629*58e6ee5fSAndroid Build Coastguard Worker int systems = 0;
630*58e6ee5fSAndroid Build Coastguard Worker int show_all = 1;
631*58e6ee5fSAndroid Build Coastguard Worker int compression = 0;
632*58e6ee5fSAndroid Build Coastguard Worker int i;
633*58e6ee5fSAndroid Build Coastguard Worker const char *arg;
634*58e6ee5fSAndroid Build Coastguard Worker const char *funcre = NULL;
635*58e6ee5fSAndroid Build Coastguard Worker const char *eventre = NULL;
636*58e6ee5fSAndroid Build Coastguard Worker
637*58e6ee5fSAndroid Build Coastguard Worker for (i = 2; i < argc; i++) {
638*58e6ee5fSAndroid Build Coastguard Worker arg = NULL;
639*58e6ee5fSAndroid Build Coastguard Worker if (argv[i][0] == '-') {
640*58e6ee5fSAndroid Build Coastguard Worker if (i < argc - 1) {
641*58e6ee5fSAndroid Build Coastguard Worker if (argv[i+1][0] != '-')
642*58e6ee5fSAndroid Build Coastguard Worker arg = argv[i+1];
643*58e6ee5fSAndroid Build Coastguard Worker }
644*58e6ee5fSAndroid Build Coastguard Worker switch (argv[i][1]) {
645*58e6ee5fSAndroid Build Coastguard Worker case 'h':
646*58e6ee5fSAndroid Build Coastguard Worker usage(argv);
647*58e6ee5fSAndroid Build Coastguard Worker break;
648*58e6ee5fSAndroid Build Coastguard Worker case 'e':
649*58e6ee5fSAndroid Build Coastguard Worker events = 1;
650*58e6ee5fSAndroid Build Coastguard Worker eventre = arg;
651*58e6ee5fSAndroid Build Coastguard Worker show_all = 0;
652*58e6ee5fSAndroid Build Coastguard Worker break;
653*58e6ee5fSAndroid Build Coastguard Worker case 'B':
654*58e6ee5fSAndroid Build Coastguard Worker buffers = 1;
655*58e6ee5fSAndroid Build Coastguard Worker show_all = 0;
656*58e6ee5fSAndroid Build Coastguard Worker break;
657*58e6ee5fSAndroid Build Coastguard Worker case 'C':
658*58e6ee5fSAndroid Build Coastguard Worker clocks = 1;
659*58e6ee5fSAndroid Build Coastguard Worker show_all = 0;
660*58e6ee5fSAndroid Build Coastguard Worker break;
661*58e6ee5fSAndroid Build Coastguard Worker case 'F':
662*58e6ee5fSAndroid Build Coastguard Worker flags |= SHOW_EVENT_FORMAT;
663*58e6ee5fSAndroid Build Coastguard Worker break;
664*58e6ee5fSAndroid Build Coastguard Worker case 'R':
665*58e6ee5fSAndroid Build Coastguard Worker flags |= SHOW_EVENT_TRIGGER;
666*58e6ee5fSAndroid Build Coastguard Worker break;
667*58e6ee5fSAndroid Build Coastguard Worker case 'l':
668*58e6ee5fSAndroid Build Coastguard Worker flags |= SHOW_EVENT_FILTER;
669*58e6ee5fSAndroid Build Coastguard Worker break;
670*58e6ee5fSAndroid Build Coastguard Worker case 'p':
671*58e6ee5fSAndroid Build Coastguard Worker case 't':
672*58e6ee5fSAndroid Build Coastguard Worker tracer = 1;
673*58e6ee5fSAndroid Build Coastguard Worker show_all = 0;
674*58e6ee5fSAndroid Build Coastguard Worker break;
675*58e6ee5fSAndroid Build Coastguard Worker case 'P':
676*58e6ee5fSAndroid Build Coastguard Worker plug = 1;
677*58e6ee5fSAndroid Build Coastguard Worker show_all = 0;
678*58e6ee5fSAndroid Build Coastguard Worker break;
679*58e6ee5fSAndroid Build Coastguard Worker case 'O':
680*58e6ee5fSAndroid Build Coastguard Worker plug_op = 1;
681*58e6ee5fSAndroid Build Coastguard Worker show_all = 0;
682*58e6ee5fSAndroid Build Coastguard Worker break;
683*58e6ee5fSAndroid Build Coastguard Worker case 'o':
684*58e6ee5fSAndroid Build Coastguard Worker options = 1;
685*58e6ee5fSAndroid Build Coastguard Worker show_all = 0;
686*58e6ee5fSAndroid Build Coastguard Worker break;
687*58e6ee5fSAndroid Build Coastguard Worker case 'f':
688*58e6ee5fSAndroid Build Coastguard Worker funcs = 1;
689*58e6ee5fSAndroid Build Coastguard Worker funcre = arg;
690*58e6ee5fSAndroid Build Coastguard Worker show_all = 0;
691*58e6ee5fSAndroid Build Coastguard Worker break;
692*58e6ee5fSAndroid Build Coastguard Worker case 's':
693*58e6ee5fSAndroid Build Coastguard Worker systems = 1;
694*58e6ee5fSAndroid Build Coastguard Worker show_all = 0;
695*58e6ee5fSAndroid Build Coastguard Worker break;
696*58e6ee5fSAndroid Build Coastguard Worker case 'c':
697*58e6ee5fSAndroid Build Coastguard Worker compression = 1;
698*58e6ee5fSAndroid Build Coastguard Worker show_all = 0;
699*58e6ee5fSAndroid Build Coastguard Worker break;
700*58e6ee5fSAndroid Build Coastguard Worker case '-':
701*58e6ee5fSAndroid Build Coastguard Worker if (strcmp(argv[i], "--debug") == 0) {
702*58e6ee5fSAndroid Build Coastguard Worker tracecmd_set_debug(true);
703*58e6ee5fSAndroid Build Coastguard Worker break;
704*58e6ee5fSAndroid Build Coastguard Worker }
705*58e6ee5fSAndroid Build Coastguard Worker if (strcmp(argv[i], "--full") == 0) {
706*58e6ee5fSAndroid Build Coastguard Worker flags |= SHOW_EVENT_FULL;
707*58e6ee5fSAndroid Build Coastguard Worker break;
708*58e6ee5fSAndroid Build Coastguard Worker }
709*58e6ee5fSAndroid Build Coastguard Worker fprintf(stderr, "list: invalid option -- '%s'\n",
710*58e6ee5fSAndroid Build Coastguard Worker argv[i]);
711*58e6ee5fSAndroid Build Coastguard Worker default:
712*58e6ee5fSAndroid Build Coastguard Worker fprintf(stderr, "list: invalid option -- '%c'\n",
713*58e6ee5fSAndroid Build Coastguard Worker argv[i][1]);
714*58e6ee5fSAndroid Build Coastguard Worker usage(argv);
715*58e6ee5fSAndroid Build Coastguard Worker }
716*58e6ee5fSAndroid Build Coastguard Worker }
717*58e6ee5fSAndroid Build Coastguard Worker }
718*58e6ee5fSAndroid Build Coastguard Worker
719*58e6ee5fSAndroid Build Coastguard Worker if (events)
720*58e6ee5fSAndroid Build Coastguard Worker show_events(eventre, flags);
721*58e6ee5fSAndroid Build Coastguard Worker
722*58e6ee5fSAndroid Build Coastguard Worker if (tracer)
723*58e6ee5fSAndroid Build Coastguard Worker show_tracers();
724*58e6ee5fSAndroid Build Coastguard Worker
725*58e6ee5fSAndroid Build Coastguard Worker if (options)
726*58e6ee5fSAndroid Build Coastguard Worker show_options(NULL, NULL);
727*58e6ee5fSAndroid Build Coastguard Worker
728*58e6ee5fSAndroid Build Coastguard Worker if (plug)
729*58e6ee5fSAndroid Build Coastguard Worker show_plugins();
730*58e6ee5fSAndroid Build Coastguard Worker
731*58e6ee5fSAndroid Build Coastguard Worker if (plug_op)
732*58e6ee5fSAndroid Build Coastguard Worker show_plugin_options();
733*58e6ee5fSAndroid Build Coastguard Worker
734*58e6ee5fSAndroid Build Coastguard Worker if (funcs)
735*58e6ee5fSAndroid Build Coastguard Worker show_functions(funcre);
736*58e6ee5fSAndroid Build Coastguard Worker
737*58e6ee5fSAndroid Build Coastguard Worker if (buffers)
738*58e6ee5fSAndroid Build Coastguard Worker show_buffers();
739*58e6ee5fSAndroid Build Coastguard Worker
740*58e6ee5fSAndroid Build Coastguard Worker if (clocks)
741*58e6ee5fSAndroid Build Coastguard Worker show_clocks();
742*58e6ee5fSAndroid Build Coastguard Worker if (systems)
743*58e6ee5fSAndroid Build Coastguard Worker show_systems();
744*58e6ee5fSAndroid Build Coastguard Worker if (compression)
745*58e6ee5fSAndroid Build Coastguard Worker show_compression();
746*58e6ee5fSAndroid Build Coastguard Worker if (show_all) {
747*58e6ee5fSAndroid Build Coastguard Worker printf("event systems:\n");
748*58e6ee5fSAndroid Build Coastguard Worker show_systems();
749*58e6ee5fSAndroid Build Coastguard Worker printf("events:\n");
750*58e6ee5fSAndroid Build Coastguard Worker show_events(NULL, 0);
751*58e6ee5fSAndroid Build Coastguard Worker printf("\ntracers:\n");
752*58e6ee5fSAndroid Build Coastguard Worker show_tracers();
753*58e6ee5fSAndroid Build Coastguard Worker printf("\noptions:\n");
754*58e6ee5fSAndroid Build Coastguard Worker show_options(NULL, NULL);
755*58e6ee5fSAndroid Build Coastguard Worker show_compression();
756*58e6ee5fSAndroid Build Coastguard Worker }
757*58e6ee5fSAndroid Build Coastguard Worker
758*58e6ee5fSAndroid Build Coastguard Worker return;
759*58e6ee5fSAndroid Build Coastguard Worker
760*58e6ee5fSAndroid Build Coastguard Worker }
761