1*436bf2bcSAndroid Build Coastguard Worker // SPDX-License-Identifier: LGPL-2.1
2*436bf2bcSAndroid Build Coastguard Worker /*
3*436bf2bcSAndroid Build Coastguard Worker * Copyright (C) 2010 Red Hat Inc, Steven Rostedt <[email protected]>
4*436bf2bcSAndroid Build Coastguard Worker *
5*436bf2bcSAndroid Build Coastguard Worker */
6*436bf2bcSAndroid Build Coastguard Worker #include <stdio.h>
7*436bf2bcSAndroid Build Coastguard Worker #include <stdlib.h>
8*436bf2bcSAndroid Build Coastguard Worker #include <string.h>
9*436bf2bcSAndroid Build Coastguard Worker #include <stdarg.h>
10*436bf2bcSAndroid Build Coastguard Worker #include <errno.h>
11*436bf2bcSAndroid Build Coastguard Worker
12*436bf2bcSAndroid Build Coastguard Worker #include "event-utils.h"
13*436bf2bcSAndroid Build Coastguard Worker #include "event-parse.h"
14*436bf2bcSAndroid Build Coastguard Worker #include "kbuffer.h"
15*436bf2bcSAndroid Build Coastguard Worker
16*436bf2bcSAndroid Build Coastguard Worker #define __weak __attribute__((weak))
17*436bf2bcSAndroid Build Coastguard Worker
18*436bf2bcSAndroid Build Coastguard Worker static int log_level = TEP_LOG_CRITICAL;
19*436bf2bcSAndroid Build Coastguard Worker
20*436bf2bcSAndroid Build Coastguard Worker /**
21*436bf2bcSAndroid Build Coastguard Worker * tep_set_loglevel - set log level of the library
22*436bf2bcSAndroid Build Coastguard Worker * @level: desired level of the library messages
23*436bf2bcSAndroid Build Coastguard Worker */
tep_set_loglevel(enum tep_loglevel level)24*436bf2bcSAndroid Build Coastguard Worker void tep_set_loglevel(enum tep_loglevel level)
25*436bf2bcSAndroid Build Coastguard Worker {
26*436bf2bcSAndroid Build Coastguard Worker log_level = level;
27*436bf2bcSAndroid Build Coastguard Worker }
28*436bf2bcSAndroid Build Coastguard Worker
29*436bf2bcSAndroid Build Coastguard Worker /**
30*436bf2bcSAndroid Build Coastguard Worker * tep_vprint - print library log messages
31*436bf2bcSAndroid Build Coastguard Worker * @name: name of the library.
32*436bf2bcSAndroid Build Coastguard Worker * @level: severity of the log message. This parameter is not used in this implementation, but as
33*436bf2bcSAndroid Build Coastguard Worker * the function is weak and can be overridden, having the log level could be useful
34*436bf2bcSAndroid Build Coastguard Worker * for other implementations.
35*436bf2bcSAndroid Build Coastguard Worker * @print_err: whether to print the errno, if non zero.
36*436bf2bcSAndroid Build Coastguard Worker * @fmt: printf format string of the message.
37*436bf2bcSAndroid Build Coastguard Worker * @ap: list of printf parameters.
38*436bf2bcSAndroid Build Coastguard Worker *
39*436bf2bcSAndroid Build Coastguard Worker * This function is used to print all messages from traceevent, tracefs and trace-cmd libraries.
40*436bf2bcSAndroid Build Coastguard Worker * It is defined as weak, so the application that uses those libraries can override it in order
41*436bf2bcSAndroid Build Coastguard Worker * to implement its own logic for printing library logs.
42*436bf2bcSAndroid Build Coastguard Worker *
43*436bf2bcSAndroid Build Coastguard Worker * Return the value of errno at the function enter.
44*436bf2bcSAndroid Build Coastguard Worker */
tep_vprint(const char * name,enum tep_loglevel level,bool print_err,const char * fmt,va_list ap)45*436bf2bcSAndroid Build Coastguard Worker int __weak tep_vprint(const char *name, enum tep_loglevel level,
46*436bf2bcSAndroid Build Coastguard Worker bool print_err, const char *fmt, va_list ap)
47*436bf2bcSAndroid Build Coastguard Worker {
48*436bf2bcSAndroid Build Coastguard Worker return __tep_vprint(name, level, print_err, fmt, ap);
49*436bf2bcSAndroid Build Coastguard Worker }
50*436bf2bcSAndroid Build Coastguard Worker
51*436bf2bcSAndroid Build Coastguard Worker /**
52*436bf2bcSAndroid Build Coastguard Worker * __tep_vprint - print library log messages
53*436bf2bcSAndroid Build Coastguard Worker * @name: name of the library.
54*436bf2bcSAndroid Build Coastguard Worker * @level: severity of the log message. This parameter is not used in this implementation, but as
55*436bf2bcSAndroid Build Coastguard Worker * the function is weak and can be overridden, having the log level could be useful
56*436bf2bcSAndroid Build Coastguard Worker * for other implementations.
57*436bf2bcSAndroid Build Coastguard Worker * @print_err: whether to print the errno, if non zero.
58*436bf2bcSAndroid Build Coastguard Worker * @fmt: printf format string of the message.
59*436bf2bcSAndroid Build Coastguard Worker * @ap: list of printf parameters.
60*436bf2bcSAndroid Build Coastguard Worker *
61*436bf2bcSAndroid Build Coastguard Worker * This function is used to print all messages from traceevent, tracefs and trace-cmd libraries.
62*436bf2bcSAndroid Build Coastguard Worker * It is defined as weak, so the application that uses those libraries can override it in order
63*436bf2bcSAndroid Build Coastguard Worker * to implement its own logic for printing library logs.
64*436bf2bcSAndroid Build Coastguard Worker *
65*436bf2bcSAndroid Build Coastguard Worker * Return the value of errno at the function enter.
66*436bf2bcSAndroid Build Coastguard Worker */
__tep_vprint(const char * name,enum tep_loglevel level,bool print_err,const char * fmt,va_list ap)67*436bf2bcSAndroid Build Coastguard Worker int __tep_vprint(const char *name, enum tep_loglevel level,
68*436bf2bcSAndroid Build Coastguard Worker bool print_err, const char *fmt, va_list ap)
69*436bf2bcSAndroid Build Coastguard Worker {
70*436bf2bcSAndroid Build Coastguard Worker int ret = errno;
71*436bf2bcSAndroid Build Coastguard Worker FILE *fp = stdout;
72*436bf2bcSAndroid Build Coastguard Worker
73*436bf2bcSAndroid Build Coastguard Worker if (level <= TEP_LOG_WARNING) {
74*436bf2bcSAndroid Build Coastguard Worker fp = stderr;
75*436bf2bcSAndroid Build Coastguard Worker if (errno && print_err) {
76*436bf2bcSAndroid Build Coastguard Worker perror(name);
77*436bf2bcSAndroid Build Coastguard Worker fprintf(stderr, " ");
78*436bf2bcSAndroid Build Coastguard Worker }
79*436bf2bcSAndroid Build Coastguard Worker }
80*436bf2bcSAndroid Build Coastguard Worker vfprintf(fp, fmt, ap);
81*436bf2bcSAndroid Build Coastguard Worker fprintf(fp, "\n");
82*436bf2bcSAndroid Build Coastguard Worker
83*436bf2bcSAndroid Build Coastguard Worker return ret;
84*436bf2bcSAndroid Build Coastguard Worker }
85*436bf2bcSAndroid Build Coastguard Worker
tep_warning(const char * fmt,...)86*436bf2bcSAndroid Build Coastguard Worker void tep_warning(const char *fmt, ...)
87*436bf2bcSAndroid Build Coastguard Worker {
88*436bf2bcSAndroid Build Coastguard Worker va_list ap;
89*436bf2bcSAndroid Build Coastguard Worker
90*436bf2bcSAndroid Build Coastguard Worker if (log_level < TEP_LOG_WARNING)
91*436bf2bcSAndroid Build Coastguard Worker return;
92*436bf2bcSAndroid Build Coastguard Worker
93*436bf2bcSAndroid Build Coastguard Worker va_start(ap, fmt);
94*436bf2bcSAndroid Build Coastguard Worker tep_vprint("libtraceevent", TEP_LOG_WARNING, true, fmt, ap);
95*436bf2bcSAndroid Build Coastguard Worker va_end(ap);
96*436bf2bcSAndroid Build Coastguard Worker }
97*436bf2bcSAndroid Build Coastguard Worker
98*436bf2bcSAndroid Build Coastguard Worker
tep_info(const char * fmt,...)99*436bf2bcSAndroid Build Coastguard Worker void tep_info(const char *fmt, ...)
100*436bf2bcSAndroid Build Coastguard Worker {
101*436bf2bcSAndroid Build Coastguard Worker va_list ap;
102*436bf2bcSAndroid Build Coastguard Worker
103*436bf2bcSAndroid Build Coastguard Worker if (log_level < TEP_LOG_INFO)
104*436bf2bcSAndroid Build Coastguard Worker return;
105*436bf2bcSAndroid Build Coastguard Worker
106*436bf2bcSAndroid Build Coastguard Worker va_start(ap, fmt);
107*436bf2bcSAndroid Build Coastguard Worker tep_vprint("libtraceevent", TEP_LOG_INFO, false, fmt, ap);
108*436bf2bcSAndroid Build Coastguard Worker va_end(ap);
109*436bf2bcSAndroid Build Coastguard Worker }
110*436bf2bcSAndroid Build Coastguard Worker
111*436bf2bcSAndroid Build Coastguard Worker /* The below is for backward compatibility */
tep_vwarning(const char * name,const char * fmt,va_list ap)112*436bf2bcSAndroid Build Coastguard Worker int __weak tep_vwarning(const char *name, const char *fmt, va_list ap)
113*436bf2bcSAndroid Build Coastguard Worker {
114*436bf2bcSAndroid Build Coastguard Worker return tep_vprint(name, TEP_LOG_WARNING, true, fmt, ap);
115*436bf2bcSAndroid Build Coastguard Worker }
116*436bf2bcSAndroid Build Coastguard Worker
117*436bf2bcSAndroid Build Coastguard Worker void pr_stat(const char *fmt, ...) __attribute__((weak, alias("tep_info")));
118*436bf2bcSAndroid Build Coastguard Worker void __pr_stat(const char *fmt, ...) __attribute__((weak, alias("tep_info")));
119*436bf2bcSAndroid Build Coastguard Worker
__vpr_stat(const char * fmt,va_list ap)120*436bf2bcSAndroid Build Coastguard Worker void __weak __vpr_stat(const char *fmt, va_list ap)
121*436bf2bcSAndroid Build Coastguard Worker {
122*436bf2bcSAndroid Build Coastguard Worker tep_vprint("libtraceevent", TEP_LOG_INFO, false, fmt, ap);
123*436bf2bcSAndroid Build Coastguard Worker }
124*436bf2bcSAndroid Build Coastguard Worker
125*436bf2bcSAndroid Build Coastguard Worker void vpr_stat(const char *fmt, va_list ap) __attribute__((weak, alias("__vpr_stat")));
126*436bf2bcSAndroid Build Coastguard Worker
127*436bf2bcSAndroid Build Coastguard Worker /**
128*436bf2bcSAndroid Build Coastguard Worker * tep_kbuffer - return an allocated kbuffer that can be used for the tep handle
129*436bf2bcSAndroid Build Coastguard Worker * @tep: the handle that will work with the kbuffer descriptor
130*436bf2bcSAndroid Build Coastguard Worker *
131*436bf2bcSAndroid Build Coastguard Worker * Allocates and returns a new kbuffer.
132*436bf2bcSAndroid Build Coastguard Worker * The return must be freed by kbuffer_free();
133*436bf2bcSAndroid Build Coastguard Worker */
tep_kbuffer(struct tep_handle * tep)134*436bf2bcSAndroid Build Coastguard Worker struct kbuffer *tep_kbuffer(struct tep_handle *tep)
135*436bf2bcSAndroid Build Coastguard Worker {
136*436bf2bcSAndroid Build Coastguard Worker enum kbuffer_endian endian;
137*436bf2bcSAndroid Build Coastguard Worker int long_size;
138*436bf2bcSAndroid Build Coastguard Worker
139*436bf2bcSAndroid Build Coastguard Worker long_size = tep_get_long_size(tep);
140*436bf2bcSAndroid Build Coastguard Worker
141*436bf2bcSAndroid Build Coastguard Worker /* If the long_size is not set, then use the commit size */
142*436bf2bcSAndroid Build Coastguard Worker if (!long_size)
143*436bf2bcSAndroid Build Coastguard Worker long_size = tep_get_header_page_size(tep);
144*436bf2bcSAndroid Build Coastguard Worker
145*436bf2bcSAndroid Build Coastguard Worker if (long_size == 8)
146*436bf2bcSAndroid Build Coastguard Worker long_size = KBUFFER_LSIZE_8;
147*436bf2bcSAndroid Build Coastguard Worker else
148*436bf2bcSAndroid Build Coastguard Worker long_size = KBUFFER_LSIZE_4;
149*436bf2bcSAndroid Build Coastguard Worker
150*436bf2bcSAndroid Build Coastguard Worker if (tep_is_file_bigendian(tep))
151*436bf2bcSAndroid Build Coastguard Worker endian = KBUFFER_ENDIAN_BIG;
152*436bf2bcSAndroid Build Coastguard Worker else
153*436bf2bcSAndroid Build Coastguard Worker endian = KBUFFER_ENDIAN_LITTLE;
154*436bf2bcSAndroid Build Coastguard Worker
155*436bf2bcSAndroid Build Coastguard Worker return kbuffer_alloc(long_size, endian);
156*436bf2bcSAndroid Build Coastguard Worker }
157