libtraceevent(3)
================

NAME
----
tep_filter_alloc, tep_filter_free, tep_filter_reset, tep_filter_make_string,
tep_filter_copy, tep_filter_compare, tep_filter_match, tep_event_filtered,
tep_filter_remove_event, tep_filter_strerror, tep_filter_add_filter_str -
Event filter related APIs.

SYNOPSIS
--------
[verse]
--
*#include <event-parse.h>*

struct tep_event_filter pass:[*]*tep_filter_alloc*(struct tep_handle pass:[*]_tep_);
void *tep_filter_free*(struct tep_event_filter pass:[*]_filter_);
void *tep_filter_reset*(struct tep_event_filter pass:[*]_filter_);
enum tep_errno *tep_filter_add_filter_str*(struct tep_event_filter pass:[*]_filter_, const char pass:[*]_filter_str_);
int *tep_event_filtered*(struct tep_event_filter pass:[*]_filter_, int _event_id_);
int *tep_filter_remove_event*(struct tep_event_filter pass:[*]_filter_, int _event_id_);
enum tep_errno *tep_filter_match*(struct tep_event_filter pass:[*]_filter_, struct tep_record pass:[*]_record_);
int *tep_filter_copy*(struct tep_event_filter pass:[*]_dest_, struct tep_event_filter pass:[*]_source_);
int *tep_filter_compare*(struct tep_event_filter pass:[*]_filter1_, struct tep_event_filter pass:[*]_filter2_);
char pass:[*]*tep_filter_make_string*(struct tep_event_filter pass:[*]_filter_, int _event_id_);
int *tep_filter_strerror*(struct tep_event_filter pass:[*]_filter_, enum tep_errno _err_, char pass:[*]buf, size_t _buflen_);
--

DESCRIPTION
-----------
Filters can be attached to traced events. They can be used to filter out various
events when outputting them. Each event can be filtered based on its parameters,
described in the event's format file. This set of functions can be used to
create, delete, modify and attach event filters.

The _tep_filter_alloc()_ function creates a new event filter. The _tep_ argument
is the trace event parser context.

The _tep_filter_free()_ function frees an event filter and all resources that it
had used.

The _tep_filter_reset()_ function removes all rules from an event filter and
resets it.

The _tep_filter_add_filter_str()_ function adds a new rule to the _filter_. The
_filter_str_ argument is the filter string, that contains the rule.

The _tep_event_filtered()_ function checks if the event with _event_id_ has
_filter_.

The _tep_filter_remove_event()_ function removes a _filter_ for an event with
_event_id_.

The _tep_filter_match()_ function tests if a _record_ matches given _filter_.

The _tep_filter_copy()_ function copies a _source_ filter into a _dest_ filter.

The _tep_filter_compare()_ function compares two filers - _filter1_ and _filter2_.

The _tep_filter_make_string()_ function constructs a string, displaying
the _filter_ contents for given _event_id_.

The _tep_filter_strerror()_ function copies the _filter_ error buffer into the
given _buf_ with the size _buflen_. If the error buffer is empty, in the _buf_
is copied a string, describing the error _err_.

RETURN VALUE
------------
The _tep_filter_alloc()_ function returns a pointer to the newly created event
filter, or NULL in case of an error.

The _tep_filter_add_filter_str()_ function returns 0 if the rule was
successfully added or a negative error code.  Use _tep_filter_strerror()_ to see
actual error message in case of an error.

The _tep_event_filtered()_ function returns 1 if the filter is found for given
event, or 0 otherwise.

The _tep_filter_remove_event()_ function returns 1 if the vent was removed, or
0 if the event was not found.

The _tep_filter_match()_ function returns _tep_errno_, according to the result:
[verse]
--
_pass:[TEP_ERRNO__FILTER_MATCH]_	- filter found for event, the record matches.
_pass:[TEP_ERRNO__FILTER_MISS]_		- filter found for event, the record does not match.
_pass:[TEP_ERRNO__FILTER_NOT_FOUND]_	- no filter found for record's event.
_pass:[TEP_ERRNO__NO_FILTER]_		- no rules in the filter.
--
or any other _tep_errno_, if an error occurred during the test.

The _tep_filter_copy()_ function returns 0 on success or -1 if not all rules
 were copied.

The _tep_filter_compare()_ function returns 1 if the two filters hold the same
content, or 0 if they do not.

The _tep_filter_make_string()_ function returns a string, which must be freed
with free(), or NULL in case of an error.

The _tep_filter_strerror()_ function returns 0 if message was filled
successfully, or -1 in case of an error.

EXAMPLE
-------
[source,c]
--
#include <event-parse.h>
...
struct tep_handle *tep = tep_alloc();
...
char errstr[200];
int ret;

struct tep_event_filter *filter = tep_filter_alloc(tep);
struct tep_event_filter *filter1 = tep_filter_alloc(tep);
ret = tep_filter_add_filter_str(filter, "sched/sched_wakeup:target_cpu==1");
if(ret < 0) {
	tep_filter_strerror(filter, ret, errstr, sizeof(errstr));
	/* Failed to add a new rule to the filter, the error string is in errstr */
}
if (tep_filter_copy(filter1, filter) != 0) {
	/* Failed to copy filter in filter1 */
}
...
if (tep_filter_compare(filter, filter1) != 1) {
	/* Both filters are different */
}
...
void process_record(struct tep_handle *tep, struct tep_record *record)
{
	struct tep_event *event;
	char *fstring;

	event = tep_find_event_by_record(tep, record);

	if (tep_event_filtered(filter, event->id) == 1) {
		/* The event has filter */
		fstring = tep_filter_make_string(filter, event->id);
		if (fstring != NULL) {
			/* The filter for the event is in fstring */
			free(fstring);
		}
	}

	switch (tep_filter_match(filter, record)) {
	case TEP_ERRNO__FILTER_MATCH:
		/* The filter matches the record */
		break;
	case TEP_ERRNO__FILTER_MISS:
		/* The filter does not match the record */
		break;
	case TEP_ERRNO__FILTER_NOT_FOUND:
		/* No filter found for record's event */
		break;
	case TEP_ERRNO__NO_FILTER:
		/* There are no rules in the filter */
		break
	default:
		/* An error occurred during the test */
		break;
	}

	if (tep_filter_remove_event(filter, event->id) == 1) {
		/* The event was removed from the filter */
	}
}

...
tep_filter_reset(filter);
...
tep_filter_free(filter);
tep_filter_free(filter1);
...
--

FILES
-----
[verse]
--
*event-parse.h*
	Header file to include in order to have access to the library APIs.
*-ltraceevent*
	Linker switch to add when building a program that uses the library.
--

SEE ALSO
--------
_libtraceevent(3)_, _trace-cmd(1)_

AUTHOR
------
[verse]
--
*Steven Rostedt* <rostedt@goodmis.org>, author of *libtraceevent*.
*Tzvetomir Stoyanov* <tz.stoyanov@gmail.com>, author of this man page.
--
REPORTING BUGS
--------------
Report bugs to  <linux-trace-devel@vger.kernel.org>

LICENSE
-------
libtraceevent is Free Software licensed under the GNU LGPL 2.1

RESOURCES
---------
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
