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

NAME
----
tracefs_error_last, tracefs_error_all, tracefs_error_clear -
functions to read and clear the tracefs error log.

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

char pass:[*]*tracefs_error_last*(struct tracefs_instance pass:[*]_instance_);
char pass:[*]*tracefs_error_all*(struct tracefs_instance pass:[*]_instance_);
int *tracefs_error_clear*(struct tracefs_instance pass:[*]_instance_);
--

DESCRIPTION
-----------
The *tracefs_error_last*() returns the last error message in the tracefs
error log. Several actions that require proper syntax written into the
tracefs file system may produce error messages in the error log. This
function will show the most recent error in the error log.

The *tracefs_error_all*() returns all messages saved in the error log.
Note, this may not be all messages that were ever produced, as the kernel
only keeps a limited amount of messages, and older ones may be discarded
by the kernel.

The *tracefs_error_clear*() will clear the error log.

RETURN VALUE
------------
Both *tracefs_error_last*() and *tracefs_error_all*() will return an allocated
string an error exists in the log, otherwise NULL is returned. If an error
occurs, errno will be set, otherwise if there is no error messages to display
then errno is not touched.

*tracefs_error_clear*() returns 0 on success or -1 on error.

EXAMPLE
-------
[source,c]
--
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

#include <tracefs.h>

int main (int argc, char **argv, char **env)
{
	struct tracefs_dynevent *kevent;
	char *system = NULL;
	char *kprobe;
	char *format;
	char *addr;
	int arg = 1;
	int ret;

	if (argc < 4) {
		printf("usage: %s [system] kprobe addr fmt\n", argv[0]);
		exit(-1);
	}

	if (argc > 5)
		system = argv[arg++];

	kprobe = argv[arg++];
	addr = argv[arg++];
	format = argv[arg++];

	tracefs_error_clear(NULL);
	kevent = tracefs_dynevent_get(TRACEFS_DYNEVENT_KPROBE, system, kprobe);
	if (kevent) {
		tracefs_dynevent_destroy(kevent, true);
		tracefs_dynevent_free(kevent);
	}

	ret = tracefs_kprobe_raw(system, kprobe, addr, format);
	if (ret < 0) {
		char *err;

		perror("Failed creating kprobe");
		errno = 0;
		err = tracefs_error_last(NULL);
		if (err)
			fprintf(stderr, "%s\n", err);
		else if (errno)
			perror("Failed reading error log");
		free(err);
	}

	exit(ret);
}
--
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).
