diff options
author | Steven Rostedt <srostedt@redhat.com> | 2010-06-11 15:42:28 -0400 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2010-06-11 15:42:28 -0400 |
commit | 001e4d2dbc3a8d0304e3794edb27729817248b95 (patch) | |
tree | 618abd8856241b7195172f31c7350758e6e61462 | |
parent | 9eac035229e4341c3ab296aa8d3cf44081dc1449 (diff) |
trace-cmd: Add tracecmd_local_plugins()
Add tracecmd_local_plugins() that returns a list of available
tracer plugins.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r-- | trace-cmd.h | 1 | ||||
-rw-r--r-- | trace-util.c | 67 |
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); | |||
38 | char **tracecmd_event_systems(const char *tracing_dir); | 38 | char **tracecmd_event_systems(const char *tracing_dir); |
39 | char **tracecmd_system_events(const char *tracing_dir, const char *system); | 39 | char **tracecmd_system_events(const char *tracing_dir, const char *system); |
40 | struct pevent *tracecmd_local_events(const char *tracing_dir); | 40 | struct pevent *tracecmd_local_events(const char *tracing_dir); |
41 | char **tracecmd_local_plugins(const char *tracing_dir); | ||
41 | 42 | ||
42 | enum { | 43 | enum { |
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 | */ | ||
604 | char **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 | |||
597 | static void | 658 | static void |
598 | trace_util_load_plugins_dir(struct pevent *pevent, const char *suffix, | 659 | trace_util_load_plugins_dir(struct pevent *pevent, const char *suffix, |
599 | const char *path, | 660 | const char *path, |