1use crate::wireguard_nt_raw;
2use log::*;
3use widestring::U16CStr;
4
5use std::sync::atomic::{AtomicBool, Ordering};
6
7pub fn set_logger(wireguard: &crate::Wireguard, f: wireguard_nt_raw::WIREGUARD_LOGGER_CALLBACK) {
9 unsafe { wireguard.WireGuardSetLogger(f) };
10}
11
12pub enum AdapterLoggingLevel {
14 Off,
16
17 On,
19
20 OnWithPrefix,
22}
23
24static SET_LOGGER: AtomicBool = AtomicBool::new(false);
25
26#[allow(clippy::not_unsafe_ptr_arg_deref)]
28pub extern "C" fn default_logger(
29 level: wireguard_nt_raw::WIREGUARD_LOGGER_LEVEL,
30 _timestamp: wireguard_nt_raw::DWORD64,
31 message: *const wireguard_nt_raw::WCHAR,
32) {
33 if message.is_null() {
34 return;
35 }
36 let msg = unsafe { U16CStr::from_ptr_str(message) };
38 let utf8_msg = msg.to_string_lossy();
39 match level {
40 wireguard_nt_raw::WIREGUARD_LOGGER_LEVEL_WIREGUARD_LOG_INFO => {
41 info!("wireguard: {}", utf8_msg)
42 }
43 wireguard_nt_raw::WIREGUARD_LOGGER_LEVEL_WIREGUARD_LOG_WARN => {
44 warn!("wireguard: {}", utf8_msg)
45 }
46 wireguard_nt_raw::WIREGUARD_LOGGER_LEVEL_WIREGUARD_LOG_ERR => {
47 error!("wireguard: {}", utf8_msg)
48 }
49 _ => error!("wireguard: {} (with invalid log level {})", utf8_msg, level),
50 }
51}
52
53pub(crate) fn set_default_logger_if_unset(wireguard: &crate::Wireguard) {
54 if !SET_LOGGER.load(Ordering::Relaxed) {
55 set_logger(wireguard, Some(default_logger));
56 SET_LOGGER.store(true, Ordering::Relaxed);
57 }
58}