aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexandre Vicenzi <alexandre.vicenzi@suse.com>2022-08-26 16:24:18 +0200
committerSteven Rostedt (Google) <rostedt@goodmis.org>2022-09-08 19:20:58 -0400
commitee8c64443f85a2d578db25ee40dced9df6198292 (patch)
tree4175bb623707d7ccfc3beb6786d405cc33d92bbc
parent799d88ecb58b5030bc38143a45e7865aa80237f9 (diff)
downloadlibtracefs-ee8c64443f85a2d578db25ee40dced9df6198292.tar.gz
libtracefs: Add tracefs_tracer_available() helper
Add tracefs_tracer_available() helper function to check if a giver tracer is available. Link: https://lore.kernel.org/linux-trace-devel/20220826142420.29911-1-alexandre.vicenzi@suse.com Signed-off-by: Alexandre Vicenzi <alexandre.vicenzi@suse.com> Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
-rw-r--r--Documentation/libtracefs-utils.txt11
-rw-r--r--Documentation/libtracefs.txt1
-rw-r--r--include/tracefs.h2
-rw-r--r--src/tracefs-utils.c28
-rw-r--r--utest/tracefs-utest.c3
5 files changed, 43 insertions, 2 deletions
diff --git a/Documentation/libtracefs-utils.txt b/Documentation/libtracefs-utils.txt
index ddbd675..ab16cc6 100644
--- a/Documentation/libtracefs-utils.txt
+++ b/Documentation/libtracefs-utils.txt
@@ -3,8 +3,8 @@ libtracefs(3)
NAME
----
-tracefs_tracers, tracefs_get_clock, tracefs_list_free, tracefs_list_add,
-tracefs_list_size - Helper functions for working with trace file system.
+tracefs_tracers, tracefs_tracer_available, tracefs_get_clock, tracefs_list_free,
+tracefs_list_add, tracefs_list_size - Helper functions for working with trace file system.
SYNOPSIS
--------
@@ -13,6 +13,7 @@ SYNOPSIS
*#include <tracefs.h>*
char pass:[*]pass:[*]*tracefs_tracers*(const char pass:[*]_tracing_dir_);
+bool *tracefs_tracer_available*(const char pass:[*]_tracing_dir_, const char pass:[*]_tracer_);
char pass:[*]*tracefs_get_clock*(struct tracefs_instance pass:[*]_instance_);
void *tracefs_list_free*(char pass:[*]pass:[*]_list_);
char pass:[**]*tracefs_list_add*(char **_list_, const char *_string_);
@@ -30,6 +31,9 @@ for the trace systems of the local machine, or it may be a path to a copy
of the tracefs directory from another machine. The last entry in the array
as a NULL pointer. The array must be freed with *tracefs_list_free()* API.
+The *tracefs_tracer_available()* returns true if the _tracer_ is available
+in the given _tracing_dir_director_, and false otherwise.
+
The *tracefs_get_clock()* function returns name of the current trace clock,
used in the given _instance_. If _instance_ is NULL, the clock of the main
trace instance is returned. The returned string must be freed with free().
@@ -56,6 +60,9 @@ The *tracefs_tracers()* returns array of strings. The last element in that
array is a NULL pointer. The array must be freed with *tracefs_list_free()* API.
In case of an error, NULL is returned.
+The *tracefs_tracer_available()* returns true if the _tracer_ is available,
+and false otherwise.
+
The *tracefs_get_clock()* returns string, that must be freed with free(), or NULL
in case of an error.
diff --git a/Documentation/libtracefs.txt b/Documentation/libtracefs.txt
index eb2eff4..986557b 100644
--- a/Documentation/libtracefs.txt
+++ b/Documentation/libtracefs.txt
@@ -113,6 +113,7 @@ Trace options:
Ftrace tracers:
char pass:[*]pass:[*]*tracefs_tracers*(const char pass:[*]_tracing_dir_);
+ bool *tracefs_tracer_available*(const char pass:[*]_tracing_dir_, const char pass:[*]_tracer_);
int *tracefs_tracer_set*(struct tracefs_instance pass:[*]_instance_, enum tracefs_tracers _tracer_);
int *tracefs_tracer_set*(struct tracefs_instance pass:[*]_instance_, enum tracefs_tracers _tracer_, const char pass:[*]_name_);
int *tracefs_tracer_clear*(struct tracefs_instance pass:[*]_instance_);
diff --git a/include/tracefs.h b/include/tracefs.h
index fd2240a..5b9bf6e 100644
--- a/include/tracefs.h
+++ b/include/tracefs.h
@@ -78,6 +78,8 @@ void tracefs_list_free(char **list);
char **tracefs_list_add(char **list, const char *string);
int tracefs_list_size(char **list);
+bool tracefs_tracer_available(const char *tracing_dir, const char *tracer);
+
/**
* tracefs_trace_on_get_fd - Get a file descriptor of "tracing_on" in given instance
* @instance: ftrace instance, can be NULL for the top instance
diff --git a/src/tracefs-utils.c b/src/tracefs-utils.c
index 55a2f0a..a38da66 100644
--- a/src/tracefs-utils.c
+++ b/src/tracefs-utils.c
@@ -544,3 +544,31 @@ int tracefs_list_size(char **list)
list--;
return (int)*(unsigned long *)list;
}
+
+/**
+ * tracefs_tracer_available - test if a tracer is available
+ * @tracing_dir: The directory that contains the tracing directory
+ * @tracer: The name of the tracer
+ *
+ * Return true if the tracer is available
+ */
+bool tracefs_tracer_available(const char *tracing_dir, const char *tracer)
+{
+ bool ret = false;
+ char **tracers = NULL;
+ int i;
+
+ tracers = tracefs_tracers(tracing_dir);
+ if (!tracers)
+ return false;
+
+ for (i = 0; tracers[i]; i++) {
+ if (strcmp(tracer, tracers[i]) == 0) {
+ ret = true;
+ break;
+ }
+ }
+
+ tracefs_list_free(tracers);
+ return ret;
+}
diff --git a/utest/tracefs-utest.c b/utest/tracefs-utest.c
index 6f083db..cfb8090 100644
--- a/utest/tracefs-utest.c
+++ b/utest/tracefs-utest.c
@@ -1405,6 +1405,9 @@ static void test_instance_tracers(struct tracefs_instance *instance)
tracers = tracefs_tracers(tdir);
CU_TEST(tracers != NULL);
+ for (i = 0; tracers[i]; i++)
+ CU_TEST(tracefs_tracer_available(tdir, tracers[i]));
+
tfile = tracefs_instance_file_read(NULL, ALL_TRACERS, NULL);
tracer = strtok(tfile, " ");