1#[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}