blob: 9c38e1e644d721e311f6ad7383a6d0379090bf09 [file] [log] [blame]
// SPDX-License-Identifier: LGPL-2.1
/*
* Copyright (C) 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <errno.h>
#include "event-utils.h"
#include "event-parse.h"
#include "kbuffer.h"
#define __weak __attribute__((weak))
static int log_level = TEP_LOG_CRITICAL;
/**
* tep_set_loglevel - set log level of the library
* @level: desired level of the library messages
*/
void tep_set_loglevel(enum tep_loglevel level)
{
log_level = level;
}
/**
* tep_vprint - print library log messages
* @name: name of the library.
* @level: severity of the log message. This parameter is not used in this implementation, but as
* the function is weak and can be overridden, having the log level could be useful
* for other implementations.
* @print_err: whether to print the errno, if non zero.
* @fmt: printf format string of the message.
* @ap: list of printf parameters.
*
* This function is used to print all messages from traceevent, tracefs and trace-cmd libraries.
* It is defined as weak, so the application that uses those libraries can override it in order
* to implement its own logic for printing library logs.
*
* Return the value of errno at the function enter.
*/
int __weak tep_vprint(const char *name, enum tep_loglevel level,
bool print_err, const char *fmt, va_list ap)
{
return __tep_vprint(name, level, print_err, fmt, ap);
}
/**
* __tep_vprint - print library log messages
* @name: name of the library.
* @level: severity of the log message. This parameter is not used in this implementation, but as
* the function is weak and can be overridden, having the log level could be useful
* for other implementations.
* @print_err: whether to print the errno, if non zero.
* @fmt: printf format string of the message.
* @ap: list of printf parameters.
*
* This function is used to print all messages from traceevent, tracefs and trace-cmd libraries.
* It is defined as weak, so the application that uses those libraries can override it in order
* to implement its own logic for printing library logs.
*
* Return the value of errno at the function enter.
*/
int __tep_vprint(const char *name, enum tep_loglevel level,
bool print_err, const char *fmt, va_list ap)
{
int ret = errno;
FILE *fp = stdout;
if (level <= TEP_LOG_WARNING) {
fp = stderr;
if (errno && print_err) {
perror(name);
fprintf(stderr, " ");
}
}
vfprintf(fp, fmt, ap);
fprintf(fp, "\n");
return ret;
}
void tep_warning(const char *fmt, ...)
{
va_list ap;
if (log_level < TEP_LOG_WARNING)
return;
va_start(ap, fmt);
tep_vprint("libtraceevent", TEP_LOG_WARNING, true, fmt, ap);
va_end(ap);
}
void tep_info(const char *fmt, ...)
{
va_list ap;
if (log_level < TEP_LOG_INFO)
return;
va_start(ap, fmt);
tep_vprint("libtraceevent", TEP_LOG_INFO, false, fmt, ap);
va_end(ap);
}
/* The below is for backward compatibility */
int __weak tep_vwarning(const char *name, const char *fmt, va_list ap)
{
return tep_vprint(name, TEP_LOG_WARNING, true, fmt, ap);
}
void pr_stat(const char *fmt, ...) __attribute__((weak, alias("tep_info")));
void __pr_stat(const char *fmt, ...) __attribute__((weak, alias("tep_info")));
void __weak __vpr_stat(const char *fmt, va_list ap)
{
tep_vprint("libtraceevent", TEP_LOG_INFO, false, fmt, ap);
}
void vpr_stat(const char *fmt, va_list ap) __attribute__((weak, alias("__vpr_stat")));
/**
* tep_kbuffer - return an allocated kbuffer that can be used for the tep handle
* @tep: the handle that will work with the kbuffer descriptor
*
* Allocates and returns a new kbuffer.
* The return must be freed by kbuffer_free();
*/
struct kbuffer *tep_kbuffer(struct tep_handle *tep)
{
enum kbuffer_endian endian;
int long_size;
long_size = tep_get_long_size(tep);
if (long_size == 8)
long_size = KBUFFER_LSIZE_8;
else
long_size = KBUFFER_LSIZE_4;
if (tep_is_file_bigendian(tep))
endian = KBUFFER_ENDIAN_BIG;
else
endian = KBUFFER_ENDIAN_LITTLE;
return kbuffer_alloc(long_size, endian);
}