xref: /aosp_15_r20/external/kmod/tools/log.c (revision cc4ad7da8cefe208cb129ac2aa9a357c7c72deb2)
1*cc4ad7daSAndroid Build Coastguard Worker /*
2*cc4ad7daSAndroid Build Coastguard Worker  * kmod - log infrastructure
3*cc4ad7daSAndroid Build Coastguard Worker  *
4*cc4ad7daSAndroid Build Coastguard Worker  * Copyright (C) 2012-2013  ProFUSION embedded systems
5*cc4ad7daSAndroid Build Coastguard Worker  *
6*cc4ad7daSAndroid Build Coastguard Worker  * This program is free software: you can redistribute it and/or modify
7*cc4ad7daSAndroid Build Coastguard Worker  * it under the terms of the GNU General Public License as published by
8*cc4ad7daSAndroid Build Coastguard Worker  * the Free Software Foundation, either version 2 of the License, or
9*cc4ad7daSAndroid Build Coastguard Worker  * (at your option) any later version.
10*cc4ad7daSAndroid Build Coastguard Worker  *
11*cc4ad7daSAndroid Build Coastguard Worker  * This program is distributed in the hope that it will be useful,
12*cc4ad7daSAndroid Build Coastguard Worker  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13*cc4ad7daSAndroid Build Coastguard Worker  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*cc4ad7daSAndroid Build Coastguard Worker  * GNU General Public License for more details.
15*cc4ad7daSAndroid Build Coastguard Worker  *
16*cc4ad7daSAndroid Build Coastguard Worker  * You should have received a copy of the GNU General Public License
17*cc4ad7daSAndroid Build Coastguard Worker  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18*cc4ad7daSAndroid Build Coastguard Worker  */
19*cc4ad7daSAndroid Build Coastguard Worker 
20*cc4ad7daSAndroid Build Coastguard Worker #include <errno.h>
21*cc4ad7daSAndroid Build Coastguard Worker #include <stdio.h>
22*cc4ad7daSAndroid Build Coastguard Worker #include <stdlib.h>
23*cc4ad7daSAndroid Build Coastguard Worker #include <syslog.h>
24*cc4ad7daSAndroid Build Coastguard Worker 
25*cc4ad7daSAndroid Build Coastguard Worker #include <libkmod/libkmod.h>
26*cc4ad7daSAndroid Build Coastguard Worker 
27*cc4ad7daSAndroid Build Coastguard Worker #include "kmod.h"
28*cc4ad7daSAndroid Build Coastguard Worker 
29*cc4ad7daSAndroid Build Coastguard Worker #define PRIO_MAX_SIZE 32
30*cc4ad7daSAndroid Build Coastguard Worker 
31*cc4ad7daSAndroid Build Coastguard Worker static bool log_use_syslog;
32*cc4ad7daSAndroid Build Coastguard Worker static int log_priority = LOG_WARNING;
33*cc4ad7daSAndroid Build Coastguard Worker 
prio_to_str(char buf[static PRIO_MAX_SIZE],int prio)34*cc4ad7daSAndroid Build Coastguard Worker static const char *prio_to_str(char buf[static PRIO_MAX_SIZE], int prio)
35*cc4ad7daSAndroid Build Coastguard Worker {
36*cc4ad7daSAndroid Build Coastguard Worker 	const char *prioname;
37*cc4ad7daSAndroid Build Coastguard Worker 
38*cc4ad7daSAndroid Build Coastguard Worker 	switch (prio) {
39*cc4ad7daSAndroid Build Coastguard Worker 	case LOG_CRIT:
40*cc4ad7daSAndroid Build Coastguard Worker 		prioname = "FATAL";
41*cc4ad7daSAndroid Build Coastguard Worker 		break;
42*cc4ad7daSAndroid Build Coastguard Worker 	case LOG_ERR:
43*cc4ad7daSAndroid Build Coastguard Worker 		prioname = "ERROR";
44*cc4ad7daSAndroid Build Coastguard Worker 		break;
45*cc4ad7daSAndroid Build Coastguard Worker 	case LOG_WARNING:
46*cc4ad7daSAndroid Build Coastguard Worker 		prioname = "WARNING";
47*cc4ad7daSAndroid Build Coastguard Worker 		break;
48*cc4ad7daSAndroid Build Coastguard Worker 	case LOG_NOTICE:
49*cc4ad7daSAndroid Build Coastguard Worker 		prioname = "NOTICE";
50*cc4ad7daSAndroid Build Coastguard Worker 		break;
51*cc4ad7daSAndroid Build Coastguard Worker 	case LOG_INFO:
52*cc4ad7daSAndroid Build Coastguard Worker 		prioname = "INFO";
53*cc4ad7daSAndroid Build Coastguard Worker 		break;
54*cc4ad7daSAndroid Build Coastguard Worker 	case LOG_DEBUG:
55*cc4ad7daSAndroid Build Coastguard Worker 		prioname = "DEBUG";
56*cc4ad7daSAndroid Build Coastguard Worker 		break;
57*cc4ad7daSAndroid Build Coastguard Worker 	default:
58*cc4ad7daSAndroid Build Coastguard Worker 		snprintf(buf, PRIO_MAX_SIZE, "LOG-%03d", prio);
59*cc4ad7daSAndroid Build Coastguard Worker 		prioname = buf;
60*cc4ad7daSAndroid Build Coastguard Worker 	}
61*cc4ad7daSAndroid Build Coastguard Worker 
62*cc4ad7daSAndroid Build Coastguard Worker 	return prioname;
63*cc4ad7daSAndroid Build Coastguard Worker }
64*cc4ad7daSAndroid Build Coastguard Worker 
65*cc4ad7daSAndroid Build Coastguard Worker _printf_format_(6, 0)
log_kmod(void * data,int priority,const char * file,int line,const char * fn,const char * format,va_list args)66*cc4ad7daSAndroid Build Coastguard Worker static void log_kmod(void *data, int priority, const char *file, int line,
67*cc4ad7daSAndroid Build Coastguard Worker 		     const char *fn, const char *format, va_list args)
68*cc4ad7daSAndroid Build Coastguard Worker {
69*cc4ad7daSAndroid Build Coastguard Worker 	char buf[PRIO_MAX_SIZE];
70*cc4ad7daSAndroid Build Coastguard Worker 	const char *prioname;
71*cc4ad7daSAndroid Build Coastguard Worker 	char *str;
72*cc4ad7daSAndroid Build Coastguard Worker 
73*cc4ad7daSAndroid Build Coastguard Worker 	prioname = prio_to_str(buf, priority);
74*cc4ad7daSAndroid Build Coastguard Worker 
75*cc4ad7daSAndroid Build Coastguard Worker 	if (vasprintf(&str, format, args) < 0)
76*cc4ad7daSAndroid Build Coastguard Worker 		return;
77*cc4ad7daSAndroid Build Coastguard Worker 
78*cc4ad7daSAndroid Build Coastguard Worker 	if (log_use_syslog) {
79*cc4ad7daSAndroid Build Coastguard Worker #ifdef ENABLE_DEBUG
80*cc4ad7daSAndroid Build Coastguard Worker 		syslog(priority, "%s: %s:%d %s() %s", prioname, file, line,
81*cc4ad7daSAndroid Build Coastguard Worker 		       fn, str);
82*cc4ad7daSAndroid Build Coastguard Worker #else
83*cc4ad7daSAndroid Build Coastguard Worker 		syslog(priority, "%s: %s", prioname, str);
84*cc4ad7daSAndroid Build Coastguard Worker #endif
85*cc4ad7daSAndroid Build Coastguard Worker 	} else {
86*cc4ad7daSAndroid Build Coastguard Worker #ifdef ENABLE_DEBUG
87*cc4ad7daSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: %s: %s:%d %s() %s",
88*cc4ad7daSAndroid Build Coastguard Worker 			program_invocation_short_name, prioname, file, line,
89*cc4ad7daSAndroid Build Coastguard Worker 			fn, str);
90*cc4ad7daSAndroid Build Coastguard Worker #else
91*cc4ad7daSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: %s: %s", program_invocation_short_name,
92*cc4ad7daSAndroid Build Coastguard Worker 			prioname, str);
93*cc4ad7daSAndroid Build Coastguard Worker #endif
94*cc4ad7daSAndroid Build Coastguard Worker 	}
95*cc4ad7daSAndroid Build Coastguard Worker 
96*cc4ad7daSAndroid Build Coastguard Worker 	free(str);
97*cc4ad7daSAndroid Build Coastguard Worker 	(void)data;
98*cc4ad7daSAndroid Build Coastguard Worker }
log_open(bool use_syslog)99*cc4ad7daSAndroid Build Coastguard Worker void log_open(bool use_syslog)
100*cc4ad7daSAndroid Build Coastguard Worker {
101*cc4ad7daSAndroid Build Coastguard Worker 	log_use_syslog = use_syslog;
102*cc4ad7daSAndroid Build Coastguard Worker 
103*cc4ad7daSAndroid Build Coastguard Worker 	if (log_use_syslog)
104*cc4ad7daSAndroid Build Coastguard Worker 		openlog(program_invocation_short_name, LOG_CONS, LOG_DAEMON);
105*cc4ad7daSAndroid Build Coastguard Worker }
106*cc4ad7daSAndroid Build Coastguard Worker 
log_close(void)107*cc4ad7daSAndroid Build Coastguard Worker void log_close(void)
108*cc4ad7daSAndroid Build Coastguard Worker {
109*cc4ad7daSAndroid Build Coastguard Worker 	if (log_use_syslog)
110*cc4ad7daSAndroid Build Coastguard Worker 		closelog();
111*cc4ad7daSAndroid Build Coastguard Worker }
112*cc4ad7daSAndroid Build Coastguard Worker 
log_printf(int prio,const char * fmt,...)113*cc4ad7daSAndroid Build Coastguard Worker void log_printf(int prio, const char *fmt, ...)
114*cc4ad7daSAndroid Build Coastguard Worker {
115*cc4ad7daSAndroid Build Coastguard Worker 	char buf[PRIO_MAX_SIZE];
116*cc4ad7daSAndroid Build Coastguard Worker 	const char *prioname;
117*cc4ad7daSAndroid Build Coastguard Worker 	char *msg;
118*cc4ad7daSAndroid Build Coastguard Worker 	va_list args;
119*cc4ad7daSAndroid Build Coastguard Worker 
120*cc4ad7daSAndroid Build Coastguard Worker 	if (prio > log_priority)
121*cc4ad7daSAndroid Build Coastguard Worker 		return;
122*cc4ad7daSAndroid Build Coastguard Worker 
123*cc4ad7daSAndroid Build Coastguard Worker 	va_start(args, fmt);
124*cc4ad7daSAndroid Build Coastguard Worker 	if (vasprintf(&msg, fmt, args) < 0)
125*cc4ad7daSAndroid Build Coastguard Worker 		msg = NULL;
126*cc4ad7daSAndroid Build Coastguard Worker 	va_end(args);
127*cc4ad7daSAndroid Build Coastguard Worker 	if (msg == NULL)
128*cc4ad7daSAndroid Build Coastguard Worker 		return;
129*cc4ad7daSAndroid Build Coastguard Worker 
130*cc4ad7daSAndroid Build Coastguard Worker 	prioname = prio_to_str(buf, prio);
131*cc4ad7daSAndroid Build Coastguard Worker 
132*cc4ad7daSAndroid Build Coastguard Worker 	if (log_use_syslog)
133*cc4ad7daSAndroid Build Coastguard Worker 		syslog(prio, "%s: %s", prioname, msg);
134*cc4ad7daSAndroid Build Coastguard Worker 	else
135*cc4ad7daSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: %s: %s", program_invocation_short_name,
136*cc4ad7daSAndroid Build Coastguard Worker 			prioname, msg);
137*cc4ad7daSAndroid Build Coastguard Worker 	free(msg);
138*cc4ad7daSAndroid Build Coastguard Worker 
139*cc4ad7daSAndroid Build Coastguard Worker 	if (prio <= LOG_CRIT)
140*cc4ad7daSAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
141*cc4ad7daSAndroid Build Coastguard Worker }
142*cc4ad7daSAndroid Build Coastguard Worker 
log_setup_kmod_log(struct kmod_ctx * ctx,int priority)143*cc4ad7daSAndroid Build Coastguard Worker void log_setup_kmod_log(struct kmod_ctx *ctx, int priority)
144*cc4ad7daSAndroid Build Coastguard Worker {
145*cc4ad7daSAndroid Build Coastguard Worker 	log_priority = priority;
146*cc4ad7daSAndroid Build Coastguard Worker 
147*cc4ad7daSAndroid Build Coastguard Worker 	kmod_set_log_priority(ctx, log_priority);
148*cc4ad7daSAndroid Build Coastguard Worker 	kmod_set_log_fn(ctx, log_kmod, NULL);
149*cc4ad7daSAndroid Build Coastguard Worker }
150