libtracefs(3)
=============

NAME
----
tracefs_print_init, tracefs_print_close, tracefs_printf, tracefs_vprintf -
Open, close and write formated strings in the trace buffer.

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

int *tracefs_print_init*(struct tracefs_instance pass:[*]_instance_);
int *tracefs_printf*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_fmt_, _..._);
int *tracefs_vprintf*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_fmt_, va_list _ap_);
void *tracefs_print_close*(struct tracefs_instance pass:[*]_instance_);

--

DESCRIPTION
-----------
Set of functions to write formated strings in the trace buffer.
See Documentation/trace/ftrace.rst from the Linux kernel tree for more information about writing
data from user space in the trace buffer. All these APIs have _instance_ as a first argument. If
NULL is passed as _instance_, the top trace instance is used.

The *tracefs_print_init()* function initializes the library for writing into the trace buffer of
the selected _instance_. It is not mandatory to call this API before writing strings, any of
the printf APIs will call it automatically, if the library is not yet initialized. But calling
*tracefs_print_init()* in advance will speed up the writing.

The *tracefs_printf()* function writes a formatted string in the trace buffer of the selected
_instance_. The _fmt_ argument is a string in printf format, followed by variable arguments _..._.

The *tracefs_vprintf()* function writes a formatted string in the trace buffer of the selected
_instance_. The _fmt_ argument is a string in printf format, followed by list _ap_ of arguments.

The *tracefs_print_close()* function closes the resources, used by the library for writing in
the trace buffer of the selected instance.

RETURN VALUE
------------
The *tracefs_print_init()*, *tracefs_printf()*, and *tracefs_vprintf()* functions return 0 if
the operation is successful, or -1 in case of an error.

EXAMPLE
-------
[source,c]
--
#include <tracefs.h>

if (tracefs_print_init(NULL) < 0) {
 /* Failed to initialize the library for writing in the trace buffer of the top trace instance */
}

void foo_print(char *format, ...)
{
	va_list ap;
	va_start(ap, format);
	if (tracefs_vprintf(NULL, format, ap) < 0) {
		/* Failed to print in the trace buffer */
	}
	va_end(ap);
}

void foo_print_string(char *message)
{
	if (tracefs_printf(NULL, "Message from user space: %s", message) < 0) {
		/* Failed to print in the trace buffer */
	}
}

tracefs_print_close();
--
FILES
-----
[verse]
--
*tracefs.h*
	Header file to include in order to have access to the library APIs.
*-ltracefs*
	Linker switch to add when building a program that uses the library.
--

SEE ALSO
--------
*libtracefs*(3),
*libtraceevent*(3),
*trace-cmd*(1),
Documentation/trace/ftrace.rst from the Linux kernel tree

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

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

RESOURCES
---------
https://git.kernel.org/pub/scm/libs/libtrace/libtracefs.git/

COPYING
-------
Copyright \(C) 2021 VMware, Inc. Free use of this software is granted under
the terms of the GNU Public License (GPL).
