| #![forbid(unsafe_op_in_unsafe_fn)] |
| |
| use crate::ffi::{CStr, OsString}; |
| use crate::io; |
| use crate::os::wasi::prelude::*; |
| use crate::path::{self, PathBuf}; |
| use crate::sys::helpers::run_path_with_cstr; |
| |
| pub fn getcwd() -> io::Result<PathBuf> { |
| let mut buf = Vec::with_capacity(512); |
| loop { |
| unsafe { |
| let ptr = buf.as_mut_ptr() as *mut libc::c_char; |
| if !libc::getcwd(ptr, buf.capacity()).is_null() { |
| let len = CStr::from_ptr(buf.as_ptr() as *const libc::c_char).to_bytes().len(); |
| buf.set_len(len); |
| buf.shrink_to_fit(); |
| return Ok(PathBuf::from(OsString::from_vec(buf))); |
| } else { |
| let error = io::Error::last_os_error(); |
| if error.raw_os_error() != Some(libc::ERANGE) { |
| return Err(error); |
| } |
| } |
| |
| // Trigger the internal buffer resizing logic of `Vec` by requiring |
| // more space than the current capacity. |
| let cap = buf.capacity(); |
| buf.set_len(cap); |
| buf.reserve(1); |
| } |
| } |
| } |
| |
| pub fn chdir(p: &path::Path) -> io::Result<()> { |
| let result = run_path_with_cstr(p, &|p| unsafe { Ok(libc::chdir(p.as_ptr())) })?; |
| match result == (0 as libc::c_int) { |
| true => Ok(()), |
| false => Err(io::Error::last_os_error()), |
| } |
| } |
| |
| pub fn temp_dir() -> PathBuf { |
| panic!("not supported by WASI yet") |
| } |