diff options
Diffstat (limited to 'samples/test-event.c')
-rw-r--r-- | samples/test-event.c | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/samples/test-event.c b/samples/test-event.c new file mode 100644 index 0000000..b25da1e --- /dev/null +++ b/samples/test-event.c @@ -0,0 +1,154 @@ +// 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"); + +} |