use alloc::{boxed::Box, sync::Arc};
use ax_lazyinit::OnceLock;
use super::BindSlot;
use crate::{NetError, NetResult};
pub trait UnixNamespace: Send + Sync {
fn resolve(&self, path: &str) -> NetResult<Arc<BindSlot>>;
fn bind(&self, path: &str) -> NetResult<Arc<BindSlot>>;
fn unbind(&self, path: &str) -> NetResult<()>;
}
static UNIX_NS: OnceLock<Box<dyn UnixNamespace>> = OnceLock::new();
pub fn register_unix_namespace(ns: impl UnixNamespace + 'static) {
UNIX_NS.call_once(|| Box::new(ns));
}
pub(crate) fn with_namespace<R>(
f: impl FnOnce(&dyn UnixNamespace) -> NetResult<R>,
) -> NetResult<R> {
match UNIX_NS.get() {
Some(ns) => f(&**ns),
None => Err(NetError::Unsupported),
}
}