use std::ffi::CString;
use std::io;
pub fn make_private_workspace(workspace_path: &str) -> io::Result<()> {
let root = CString::new("/").expect("static");
let none = CString::new("none").expect("static");
let rc = unsafe {
libc::mount(
none.as_ptr(),
root.as_ptr(),
std::ptr::null(),
libc::MS_PRIVATE | libc::MS_REC,
std::ptr::null(),
)
};
if rc != 0 {
return Err(io::Error::last_os_error());
}
let ws =
CString::new(workspace_path).map_err(|e| io::Error::new(io::ErrorKind::InvalidInput, e))?;
let _ = unsafe { libc::mkdir(ws.as_ptr(), 0o755) };
let tmpfs = CString::new("tmpfs").expect("static");
let rc = unsafe {
libc::mount(
tmpfs.as_ptr(),
ws.as_ptr(),
tmpfs.as_ptr(),
libc::MS_NODEV | libc::MS_NOSUID,
std::ptr::null(),
)
};
if rc != 0 {
return Err(io::Error::last_os_error());
}
Ok(())
}