use std::{ fs::{DirBuilder, File}, io, }; use nix::{ mount::{self, MsFlags}, sched::{self, CloneFlags}, }; use serde::{Deserialize, Serialize}; use crate::util::{self, ToIOResult}; fn prepare_buildtmp() -> io::Result<()> { mount::mount::<_, _, _, str>( Some("buildtmp"), "build/tmp", Some("tmpfs"), MsFlags::empty(), None, ) .to_io_result()?; util::tar::unpack(File::open("build/rootfs.tar")?, "build/tmp/rootfs")?; DirBuilder::new().create("build/tmp/runc")?; Ok(()) } #[derive(Debug, Deserialize, Serialize)] pub enum Error { Code(i32), String(String), } impl From for Error { fn from(error: io::Error) -> Self { match error.raw_os_error() { Some(code) => Error::Code(code), None => Error::String(error.to_string()), } } } impl From for io::Error { fn from(error: Error) -> Self { match error { Error::Code(code) => io::Error::from_raw_os_error(code), Error::String(string) => io::Error::new(io::ErrorKind::Other, string), } } } pub fn runc_preinit() -> Result<(), Error> { DirBuilder::new().recursive(true).create("build/state")?; sched::unshare(CloneFlags::CLONE_NEWUSER | CloneFlags::CLONE_NEWNS).to_io_result()?; Ok(()) } pub fn runc_init() -> Result<(), Error> { prepare_buildtmp()?; Ok(()) }