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

NAME
----
tracefs_binary_init, tracefs_binary_close, tracefs_binary_write -
Open, close and write binary data in the trace buffer.

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

int *tracefs_binary_init*(struct tracefs_instance pass:[*]_instance_);
int *tracefs_binary_write*(struct tracefs_instance pass:[*]_instance_, void pass:[*]_data_, int _len_);
void *tracefs_binary_close*(struct tracefs_instance pass:[*]_instance_);

--

DESCRIPTION
-----------
Set of functions to write binary data 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_binary_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 data, the
*tracefs_binary_write()* will call it automatically, if the library is not yet initialized.
But calling *tracefs_binary_init()* in advance will speed up the writing.

The *tracefs_binary_write()* function writes a binary data in the trace buffer of the selected
_instance_. The _data_ points to the data with length _len_, that is going to be written in
the trace buffer.

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

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

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

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

unsigned int data = 0xdeadbeef;

	if (tracefs_binary_write(NULL, &data, sizeof(data)) < 0) {
		/* Failed to write in the trace buffer */
	}

tracefs_binary_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).
