use safa_abi::{
errors::ErrorStatus,
ffi::slice::Slice,
fs::{DirEntry, FileAttr},
};
use crate::syscalls::types::{OptionalPtrMut, RequiredPtrMut, Ri};
use super::{define_syscall, err_from_u16, SyscallNum};
#[cfg(not(feature = "rustc-dep-of-std"))]
extern crate alloc;
define_syscall! {
SyscallNum::SysFDirIterOpen =>
{
sysdiriter_open(dir_ri: Ri, dest_ri: RequiredPtrMut<Ri>)
},
SyscallNum::SysDirIterNext => {
sysdiriter_next(dir_ri: Ri, dest_direntry: OptionalPtrMut<DirEntry>)
}
}
#[inline]
pub fn diriter_open(dir_ri: Ri) -> Result<Ri, ErrorStatus> {
let mut dest_fd: usize = 0xAAAAAAAAAAAAAAAAusize;
let ptr = unsafe { RequiredPtrMut::new_unchecked(&raw mut dest_fd) };
err_from_u16!(sysdiriter_open(dir_ri, ptr), dest_fd)
}
#[inline]
pub fn diriter_next(dir_ri: Ri) -> Result<DirEntry, ErrorStatus> {
let mut dest_direntry: DirEntry = unsafe { core::mem::zeroed() };
let ptr = RequiredPtrMut::new(&raw mut dest_direntry).into();
err_from_u16!(sysdiriter_next(dir_ri, ptr), dest_direntry)
}
define_syscall! {
SyscallNum::SysIOWrite => {
syswrite(fd: Ri, offset: isize, buf: Slice<u8>, dest_wrote: OptionalPtrMut<usize>)
},
SyscallNum::SysIOTruncate => {
systruncate(fd: Ri, len: usize)
},
SyscallNum::SysFSize => {
sysfsize(fd: Ri, dest_size: OptionalPtrMut<usize>)
},
SyscallNum::SysFAttrs => {
sysfattrs(fd: Ri, dest_attrs: OptionalPtrMut<FileAttr>)
},
SyscallNum::SysIORead => {
sysread(fd: Ri, offset: isize, buf: Slice<u8>, dest_read: OptionalPtrMut<usize>)
},
SyscallNum::SysIOSync => {
syssync(ri: Ri)
},
}
#[inline]
pub fn write(fd: Ri, offset: isize, buf: &[u8]) -> Result<usize, ErrorStatus> {
let mut dest_wrote = 0;
let dest_wrote_ptr = RequiredPtrMut::new(&raw mut dest_wrote).into();
let slice = Slice::from_slice(buf);
err_from_u16!(syswrite(fd, offset, slice, dest_wrote_ptr), dest_wrote)
}
#[inline]
pub fn truncate(fd: Ri, len: usize) -> Result<(), ErrorStatus> {
err_from_u16!(systruncate(fd, len))
}
#[inline]
pub fn fsize(fd: Ri) -> Result<usize, ErrorStatus> {
let mut dest_size = 0;
let ptr = RequiredPtrMut::new(&raw mut dest_size).into();
err_from_u16!(sysfsize(fd, ptr), dest_size)
}
#[inline]
pub fn fattrs(fd: Ri) -> Result<FileAttr, ErrorStatus> {
let mut attrs: FileAttr = unsafe { core::mem::zeroed() };
let ptr = RequiredPtrMut::new(&raw mut attrs).into();
err_from_u16!(sysfattrs(fd, ptr), attrs)
}
#[inline]
pub fn read(fd: Ri, offset: isize, buf: &mut [u8]) -> Result<Ri, ErrorStatus> {
let mut dest_read = 0;
let dest_read_ptr = RequiredPtrMut::new(&raw mut dest_read).into();
let slice = Slice::from_slice(buf);
err_from_u16!(sysread(fd, offset, slice, dest_read_ptr), dest_read)
}
#[inline]
pub fn sync(ri: Ri) -> Result<(), ErrorStatus> {
err_from_u16!(syssync(ri))
}