mod create;
mod dir;
mod open;
mod source;
use std::{mem, num::NonZero};
use dope_sys::io::file;
use o3::base::num::bounded;
use crate::Cpus;
#[repr(transparent)]
pub struct Metadata(pub(crate) mem::MaybeUninit<libc::statx>);
impl Metadata {
pub const UNINIT: Self = Self(mem::MaybeUninit::uninit());
pub(crate) const MASK: u32 = libc::STATX_TYPE | libc::STATX_SIZE;
pub unsafe fn try_result(&self) -> Result<(file::Kind, file::Offset), file::MetadataError> {
let raw = unsafe { self.0.assume_init_ref() };
if let Some(missing) = NonZero::new(Self::MASK & !raw.stx_mask) {
return Err(file::MetadataError::Missing(missing));
}
let size =
file::Offset::new(raw.stx_size).ok_or(file::MetadataError::Overflow(raw.stx_size))?;
Ok((file::Kind::from_mode(raw.stx_mode.into()), size))
}
}
const _: () = {
assert!(mem::size_of::<Metadata>() == 256);
assert!(mem::align_of::<Metadata>() == 8);
};
pub(crate) unsafe fn cpu(index: u16) -> bounded::U32<0, { Cpus::LIMIT as u32 - 1 }> {
unsafe { bounded::raw::u32(u32::from(index)) }
}