use crate::syscalls::types::{OptionalPtrMut, RequiredPtrMut};
use super::{define_syscall, err_from_u16, SyscallNum};
#[cfg(not(feature = "rustc-dep-of-std"))]
extern crate alloc;
define_syscall! {
SyscallNum::SysPCHDir => {
syschdir(buf: Str)
},
SyscallNum::SysPGetCWD => {
sysgetcwd(cwd: Slice<u8>, dest_len: OptionalPtrMut<usize>)
}
}
#[inline]
pub fn chdir(path: &str) -> Result<(), ErrorStatus> {
err_from_u16!(syschdir(Str::from_str(path)))
}
use alloc::string::String;
use alloc::vec::Vec;
use safa_abi::errors::ErrorStatus;
use safa_abi::ffi::slice::Slice;
use safa_abi::ffi::str::Str;
#[inline]
pub fn getcwd() -> Result<String, ErrorStatus> {
let mut buffer = Vec::with_capacity(safa_abi::consts::MAX_PATH_LENGTH);
unsafe {
buffer.set_len(buffer.capacity());
}
let mut dest_len: usize = 0xAAAAAAAAAAAAAAAAusize;
let ptr = RequiredPtrMut::new(&raw mut dest_len).into();
let len = err_from_u16!(sysgetcwd(Slice::from_slice(&buffer), ptr), dest_len)?;
buffer.truncate(len);
unsafe { Ok(String::from_utf8_unchecked(buffer)) }
}