xref: /aosp_15_r20/external/libtraceevent/src/parse-utils.c (revision 436bf2bcd5202612ffffe471bbcc1f277cc8d28e)
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