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, |
