xref: /aosp_15_r20/external/trace-cmd/tracecmd/trace-list.c (revision 58e6ee5f017f6a8912852c892d18457e4bafb554)
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(&reg, 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(&reg, 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(&reg);
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