1use safa_abi::{
2 errors::ErrorStatus,
3 ffi::slice::Slice,
4 fs::{DirEntry, FileAttr},
5};
6
7use crate::syscalls::types::{OptionalPtrMut, RequiredPtrMut, Ri};
8
9use super::{define_syscall, err_from_u16, SyscallNum};
10
11#[cfg(not(feature = "rustc-dep-of-std"))]
12extern crate alloc;
13
14define_syscall! {
16 SyscallNum::SysFDirIterOpen =>
17 {
18 sysdiriter_open(dir_ri: Ri, dest_ri: RequiredPtrMut<Ri>)
20 },
21 SyscallNum::SysDirIterNext => {
22 sysdiriter_next(dir_ri: Ri, dest_direntry: OptionalPtrMut<DirEntry>)
30 }
31}
32
33#[inline]
34pub fn diriter_open(dir_ri: Ri) -> Result<Ri, ErrorStatus> {
39 let mut dest_fd: usize = 0xAAAAAAAAAAAAAAAAusize;
40 let ptr = unsafe { RequiredPtrMut::new_unchecked(&raw mut dest_fd) };
41 err_from_u16!(sysdiriter_open(dir_ri, ptr), dest_fd)
42}
43
44#[inline]
45pub fn diriter_next(dir_ri: Ri) -> Result<DirEntry, ErrorStatus> {
49 let mut dest_direntry: DirEntry = unsafe { core::mem::zeroed() };
50 let ptr = RequiredPtrMut::new(&raw mut dest_direntry).into();
51 err_from_u16!(sysdiriter_next(dir_ri, ptr), dest_direntry)
52}
53
54define_syscall! {
56 SyscallNum::SysIOWrite => {
57 syswrite(fd: Ri, offset: isize, buf: Slice<u8>, dest_wrote: OptionalPtrMut<usize>)
61 },
62 SyscallNum::SysIOTruncate => {
63 systruncate(fd: Ri, len: usize)
65 },
66 SyscallNum::SysFSize => {
67 sysfsize(fd: Ri, dest_size: OptionalPtrMut<usize>)
69 },
70 SyscallNum::SysFAttrs => {
71 sysfattrs(fd: Ri, dest_attrs: OptionalPtrMut<FileAttr>)
73 },
74 SyscallNum::SysIORead => {
75 sysread(fd: Ri, offset: isize, buf: Slice<u8>, dest_read: OptionalPtrMut<usize>)
79 },
80 SyscallNum::SysIOSync => {
81 syssync(ri: Ri)
83 },
84}
85
86#[inline]
87pub fn write(fd: Ri, offset: isize, buf: &[u8]) -> Result<usize, ErrorStatus> {
90 let mut dest_wrote = 0;
91 let dest_wrote_ptr = RequiredPtrMut::new(&raw mut dest_wrote).into();
92 let slice = Slice::from_slice(buf);
93
94 err_from_u16!(syswrite(fd, offset, slice, dest_wrote_ptr), dest_wrote)
95}
96
97#[inline]
98pub fn truncate(fd: Ri, len: usize) -> Result<(), ErrorStatus> {
100 err_from_u16!(systruncate(fd, len))
101}
102
103#[inline]
104pub fn fsize(fd: Ri) -> Result<usize, ErrorStatus> {
106 let mut dest_size = 0;
107 let ptr = RequiredPtrMut::new(&raw mut dest_size).into();
108 err_from_u16!(sysfsize(fd, ptr), dest_size)
109}
110
111#[inline]
112pub fn fattrs(fd: Ri) -> Result<FileAttr, ErrorStatus> {
114 let mut attrs: FileAttr = unsafe { core::mem::zeroed() };
115 let ptr = RequiredPtrMut::new(&raw mut attrs).into();
116 err_from_u16!(sysfattrs(fd, ptr), attrs)
117}
118
119#[inline]
120pub fn read(fd: Ri, offset: isize, buf: &mut [u8]) -> Result<Ri, ErrorStatus> {
122 let mut dest_read = 0;
123 let dest_read_ptr = RequiredPtrMut::new(&raw mut dest_read).into();
124 let slice = Slice::from_slice(buf);
125 err_from_u16!(sysread(fd, offset, slice, dest_read_ptr), dest_read)
126}
127
128#[inline]
129pub fn sync(ri: Ri) -> Result<(), ErrorStatus> {
131 err_from_u16!(syssync(ri))
132}