use safa_abi::{
errors::ErrorStatus,
ffi::str::Str,
fs::{DirEntry, OpenOptions},
};
use super::SyscallNum;
use super::{define_syscall, err_from_u16};
use crate::syscalls::types::{OptionalPtrMut, RequiredPtr, RequiredPtrMut, Ri};
define_syscall!(SyscallNum::SysFGetDirEntry => {
sysgetdirentry(path: Str, dest_direntry: OptionalPtrMut<DirEntry>)
});
#[inline]
pub fn getdirentry(path: &str) -> Result<DirEntry, ErrorStatus> {
let mut dest_direntry: DirEntry = unsafe { core::mem::zeroed() };
let ptr = RequiredPtrMut::new(&raw mut dest_direntry).into();
err_from_u16!(sysgetdirentry(Str::from_str(path), ptr), dest_direntry)
}
define_syscall! {
SyscallNum::SysFSOpenAll => {
sysopen_all(path: Str, dest_fd: RequiredPtr<Ri>)
},
SyscallNum::SysFSOpen => {
sysopen(path: Str, options: OpenOptions, dest_fd: RequiredPtrMut<Ri>)
},
SyscallNum::SysFSCreate => {
syscreate_file(path: Str)
},
SyscallNum::SysFSCreateDir => {
syscreate_dir(path: Str)
},
SyscallNum::SysFSRemovePath => {
sysremove_path(path: Str)
},
}
#[inline]
pub fn open_all(path: &str) -> Result<Ri, ErrorStatus> {
let mut dest_fd = 0xAAAAAAAAAAAAAAAAusize;
let ptr = unsafe { RequiredPtrMut::new_unchecked(&raw mut dest_fd) };
err_from_u16!(sysopen_all(Str::from_str(path), ptr), dest_fd)
}
#[inline]
pub fn open(path: &str, options: OpenOptions) -> Result<Ri, ErrorStatus> {
let mut dest_fd = 0xAAAAAAAAAAAAAAAAusize;
let ptr = unsafe { RequiredPtrMut::new_unchecked(&raw mut dest_fd) };
err_from_u16!(sysopen(Str::from_str(path), options, ptr), dest_fd)
}
#[inline]
pub fn create(path: &str) -> Result<(), ErrorStatus> {
err_from_u16!(syscreate_file(Str::from_str(path)))
}
#[inline]
pub fn createdir(path: &str) -> Result<(), ErrorStatus> {
err_from_u16!(syscreate_dir(Str::from_str(path)))
}
#[inline]
pub fn remove_path(path: &str) -> Result<(), ErrorStatus> {
err_from_u16!(sysremove_path(Str::from_str(path)))
}