xref: /aosp_15_r20/external/flashrom/bindings/rust/libflashrom/src/log.c (revision 0d6140be3aa665ecc836e8907834fcd3e3b018fc)
1*0d6140beSAndroid Build Coastguard Worker /*
2*0d6140beSAndroid Build Coastguard Worker  * This file is part of the flashrom project.
3*0d6140beSAndroid Build Coastguard Worker  *
4*0d6140beSAndroid Build Coastguard Worker  * Copyright (C) 2022 The Chromium OS Authors
5*0d6140beSAndroid Build Coastguard Worker  *
6*0d6140beSAndroid Build Coastguard Worker  * This program is free software; you can redistribute it and/or modify
7*0d6140beSAndroid Build Coastguard Worker  * it under the terms of the GNU General Public License as published by
8*0d6140beSAndroid Build Coastguard Worker  * the Free Software Foundation; either version 2 of the License, or
9*0d6140beSAndroid Build Coastguard Worker  * (at your option) any later version.
10*0d6140beSAndroid Build Coastguard Worker  *
11*0d6140beSAndroid Build Coastguard Worker  * This program is distributed in the hope that it will be useful,
12*0d6140beSAndroid Build Coastguard Worker  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13*0d6140beSAndroid Build Coastguard Worker  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*0d6140beSAndroid Build Coastguard Worker  * GNU General Public License for more details.
15*0d6140beSAndroid Build Coastguard Worker  */
16*0d6140beSAndroid Build Coastguard Worker 
17*0d6140beSAndroid Build Coastguard Worker #include <stdarg.h>
18*0d6140beSAndroid Build Coastguard Worker #include <stdlib.h>
19*0d6140beSAndroid Build Coastguard Worker #include <stdio.h>
20*0d6140beSAndroid Build Coastguard Worker 
21*0d6140beSAndroid Build Coastguard Worker #include "libflashrom.h"
22*0d6140beSAndroid Build Coastguard Worker 
23*0d6140beSAndroid Build Coastguard Worker void log_rust(enum flashrom_log_level level, const char *format);
24*0d6140beSAndroid Build Coastguard Worker 
25*0d6140beSAndroid Build Coastguard Worker // LOG_LEVEL = 0 (ERROR) means no messages are printed.
26*0d6140beSAndroid Build Coastguard Worker enum flashrom_log_level current_level = 0;
27*0d6140beSAndroid Build Coastguard Worker 
log_c(enum flashrom_log_level level,const char * format,va_list ap)28*0d6140beSAndroid Build Coastguard Worker static int log_c(enum flashrom_log_level level, const char *format, va_list ap)
29*0d6140beSAndroid Build Coastguard Worker {
30*0d6140beSAndroid Build Coastguard Worker 	static char *buf = NULL;
31*0d6140beSAndroid Build Coastguard Worker 	static int len = 0;
32*0d6140beSAndroid Build Coastguard Worker 	if (level >= current_level) {
33*0d6140beSAndroid Build Coastguard Worker 		return 0;
34*0d6140beSAndroid Build Coastguard Worker 	}
35*0d6140beSAndroid Build Coastguard Worker 
36*0d6140beSAndroid Build Coastguard Worker 	va_list ap2;
37*0d6140beSAndroid Build Coastguard Worker 	va_copy(ap2, ap);
38*0d6140beSAndroid Build Coastguard Worker 	// when buf is NULL, len is zero and this will not write to buf
39*0d6140beSAndroid Build Coastguard Worker 	int req_len = vsnprintf(buf, len, format, ap2);
40*0d6140beSAndroid Build Coastguard Worker 	va_end(ap2);
41*0d6140beSAndroid Build Coastguard Worker 
42*0d6140beSAndroid Build Coastguard Worker 	if (req_len > len) {
43*0d6140beSAndroid Build Coastguard Worker 		char *new_buf = realloc(buf, req_len + 1);
44*0d6140beSAndroid Build Coastguard Worker 		if (!new_buf) {
45*0d6140beSAndroid Build Coastguard Worker 			return 0;
46*0d6140beSAndroid Build Coastguard Worker 		}
47*0d6140beSAndroid Build Coastguard Worker 		buf = new_buf;
48*0d6140beSAndroid Build Coastguard Worker 		len = req_len + 1;
49*0d6140beSAndroid Build Coastguard Worker 		req_len = vsnprintf(buf, len, format, ap);
50*0d6140beSAndroid Build Coastguard Worker 	}
51*0d6140beSAndroid Build Coastguard Worker 
52*0d6140beSAndroid Build Coastguard Worker 	if (req_len > 0) {
53*0d6140beSAndroid Build Coastguard Worker 		log_rust(level, buf);
54*0d6140beSAndroid Build Coastguard Worker 	}
55*0d6140beSAndroid Build Coastguard Worker 	return req_len;
56*0d6140beSAndroid Build Coastguard Worker }
57*0d6140beSAndroid Build Coastguard Worker 
set_log_callback()58*0d6140beSAndroid Build Coastguard Worker void set_log_callback()
59*0d6140beSAndroid Build Coastguard Worker {
60*0d6140beSAndroid Build Coastguard Worker 	flashrom_set_log_callback(log_c);
61*0d6140beSAndroid Build Coastguard Worker }
62