xref: /aosp_15_r20/external/libtraceevent/samples/test-event.c (revision 436bf2bcd5202612ffffe471bbcc1f277cc8d28e)
1*436bf2bcSAndroid Build Coastguard Worker // SPDX-License-Identifier: LGPL-2.1
2*436bf2bcSAndroid Build Coastguard Worker /*
3*436bf2bcSAndroid Build Coastguard Worker  * Copyright (C) 2022 Google Inc, Steven Rostedt <[email protected]>
4*436bf2bcSAndroid Build Coastguard Worker  */
5*436bf2bcSAndroid Build Coastguard Worker #include <stdlib.h>
6*436bf2bcSAndroid Build Coastguard Worker #include <stdarg.h>
7*436bf2bcSAndroid Build Coastguard Worker #include <string.h>
8*436bf2bcSAndroid Build Coastguard Worker #include <stdio.h>
9*436bf2bcSAndroid Build Coastguard Worker #include <errno.h>
10*436bf2bcSAndroid Build Coastguard Worker #include <getopt.h>
11*436bf2bcSAndroid Build Coastguard Worker #include <event-parse.h>
12*436bf2bcSAndroid Build Coastguard Worker 
13*436bf2bcSAndroid Build Coastguard Worker static char *argv0;
14*436bf2bcSAndroid Build Coastguard Worker 
get_this_name(void)15*436bf2bcSAndroid Build Coastguard Worker static char *get_this_name(void)
16*436bf2bcSAndroid Build Coastguard Worker {
17*436bf2bcSAndroid Build Coastguard Worker 	static char *this_name;
18*436bf2bcSAndroid Build Coastguard Worker 	char *arg;
19*436bf2bcSAndroid Build Coastguard Worker 	char *p;
20*436bf2bcSAndroid Build Coastguard Worker 
21*436bf2bcSAndroid Build Coastguard Worker 	if (this_name)
22*436bf2bcSAndroid Build Coastguard Worker 		return this_name;
23*436bf2bcSAndroid Build Coastguard Worker 
24*436bf2bcSAndroid Build Coastguard Worker 	arg = argv0;
25*436bf2bcSAndroid Build Coastguard Worker 	p = arg+strlen(arg);
26*436bf2bcSAndroid Build Coastguard Worker 
27*436bf2bcSAndroid Build Coastguard Worker 	while (p >= arg && *p != '/')
28*436bf2bcSAndroid Build Coastguard Worker 		p--;
29*436bf2bcSAndroid Build Coastguard Worker 	p++;
30*436bf2bcSAndroid Build Coastguard Worker 
31*436bf2bcSAndroid Build Coastguard Worker 	this_name = p;
32*436bf2bcSAndroid Build Coastguard Worker 	return p;
33*436bf2bcSAndroid Build Coastguard Worker }
34*436bf2bcSAndroid Build Coastguard Worker 
usage(void)35*436bf2bcSAndroid Build Coastguard Worker static void usage(void)
36*436bf2bcSAndroid Build Coastguard Worker {
37*436bf2bcSAndroid Build Coastguard Worker 	char *p = get_this_name();
38*436bf2bcSAndroid Build Coastguard Worker 
39*436bf2bcSAndroid Build Coastguard Worker 	printf("usage: %s [options]\n"
40*436bf2bcSAndroid Build Coastguard Worker 	       " -h : this message\n"
41*436bf2bcSAndroid Build Coastguard Worker 	       " -s system : the system for the event\n"
42*436bf2bcSAndroid Build Coastguard Worker 	       " -e format : the event format file\n"
43*436bf2bcSAndroid Build Coastguard Worker 	       " -f file : file to read the event from\n"
44*436bf2bcSAndroid Build Coastguard Worker 	       "      otherwise, reads from stdin\n"
45*436bf2bcSAndroid Build Coastguard Worker 	       "\n",p);
46*436bf2bcSAndroid Build Coastguard Worker 	exit(-1);
47*436bf2bcSAndroid Build Coastguard Worker }
48*436bf2bcSAndroid Build Coastguard Worker 
__vdie(const char * fmt,va_list ap,int err)49*436bf2bcSAndroid Build Coastguard Worker static void __vdie(const char *fmt, va_list ap, int err)
50*436bf2bcSAndroid Build Coastguard Worker {
51*436bf2bcSAndroid Build Coastguard Worker 	int ret = errno;
52*436bf2bcSAndroid Build Coastguard Worker 	char *p = get_this_name();
53*436bf2bcSAndroid Build Coastguard Worker 
54*436bf2bcSAndroid Build Coastguard Worker 	if (err && errno)
55*436bf2bcSAndroid Build Coastguard Worker 		perror(p);
56*436bf2bcSAndroid Build Coastguard Worker 	else
57*436bf2bcSAndroid Build Coastguard Worker 		ret = -1;
58*436bf2bcSAndroid Build Coastguard Worker 
59*436bf2bcSAndroid Build Coastguard Worker 	fprintf(stderr, "  ");
60*436bf2bcSAndroid Build Coastguard Worker 	vfprintf(stderr, fmt, ap);
61*436bf2bcSAndroid Build Coastguard Worker 
62*436bf2bcSAndroid Build Coastguard Worker 	fprintf(stderr, "\n");
63*436bf2bcSAndroid Build Coastguard Worker 	exit(ret);
64*436bf2bcSAndroid Build Coastguard Worker }
65*436bf2bcSAndroid Build Coastguard Worker 
die(const char * fmt,...)66*436bf2bcSAndroid Build Coastguard Worker void die(const char *fmt, ...)
67*436bf2bcSAndroid Build Coastguard Worker {
68*436bf2bcSAndroid Build Coastguard Worker 	va_list ap;
69*436bf2bcSAndroid Build Coastguard Worker 
70*436bf2bcSAndroid Build Coastguard Worker 	va_start(ap, fmt);
71*436bf2bcSAndroid Build Coastguard Worker 	__vdie(fmt, ap, 0);
72*436bf2bcSAndroid Build Coastguard Worker 	va_end(ap);
73*436bf2bcSAndroid Build Coastguard Worker }
74*436bf2bcSAndroid Build Coastguard Worker 
pdie(const char * fmt,...)75*436bf2bcSAndroid Build Coastguard Worker void pdie(const char *fmt, ...)
76*436bf2bcSAndroid Build Coastguard Worker {
77*436bf2bcSAndroid Build Coastguard Worker 	va_list ap;
78*436bf2bcSAndroid Build Coastguard Worker 
79*436bf2bcSAndroid Build Coastguard Worker 	va_start(ap, fmt);
80*436bf2bcSAndroid Build Coastguard Worker 	__vdie(fmt, ap, 1);
81*436bf2bcSAndroid Build Coastguard Worker 	va_end(ap);
82*436bf2bcSAndroid Build Coastguard Worker }
83*436bf2bcSAndroid Build Coastguard Worker 
84*436bf2bcSAndroid Build Coastguard Worker /* Must be a power of two */
85*436bf2bcSAndroid Build Coastguard Worker #define BUFALLOC	1024
86*436bf2bcSAndroid Build Coastguard Worker #define BUFMASK		(~(BUFALLOC - 1))
87*436bf2bcSAndroid Build Coastguard Worker 
main(int argc,char ** argv)88*436bf2bcSAndroid Build Coastguard Worker int main(int argc, char **argv)
89*436bf2bcSAndroid Build Coastguard Worker {
90*436bf2bcSAndroid Build Coastguard Worker 	struct tep_handle *tep;
91*436bf2bcSAndroid Build Coastguard Worker 	struct tep_event *event;
92*436bf2bcSAndroid Build Coastguard Worker 	FILE *file = stdin;
93*436bf2bcSAndroid Build Coastguard Worker 	FILE *fp = NULL;
94*436bf2bcSAndroid Build Coastguard Worker 	char *system = NULL;
95*436bf2bcSAndroid Build Coastguard Worker 	char *event_buf = NULL;
96*436bf2bcSAndroid Build Coastguard Worker 	int esize = 0;
97*436bf2bcSAndroid Build Coastguard Worker 	int c;
98*436bf2bcSAndroid Build Coastguard Worker 
99*436bf2bcSAndroid Build Coastguard Worker 	argv0 = argv[0];
100*436bf2bcSAndroid Build Coastguard Worker 
101*436bf2bcSAndroid Build Coastguard Worker 	while ((c = getopt(argc, argv, "hs:e:f:")) >= 0) {
102*436bf2bcSAndroid Build Coastguard Worker 		switch (c) {
103*436bf2bcSAndroid Build Coastguard Worker 		case 's':
104*436bf2bcSAndroid Build Coastguard Worker 			system = optarg;
105*436bf2bcSAndroid Build Coastguard Worker 			break;
106*436bf2bcSAndroid Build Coastguard Worker 		case 'e':
107*436bf2bcSAndroid Build Coastguard Worker 			event_buf = optarg;
108*436bf2bcSAndroid Build Coastguard Worker 			file = NULL;
109*436bf2bcSAndroid Build Coastguard Worker 			break;
110*436bf2bcSAndroid Build Coastguard Worker 		case 'f':
111*436bf2bcSAndroid Build Coastguard Worker 			fp = fopen(optarg, "r");
112*436bf2bcSAndroid Build Coastguard Worker 			if (!fp)
113*436bf2bcSAndroid Build Coastguard Worker 				pdie("%s", optarg);
114*436bf2bcSAndroid Build Coastguard Worker 			file = fp;
115*436bf2bcSAndroid Build Coastguard Worker 			break;
116*436bf2bcSAndroid Build Coastguard Worker 		case 'h':
117*436bf2bcSAndroid Build Coastguard Worker 			usage();
118*436bf2bcSAndroid Build Coastguard Worker 		}
119*436bf2bcSAndroid Build Coastguard Worker 	}
120*436bf2bcSAndroid Build Coastguard Worker 	if (file) {
121*436bf2bcSAndroid Build Coastguard Worker 		char *line = NULL;
122*436bf2bcSAndroid Build Coastguard Worker 		size_t n = 0;
123*436bf2bcSAndroid Build Coastguard Worker 		int len;
124*436bf2bcSAndroid Build Coastguard Worker 
125*436bf2bcSAndroid Build Coastguard Worker 		while (getline(&line, &n, file) > 0) {
126*436bf2bcSAndroid Build Coastguard Worker 			len = strlen(line) + 1;
127*436bf2bcSAndroid Build Coastguard Worker 
128*436bf2bcSAndroid Build Coastguard Worker 			if (((esize - 1) & BUFMASK) < ((esize + len) & BUFMASK)) {
129*436bf2bcSAndroid Build Coastguard Worker 				int a;
130*436bf2bcSAndroid Build Coastguard Worker 
131*436bf2bcSAndroid Build Coastguard Worker 				a = (esize + len + BUFALLOC - 1) & BUFMASK;
132*436bf2bcSAndroid Build Coastguard Worker 				event_buf = realloc(event_buf, a);
133*436bf2bcSAndroid Build Coastguard Worker 				if (!event_buf)
134*436bf2bcSAndroid Build Coastguard Worker 					pdie("allocating event");
135*436bf2bcSAndroid Build Coastguard Worker 			}
136*436bf2bcSAndroid Build Coastguard Worker 			strcpy(event_buf + esize, line);
137*436bf2bcSAndroid Build Coastguard Worker 			esize += len - 1;
138*436bf2bcSAndroid Build Coastguard Worker 		}
139*436bf2bcSAndroid Build Coastguard Worker 		free(line);
140*436bf2bcSAndroid Build Coastguard Worker 	}
141*436bf2bcSAndroid Build Coastguard Worker 
142*436bf2bcSAndroid Build Coastguard Worker 	tep = tep_alloc();
143*436bf2bcSAndroid Build Coastguard Worker 	if (!tep)
144*436bf2bcSAndroid Build Coastguard Worker 		pdie("Allocating tep handle");
145*436bf2bcSAndroid Build Coastguard Worker 
146*436bf2bcSAndroid Build Coastguard Worker 	tep_set_loglevel(TEP_LOG_ALL);
147*436bf2bcSAndroid Build Coastguard Worker 
148*436bf2bcSAndroid Build Coastguard Worker 	if (!system)
149*436bf2bcSAndroid Build Coastguard Worker 		system = "test";
150*436bf2bcSAndroid Build Coastguard Worker 
151*436bf2bcSAndroid Build Coastguard Worker 	if (tep_parse_format(tep, &event, event_buf, esize, system))
152*436bf2bcSAndroid Build Coastguard Worker 		die("Failed to parse event");
153*436bf2bcSAndroid Build Coastguard Worker 
154*436bf2bcSAndroid Build Coastguard Worker }
155