unplugged-system/external/libtraceevent/samples/test-event.c

155 lines
2.5 KiB
C

// SPDX-License-Identifier: LGPL-2.1
/*
* Copyright (C) 2022 Google Inc, Steven Rostedt <rostedt@goodmis.org>
*/
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <getopt.h>
#include <event-parse.h>
static char *argv0;
static char *get_this_name(void)
{
static char *this_name;
char *arg;
char *p;
if (this_name)
return this_name;
arg = argv0;
p = arg+strlen(arg);
while (p >= arg && *p != '/')
p--;
p++;
this_name = p;
return p;
}
static void usage(void)
{
char *p = get_this_name();
printf("usage: %s [options]\n"
" -h : this message\n"
" -s system : the system for the event\n"
" -e format : the event format file\n"
" -f file : file to read the event from\n"
" otherwise, reads from stdin\n"
"\n",p);
exit(-1);
}
static void __vdie(const char *fmt, va_list ap, int err)
{
int ret = errno;
char *p = get_this_name();
if (err && errno)
perror(p);
else
ret = -1;
fprintf(stderr, " ");
vfprintf(stderr, fmt, ap);
fprintf(stderr, "\n");
exit(ret);
}
void die(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
__vdie(fmt, ap, 0);
va_end(ap);
}
void pdie(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
__vdie(fmt, ap, 1);
va_end(ap);
}
/* Must be a power of two */
#define BUFALLOC 1024
#define BUFMASK (~(BUFALLOC - 1))
int main(int argc, char **argv)
{
struct tep_handle *tep;
struct tep_event *event;
FILE *file = stdin;
FILE *fp = NULL;
char *system = NULL;
char *event_buf = NULL;
int esize = 0;
int c;
argv0 = argv[0];
while ((c = getopt(argc, argv, "hs:e:f:")) >= 0) {
switch (c) {
case 's':
system = optarg;
break;
case 'e':
event_buf = optarg;
file = NULL;
break;
case 'f':
fp = fopen(optarg, "r");
if (!fp)
pdie("%s", optarg);
file = fp;
break;
case 'h':
usage();
}
}
if (file) {
char *line = NULL;
size_t n = 0;
int len;
while (getline(&line, &n, file) > 0) {
len = strlen(line) + 1;
if (((esize - 1) & BUFMASK) < ((esize + len) & BUFMASK)) {
int a;
a = (esize + len + BUFALLOC - 1) & BUFMASK;
event_buf = realloc(event_buf, a);
if (!event_buf)
pdie("allocating event");
}
strcpy(event_buf + esize, line);
esize += len - 1;
}
free(line);
}
tep = tep_alloc();
if (!tep)
pdie("Allocating tep handle");
tep_set_loglevel(TEP_LOG_ALL);
if (!system)
system = "test";
if (tep_parse_format(tep, &event, event_buf, esize, system))
die("Failed to parse event");
}