use core::marker::PhantomData;
use num_enum::{IntoPrimitive, TryFromPrimitive};
use crate::GuestPhysAddr;
pub use crate::parameters::*;
pub use crate::v1::parameters::{CloseParams, OpenParams, UnlinkParams};
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct WriteParams {
pub len: u64,
pub ret: i64,
pub buf: GuestPhysAddr,
pub fd: i32,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct ReadParams {
pub len: u64,
pub ret: i64,
pub buf: GuestPhysAddr,
pub fd: i32,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct LseekParams {
pub offset: i64,
pub whence: u32,
pub fd: i32,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct SerialWriteBufferParams {
pub len: u64,
pub buf: GuestPhysAddr,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct SerialReadBufferParams {
pub maxlen: u64,
pub len: u64,
pub buf: GuestPhysAddr,
}
#[derive(TryFromPrimitive, IntoPrimitive, PartialEq, Eq, Clone, Copy, Debug)]
#[repr(u8)]
pub enum FileType {
Unknown = 0, Fifo = 1, CharacterDevice = 2, Directory = 4, BlockDevice = 6, RegularFile = 8, SymbolicLink = 10, Socket = 12, Whiteout = 14, }
#[repr(C)]
pub struct Dirent64 {
pub d_ino: u64,
pub d_off: i64,
pub d_reclen: u16,
pub d_type: FileType,
pub d_name: PhantomData<u8>,
}
#[derive(Debug, Copy, Clone)]
#[repr(C)]
pub enum GetdentResult {
None,
Success(u64),
EndOfDirectory,
Error(i32),
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct GetdentParams {
pub fd: i32,
pub buf: GuestPhysAddr,
pub len: u64,
pub ret: GetdentResult,
}
#[derive(Debug, Copy, Clone)]
#[repr(C)]
pub enum MkdirResult {
None,
Success,
Error(i32),
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct MkdirParams {
pub path: GuestPhysAddr,
pub len: u64,
pub ret: MkdirResult,
}
#[derive(TryFromPrimitive, IntoPrimitive, PartialEq, Eq, Clone, Copy, Debug)]
#[repr(u32)]
pub enum StatKind {
Stat = 0,
LStat = 1,
}
#[repr(C)]
#[derive(Debug, Copy, Clone, Default, PartialEq, Eq)]
pub struct Timespec {
pub tv_sec: i64,
pub tv_nsec: i32,
}
impl Timespec {
pub fn from_nsecs(secs: i64, nsecs: i64) -> Option<Self> {
nsecs.try_into().ok().map(|nsec| Self {
tv_sec: secs,
tv_nsec: nsec,
})
}
}
#[repr(C)]
#[derive(Debug, Copy, Clone, Default, PartialEq, Eq)]
pub struct FileAttr {
pub st_dev: u64,
pub st_ino: u64,
pub st_nlink: u64,
pub st_mode: u32,
pub st_uid: u32,
pub st_gid: u32,
pub st_rdev: u64,
pub st_size: i64,
pub st_blksize: i64,
pub st_blocks: i64,
pub st_atim: Timespec,
pub st_mtim: Timespec,
pub st_ctim: Timespec,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[repr(C)]
pub enum StatResult {
None,
Success,
Error(i32),
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct StatParams {
pub name: GuestPhysAddr,
pub kind: StatKind,
pub attr: GuestPhysAddr,
pub ret: StatResult,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct FstatParams {
pub fd: i32,
pub attr: GuestPhysAddr,
pub ret: StatResult,
}