nmstate/
lib.rs

1// SPDX-License-Identifier: Apache-2.0
2
3#[cfg(feature = "query_apply")]
4mod apply;
5#[cfg(feature = "query_apply")]
6mod checkpoint;
7mod format;
8#[cfg(feature = "gen_conf")]
9mod gen_conf;
10#[cfg(feature = "query_apply")]
11mod gen_diff;
12mod logger;
13#[cfg(feature = "query_apply")]
14mod policy;
15#[cfg(feature = "query_apply")]
16mod query;
17mod state;
18
19use std::ffi::CString;
20
21use libc::{c_char, c_int};
22use nmstate::NmstateError;
23use once_cell::sync::OnceCell;
24
25use crate::logger::MemoryLogger;
26
27#[cfg(feature = "query_apply")]
28pub use crate::apply::nmstate_net_state_apply;
29#[cfg(feature = "query_apply")]
30pub use crate::checkpoint::{
31    nmstate_checkpoint_commit, nmstate_checkpoint_rollback,
32};
33#[cfg(feature = "gen_conf")]
34pub use crate::gen_conf::nmstate_generate_configurations;
35#[cfg(feature = "query_apply")]
36pub use crate::policy::nmstate_net_state_from_policy;
37#[cfg(feature = "query_apply")]
38pub use crate::query::nmstate_net_state_retrieve;
39
40pub(crate) const NMSTATE_PASS: c_int = 0;
41pub(crate) const NMSTATE_FAIL: c_int = 1;
42
43pub use crate::format::nmstate_net_state_format;
44
45static INSTANCE: OnceCell<MemoryLogger> = OnceCell::new();
46
47#[allow(clippy::not_unsafe_ptr_arg_deref)]
48#[no_mangle]
49pub extern "C" fn nmstate_cstring_free(cstring: *mut c_char) {
50    unsafe {
51        if !cstring.is_null() {
52            drop(CString::from_raw(cstring));
53        }
54    }
55}
56
57pub(crate) fn init_logger() -> Result<&'static MemoryLogger, NmstateError> {
58    match INSTANCE.get() {
59        Some(l) => {
60            l.add_consumer();
61            Ok(l)
62        }
63        None => {
64            if INSTANCE.set(MemoryLogger::new()).is_err() {
65                return Err(NmstateError::new(
66                    nmstate::ErrorKind::Bug,
67                    "Failed to set once_sync for logger".to_string(),
68                ));
69            }
70            if let Some(l) = INSTANCE.get() {
71                if let Err(e) = log::set_logger(l) {
72                    Err(NmstateError::new(
73                        nmstate::ErrorKind::Bug,
74                        format!("Failed to log::set_logger: {e}"),
75                    ))
76                } else {
77                    l.add_consumer();
78                    log::set_max_level(log::LevelFilter::Debug);
79                    Ok(l)
80                }
81            } else {
82                Err(NmstateError::new(
83                    nmstate::ErrorKind::Bug,
84                    "Failed to get logger from once_sync".to_string(),
85                ))
86            }
87        }
88    }
89}