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

NAME
----

tracefs_instance_file_open,
tracefs_instance_file_write, tracefs_instance_file_append, tracefs_instance_file_clear,
tracefs_instance_file_read, tracefs_instance_file_read_number - Work with files in tracing instances.

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

int *tracefs_instance_file_open*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_file_, int _mode_);
int *tracefs_instance_file_write*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_file_, const char pass:[*]_str_);
int *tracefs_instance_file_append*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_file_, const char pass:[*]_str_);
int *tracefs_instance_file_clear*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_file_);
char pass:[*]*tracefs_instance_file_read*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_file_, int pass:[*]_psize_);
int *tracefs_instance_file_read_number*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_file_, long long int pass:[*]_res_);

--

DESCRIPTION
-----------
This set of APIs can be used to work with trace files in all trace instances.
Each of these APIs take an _instance_ argument, that can be NULL to act
on the top level instance. Otherwise, it acts on an instance created with
*tracefs_insance_create*(3)

The *tracefs_instance_file_open()* function opens trace _file_ from given _instance_ and returns
a file descriptor to it. The file access _mode_ can be specified, see *open*(3) for more details.
If -1 is passed as _mode_, default O_RDWR is used.

The *tracefs_instance_file_write()* function writes a string _str_ in a _file_ from
the given _instance_, without the terminating NULL character. When opening the file, this function
tries to truncates the size of the file to zero, which clears all previously existing settings.

The *tracefs_instance_file_append()* function writes a string _str_ in a _file_ from
the given _instance_, without the terminating NULL character.  This function is similar to
*tracefs_instance_file_write()*, but the existing content of the is not cleared. Thus the
new settings are appended to the existing ones (if any).

The *tracefs_instance_file_clear()* function tries to truncates the size of the file to zero,
which clears all previously existing settings. If the file has content that does not get
cleared in this way, this will not have any effect.

The *tracefs_instance_file_read()* function reads the content of a _file_ from
the given _instance_.

The *tracefs_instance_file_read_number()* function reads the content of a _file_ from
the given _instance_ and converts it to a long long integer, which is stored in _res_.

RETURN VALUE
------------
The *tracefs_instance_file_open()* function returns a file descriptor to the opened file. It must be
closed with *close*(3). In case of an error, -1 is returned.

The *tracefs_instance_file_write()* function returns the number of written bytes,
or -1 in case of an error.

The *tracefs_instance_file_append()* function returns the number of written bytes,
or -1 in case of an error.

The *tracefs_instance_file_clear()* function returns 0 on success, or -1 in case of an error.

The *tracefs_instance_file_read()* function returns a pointer to a NULL terminated
string, read from the file, or NULL in case of an error. The returned string must
be freed with free().

The *tracefs_instance_file_read_number()* function returns 0 if a valid integer is read from
the file and stored in _res_ or -1 in case of an error.

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

struct tracefs_instance *inst = tracefs_instance_create("foo");
	if (!inst) {
		/* Error creating a new trace instance */
		...
	}

	if (tracefs_file_exists(inst,"trace_clock")) {
		/* The instance foo supports trace clock */
		char *path, *clock;
		int size;

		path =  = tracefs_instance_get_file(inst, "trace_clock")
		if (!path) {
			/* Error getting the path to trace_clock file in instance foo */
			...
		}
		...
		tracefs_put_tracing_file(path);

		clock = tracefs_instance_file_read(inst, "trace_clock", &size);
		if (!clock) {
			/* Failed to read trace_clock file in instance foo */
			...
		}
		...
		free(clock);

		if (tracefs_instance_file_write(inst, "trace_clock", "global") != strlen("global")) {
			/* Failed to set gloabl trace clock in instance foo */
			...
		}
	} else {
		/* The instance foo does not support trace clock */
	}

	if (tracefs_dir_exists(inst,"options")) {
		/* The instance foo supports trace options */
		char *path = tracefs_instance_get_file(inst, "options");
		if (!path) {
			/* Error getting the path to options directory in instance foo */
			...
		}

		tracefs_put_tracing_file(path);
	} else {
		/* The instance foo does not support trace options */
	}

	...

	if (tracefs_instance_is_new(inst))
		tracefs_instance_destroy(inst);
	else
		tracefs_instance_free(inst);
	...

	long long int res;
	if (tracefs_instance_file_read_number(NULL, "tracing_on", &res) == 0) {
		if (res == 0) {
			/* tracing is disabled in the top instance */
		} else if (res == 1) {
			/* tracing is enabled in the top instance */
		} else {
			/* Unknown tracing state of the top instance */
		}
	} else {
		/* Failed to read integer from tracing_on file */
	}

	...

	int fd;
	fd = tracefs_instance_file_open(NULL, "tracing_on", O_WRONLY);
	if (fd >= 0) {
		/* Got file descriptor to the tracing_on file from the top instance for writing */
		...
		close(fd);
	}
--
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)

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) 2020 VMware, Inc. Free use of this software is granted under
the terms of the GNU Public License (GPL).
