safa_api/syscalls/
process_misc.rs1use crate::syscalls::types::{OptionalPtrMut, StrPtr, StrPtrMut};
2
3use super::{define_syscall, err_from_u16, SyscallNum};
4
5#[cfg(not(feature = "rustc-dep-of-std"))]
6extern crate alloc;
7
8define_syscall! {
9 SyscallNum::SysSbrk => {
10 syssbrk(size: isize, target_ptr: OptionalPtrMut<*mut u8>)
12 },
13 SyscallNum::SysCHDir => {
14 syschdir(buf_ptr: StrPtr, buf_len: usize)
17 },
18 SyscallNum::SysGetCWD => {
19 sysgetcwd(cwd_buf: StrPtrMut, cwd_buf_len: usize, dest_len: OptionalPtrMut<usize>)
24 }
25}
26
27#[inline]
28pub fn sbrk(size: isize) -> Result<*mut u8, ErrorStatus> {
33 let mut target_ptr: *mut u8 = core::ptr::null_mut();
34 err_from_u16!(syssbrk(size, &mut target_ptr), target_ptr)
35}
36
37#[inline]
38pub fn chdir(path: &str) -> Result<(), ErrorStatus> {
40 let path = path.as_bytes();
41 err_from_u16!(syschdir(path.as_ptr(), path.len()))
42}
43
44use alloc::string::String;
45use alloc::vec::Vec;
46use safa_abi::errors::ErrorStatus;
47
48#[inline]
49pub fn getcwd() -> Result<String, ErrorStatus> {
51 let mut buffer = Vec::with_capacity(safa_abi::consts::MAX_PATH_LENGTH);
52 unsafe {
53 buffer.set_len(buffer.capacity());
54 }
55
56 let mut dest_len: usize = 0xAAAAAAAAAAAAAAAAusize;
57 let len = err_from_u16!(
58 sysgetcwd(buffer.as_mut_ptr(), buffer.len(), &raw mut dest_len),
59 dest_len
60 )?;
61
62 buffer.truncate(len);
63 unsafe { Ok(String::from_utf8_unchecked(buffer)) }
64}