mod builder;
mod layout;
pub(crate) mod overlay;
mod provider;
pub use builder::RootfsBuilder;
pub use layout::{GuestLayout, GUEST_WORKDIR};
pub use provider::{default_provider, CopyProvider, OverlayProvider, RootfsProvider};
use std::path::Path;
pub fn unmount_box_overlay(merged: &Path) {
for _ in 0..8 {
if !is_mountpoint(merged) {
break;
}
if overlay::overlay_unmount(merged).is_err() {
break;
}
}
}
#[cfg(target_os = "linux")]
pub(crate) fn is_mountpoint(path: &Path) -> bool {
use std::os::unix::fs::MetadataExt;
match (std::fs::metadata(path), std::fs::metadata(path.join(".."))) {
(Ok(here), Ok(parent)) => here.dev() != parent.dev(),
_ => false,
}
}
#[cfg(not(target_os = "linux"))]
pub(crate) fn is_mountpoint(_path: &Path) -> bool {
false
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn missing_path_is_not_mountpoint() {
let temp = tempfile::tempdir().unwrap();
let missing = temp.path().join("missing");
assert!(!is_mountpoint(&missing));
}
#[test]
fn unmount_overlay_noops_for_non_mountpoint() {
let temp = tempfile::tempdir().unwrap();
let merged = temp.path().join("merged");
std::fs::create_dir(&merged).unwrap();
unmount_box_overlay(&merged);
assert!(merged.exists());
}
}