diff options
Diffstat (limited to 'trace-util.c')
-rw-r--r-- | trace-util.c | 47 |
1 files changed, 31 insertions, 16 deletions
diff --git a/trace-util.c b/trace-util.c index 01894f8..e128188 100644 --- a/trace-util.c +++ b/trace-util.c | |||
@@ -714,6 +714,28 @@ static int read_header(struct pevent *pevent, const char *events_dir) | |||
714 | struct pevent *tracecmd_local_events(const char *tracing_dir) | 714 | struct pevent *tracecmd_local_events(const char *tracing_dir) |
715 | { | 715 | { |
716 | struct pevent *pevent = NULL; | 716 | struct pevent *pevent = NULL; |
717 | |||
718 | pevent = pevent_alloc(); | ||
719 | if (!pevent) | ||
720 | return NULL; | ||
721 | |||
722 | if (tracecmd_fill_local_events(tracing_dir, pevent)) { | ||
723 | pevent_free(pevent); | ||
724 | pevent = NULL; | ||
725 | } | ||
726 | |||
727 | return pevent; | ||
728 | } | ||
729 | |||
730 | /** | ||
731 | * tracecmd_fill_local_events - Fill a pevent with the events on system | ||
732 | * @tracing_dir: The directory that contains the events. | ||
733 | * @pevent: Allocated pevent which will be filled | ||
734 | * | ||
735 | * Returns whether the operation succeeded | ||
736 | */ | ||
737 | int tracecmd_fill_local_events(const char *tracing_dir, struct pevent *pevent) | ||
738 | { | ||
717 | struct dirent *dent; | 739 | struct dirent *dent; |
718 | char *events_dir; | 740 | char *events_dir; |
719 | struct stat st; | 741 | struct stat st; |
@@ -721,35 +743,27 @@ struct pevent *tracecmd_local_events(const char *tracing_dir) | |||
721 | int ret, failure = 0; | 743 | int ret, failure = 0; |
722 | 744 | ||
723 | if (!tracing_dir) | 745 | if (!tracing_dir) |
724 | return NULL; | 746 | return -1; |
725 | 747 | ||
726 | events_dir = append_file(tracing_dir, "events"); | 748 | events_dir = append_file(tracing_dir, "events"); |
727 | if (!events_dir) | 749 | if (!events_dir) |
728 | return NULL; | 750 | return -1; |
729 | 751 | ||
730 | ret = stat(events_dir, &st); | 752 | ret = stat(events_dir, &st); |
731 | if (ret < 0 || !S_ISDIR(st.st_mode)) { | 753 | if (ret < 0 || !S_ISDIR(st.st_mode)) { |
732 | failure = 1; | 754 | ret = -1; |
733 | goto out_free; | 755 | goto out_free; |
734 | } | 756 | } |
735 | 757 | ||
736 | dir = opendir(events_dir); | 758 | dir = opendir(events_dir); |
737 | if (!dir) { | 759 | if (!dir) { |
738 | failure = 1; | 760 | ret = -1; |
739 | goto out_free; | ||
740 | } | ||
741 | |||
742 | pevent = pevent_alloc(); | ||
743 | if (!pevent) { | ||
744 | failure = 1; | ||
745 | goto out_free; | 761 | goto out_free; |
746 | } | 762 | } |
747 | 763 | ||
748 | ret = read_header(pevent, events_dir); | 764 | ret = read_header(pevent, events_dir); |
749 | if (ret < 0) { | 765 | if (ret < 0) { |
750 | pevent_free(pevent); | 766 | ret = -1; |
751 | pevent = NULL; | ||
752 | failure = 1; | ||
753 | goto out_free; | 767 | goto out_free; |
754 | } | 768 | } |
755 | 769 | ||
@@ -777,14 +791,15 @@ struct pevent *tracecmd_local_events(const char *tracing_dir) | |||
777 | } | 791 | } |
778 | 792 | ||
779 | closedir(dir); | 793 | closedir(dir); |
794 | /* always succeed because parsing failures are not critical */ | ||
795 | ret = 0; | ||
780 | 796 | ||
781 | out_free: | 797 | out_free: |
782 | free(events_dir); | 798 | free(events_dir); |
783 | 799 | ||
784 | if (pevent) | 800 | pevent->parsing_failures = failure; |
785 | pevent->parsing_failures = failure; | ||
786 | 801 | ||
787 | return pevent; | 802 | return ret; |
788 | } | 803 | } |
789 | 804 | ||
790 | /** | 805 | /** |