lxc 0.4.3

Linux Containers API
extern crate lxc;

use std::os::unix::io::AsRawFd;

fn main() -> std::io::Result<()> {
    let c =
        lxc::Container::new("apicontainer", None).expect("Failed to setup lxc_container struct");

    if c.is_defined() {
        panic!("Container already exists");
    }

    c.create(
        "download",
        None,
        None,
        ::lxc::CreateFlags::QUIET,
        &["-d", "centos", "-r", "7", "-a", "amd64"],
    )
    .expect("Failed to create container rootfs");

    c.start(false, &[]).expect("Failed to start the container");

    let mut options = lxc::attach::Options {
        attach_flags: 0,
        env_policy: 0,
        extra_env_vars: std::ptr::null_mut(),
        gid: 0,
        uid: 0,
        extra_keep_env: std::ptr::null_mut(),
        initial_cwd: std::ptr::null_mut(),
        #[cfg(feature = "v3_0")]
        log_fd: std::io::stdout().as_raw_fd(),
        stdout_fd: std::io::stdout().as_raw_fd(),
        stderr_fd: std::io::stderr().as_raw_fd(),
        stdin_fd: std::io::stdin().as_raw_fd(),
        namespaces: -1,
        personality: -1,
    };
    let prog = "/bin/ps";
    let args = [prog, "auxw"];
    let r = c.attach_run_wait(&mut options, prog, &args);
    match r {
        Err(e) => println!("Error: {}", e),
        Ok(s) => println!("Ok, waitpid() status={}", s),
    }

    c.stop().expect("Failed to kill the container.");
    c.destroy().expect("Failed to destroy the container.");

    Ok(())
}