|
1 | | -use std::{ |
2 | | - os::raw::{c_char, c_short, c_void}, |
3 | | - sync::Once, |
4 | | -}; |
5 | | - |
6 | | -use log::{Metadata, Record}; |
7 | | - |
8 | | -use crate::ffi_helpers::string_to_c_char; |
9 | | - |
| 1 | +use std::os::raw::{c_char, c_short, c_void}; |
10 | 2 | #[allow(non_camel_case_types)] |
11 | 3 | pub type redirectionio_log_callback = extern "C" fn(*const c_char, *const c_void, c_short); |
12 | 4 |
|
13 | | -pub struct CallbackLogger { |
14 | | - pub callback: Option<redirectionio_log_callback>, |
15 | | - pub data: Option<&'static c_void>, |
16 | | -} |
17 | | - |
18 | | -impl log::Log for CallbackLogger { |
19 | | - fn enabled(&self, _metadata: &Metadata) -> bool { |
20 | | - true |
21 | | - } |
22 | | - |
23 | | - fn log(&self, record: &Record) { |
24 | | - if self.callback.is_none() { |
25 | | - return; |
26 | | - } |
27 | | - |
28 | | - if self.data.is_none() { |
29 | | - return; |
30 | | - } |
31 | | - |
32 | | - if self.enabled(record.metadata()) { |
33 | | - let log_str = format!("{} - {}", record.level(), record.args()); |
34 | | - let cstr = string_to_c_char(log_str); |
35 | | - |
36 | | - (self.callback.unwrap())(cstr, self.data.unwrap(), record.level() as i16); |
37 | | - } |
38 | | - } |
39 | | - |
40 | | - fn flush(&self) {} |
| 5 | +#[unsafe(no_mangle)] |
| 6 | +pub unsafe extern "C" fn redirectionio_log_init_with_callback(_callback: redirectionio_log_callback, _data: &'static c_void) { |
| 7 | + // do nothing |
| 8 | + // bc layer |
41 | 9 | } |
42 | 10 |
|
43 | | -static INIT: Once = Once::new(); |
44 | | - |
45 | 11 | #[unsafe(no_mangle)] |
46 | | -pub unsafe extern "C" fn redirectionio_log_init_with_callback(callback: redirectionio_log_callback, data: &'static c_void) { |
47 | | - let logger = CallbackLogger { |
48 | | - callback: Some(callback), |
49 | | - data: Some(data), |
50 | | - }; |
51 | | - |
52 | | - INIT.call_once(|| { |
53 | | - log::set_boxed_logger(Box::new(logger)) |
54 | | - .map(|()| log::set_max_level(log::LevelFilter::Trace)) |
55 | | - .expect("cannot set logger"); |
56 | | - }); |
| 12 | +pub unsafe extern "C" fn redirectionio_trace_init() { |
| 13 | + if let Err(e) = tracing_subscriber::fmt::try_init() { |
| 14 | + eprintln!("[redirectionio] unable to set global default subscriber: {e}"); |
| 15 | + } |
57 | 16 | } |
0 commit comments