#![forbid(unsafe_code)]
use crate::{error::Error, syscalls::unstable, Handle};
use std::{fs::File, path::Path};
pub mod kernel;
pub mod user;
bitflags! {
#[derive(Default)]
pub struct ResolverFlags: u64 {
const NO_SYMLINKS = unstable::RESOLVE_NO_SYMLINKS;
}
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum ResolverBackend {
Kernel,
Emulated,
}
lazy_static! {
static ref DEFAULT_RESOLVER_TYPE: ResolverBackend = if *kernel::IS_SUPPORTED {
ResolverBackend::Kernel
} else {
ResolverBackend::Emulated
};
}
impl Default for ResolverBackend {
fn default() -> Self {
*DEFAULT_RESOLVER_TYPE
}
}
impl ResolverBackend {
pub fn supported(self) -> bool {
match self {
ResolverBackend::Kernel => *kernel::IS_SUPPORTED,
ResolverBackend::Emulated => true,
}
}
}
#[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]
pub struct Resolver {
pub backend: ResolverBackend,
pub flags: ResolverFlags,
}
impl Resolver {
#[inline]
pub(crate) fn resolve<P: AsRef<Path>>(&self, root: &File, path: P) -> Result<Handle, Error> {
match self.backend {
ResolverBackend::Kernel => kernel::resolve(root, path, self.flags),
ResolverBackend::Emulated => user::resolve(root, path, self.flags),
}
}
}