aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--trace-cmd.h1
-rw-r--r--trace-util.c67
2 files changed, 65 insertions, 3 deletions
diff --git a/trace-cmd.h b/trace-cmd.h
index b732484..c85bb9b 100644
--- a/trace-cmd.h
+++ b/trace-cmd.h
@@ -38,6 +38,7 @@ void tracecmd_unload_plugins(struct plugin_list *list);
38char **tracecmd_event_systems(const char *tracing_dir); 38char **tracecmd_event_systems(const char *tracing_dir);
39char **tracecmd_system_events(const char *tracing_dir, const char *system); 39char **tracecmd_system_events(const char *tracing_dir, const char *system);
40struct pevent *tracecmd_local_events(const char *tracing_dir); 40struct pevent *tracecmd_local_events(const char *tracing_dir);
41char **tracecmd_local_plugins(const char *tracing_dir);
41 42
42enum { 43enum {
43 RINGBUF_TYPE_PADDING = 29, 44 RINGBUF_TYPE_PADDING = 29,
diff --git a/trace-util.c b/trace-util.c
index 6d813c5..82c3d1e 100644
--- a/trace-util.c
+++ b/trace-util.c
@@ -425,11 +425,11 @@ static int read_file(const char *file, char **buffer)
425 if (fd < 0) 425 if (fd < 0)
426 return -1; 426 return -1;
427 427
428 buf = malloc_or_die(BUFSIZ); 428 buf = malloc_or_die(BUFSIZ + 1);
429 429
430 while ((r = read(fd, buf + len, BUFSIZ)) > 0) { 430 while ((r = read(fd, buf + len, BUFSIZ)) > 0) {
431 len += r; 431 len += r;
432 buf = realloc(buf, len + BUFSIZ); 432 buf = realloc(buf, len + BUFSIZ + 1);
433 if (!buf) { 433 if (!buf) {
434 len = -1; 434 len = -1;
435 goto out; 435 goto out;
@@ -437,7 +437,7 @@ static int read_file(const char *file, char **buffer)
437 } 437 }
438 438
439 *buffer = buf; 439 *buffer = buf;
440 440 buf[len] = 0;
441 out: 441 out:
442 close(fd); 442 close(fd);
443 443
@@ -594,6 +594,67 @@ struct pevent *tracecmd_local_events(const char *tracing_dir)
594 return pevent; 594 return pevent;
595} 595}
596 596
597/**
598 * tracecmd_local_plugins - returns an array of available tracer plugins
599 * @tracing_dir: The directory that contains the tracing directory
600 *
601 * Returns an allocate list of plugins. The array ends with NULL.
602 * Both the plugin names and array must be freed with free().
603 */
604char **tracecmd_local_plugins(const char *tracing_dir)
605{
606 char *available_tracers;
607 struct stat st;
608 char **plugins = NULL;
609 char *buf;
610 char *str, *saveptr;
611 char *plugin;
612 int slen;
613 int len;
614 int ret;
615
616 if (!tracing_dir)
617 return NULL;
618
619 available_tracers = append_file(tracing_dir, "available_tracers");
620 if (!available_tracers)
621 return NULL;
622
623 ret = stat(available_tracers, &st);
624 if (ret < 0)
625 goto out_free;
626
627 len = read_file(available_tracers, &buf);
628 if (len < 0)
629 goto out_free;
630
631 len = 0;
632 for (str = buf; ; str = NULL) {
633 plugin = strtok_r(str, " ", &saveptr);
634 if (!plugin)
635 break;
636 if (!(slen = strlen(plugin)))
637 continue;
638
639 /* chop off any newlines */
640 if (plugin[slen - 1] == '\n')
641 plugin[slen - 1] = '\0';
642
643 /* Skip the non tracers */
644 if (strcmp(plugin, "nop") == 0 ||
645 strcmp(plugin, "none") == 0)
646 continue;
647
648 plugins = add_list(plugins, plugin, len++);
649 }
650 free(buf);
651
652 out_free:
653 free(available_tracers);
654
655 return plugins;
656}
657
597static void 658static void
598trace_util_load_plugins_dir(struct pevent *pevent, const char *suffix, 659trace_util_load_plugins_dir(struct pevent *pevent, const char *suffix,
599 const char *path, 660 const char *path,