use crate::{Errno, NixPath, Result};
use libc::c_int;
libc_bitflags!(
pub struct MntFlags: c_int {
MNT_NODEV;
MNT_CPROTECT;
MNT_QUARANTINE;
MNT_LOCAL;
MNT_QUOTA;
MNT_ROOTFS;
MNT_DONTBROWSE;
MNT_IGNORE_OWNERSHIP;
MNT_AUTOMOUNTED;
MNT_JOURNALED;
MNT_NOUSERXATTR;
MNT_DEFWRITE;
MNT_NOBLOCK;
MNT_EXPORTED;
MNT_ASYNC;
MNT_FORCE;
MNT_MULTILABEL;
MNT_NOATIME;
MNT_NOEXEC;
MNT_NOSUID;
MNT_RDONLY;
MNT_RELOAD;
MNT_SNAPSHOT;
MNT_SYNCHRONOUS;
MNT_UNION;
MNT_UPDATE;
}
);
pub fn mount<
P1: ?Sized + NixPath,
P2: ?Sized + NixPath,
P3: ?Sized + NixPath,
>(
source: &P1,
target: &P2,
flags: MntFlags,
data: Option<&P3>,
) -> Result<()> {
let res = source.with_nix_path(|s| {
target.with_nix_path(|t| {
crate::with_opt_nix_path(data, |d| unsafe {
libc::mount(
s.as_ptr(),
t.as_ptr(),
flags.bits(),
d.cast_mut().cast(),
)
})
})
})???;
Errno::result(res).map(drop)
}
pub fn unmount<P>(target: &P, flags: MntFlags) -> Result<()>
where
P: ?Sized + NixPath,
{
let res = target.with_nix_path(|cstr| unsafe {
libc::unmount(cstr.as_ptr(), flags.bits())
})?;
Errno::result(res).map(drop)
}