#[cfg(unix)]
use super::super::Error;
#[cfg(unix)]
use std::path::{Path, PathBuf};
#[cfg(unix)]
pub fn find_mountpoint_pre_canonicalized(path: &Path) -> Result<&Path, Error> {
use std::fs::symlink_metadata;
use std::os::unix::fs::MetadataExt;
let mut lstats = symlink_metadata(path)?;
let start_dev = lstats.dev();
let mut mountpoint = path;
loop {
let current = match mountpoint.parent() {
Some(p) => p,
None => return Ok(mountpoint),
};
lstats = symlink_metadata(current)?;
if lstats.dev() != start_dev {
break;
}
mountpoint = current;
}
assert!(path.starts_with(mountpoint));
assert!(!mountpoint.as_os_str().is_empty());
Ok(mountpoint)
}
#[cfg(unix)]
pub fn find_mountpoint(path: &Path) -> Result<PathBuf, Error> {
let canonicalized = path.canonicalize()?;
let found = find_mountpoint_pre_canonicalized(canonicalized.as_path())?;
Ok(found.to_path_buf())
}