// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2010 Red Hat Inc, Steven Rostedt * */ #include #include #include #include #include #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); }