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