use std::fmt::Display; use nix::mount::{mount, MsFlags}; use crate::log::logger; pub fn mount_sysfs() -> nix::Result<()>{ let flag = MsFlags::MS_NODEV .union(MsFlags::MS_NOEXEC) .union(MsFlags::MS_NOSUID); mount(Some("sysfs"),"/sys",Some("sysfs"),flag, Some("nodev,noexec,nosuid")) } pub fn mount_proc() -> nix::Result<()>{ let flag = MsFlags::MS_NODEV .union(MsFlags::MS_NOEXEC) .union(MsFlags::MS_NOSUID); mount(Some("proc"),"/proc",Some("proc"),flag, Some("nodev,noexec,nosuid")) } pub fn mount_devtmpfs(target: &str, size: T1, mode: T2) -> nix::Result<()> where T1: Display, T2: Display { let flag = MsFlags::empty(); let option = format!("size={}, mode={}", size, mode); mount(Some("udev"),target,Some("devtmpfs"),flag, Some(option.as_str())) } pub fn mount_runfs(opt: &str) -> nix::Result<()> { let flag = MsFlags::MS_NOSUID; //let flag = MsFlags::empty(); let option = if opt.is_empty(){ "".to_string() }else{ format!("{}", opt) }; mount(Some("tmpfs"),"/run",Some("tmpfs"),flag, Some(option.as_str())) } pub fn mount_custom(src: Option<&str>, target: &str, fstype: Option<&str>, opt: Option<&str>, flag: MsFlags) -> nix::Result<()> { mount(src, target,fstype,flag, opt) } pub fn move_mount(src: &str, target: &str) -> nix::Result<()>{ let flag = MsFlags::MS_MOVE; mount(Some(src),target,None as Option<&str>,flag, Some("move")) } pub fn convert_flag_from_string_vec(flags: &Option>, fsname: &str) -> MsFlags { let mut flag_val = MsFlags::empty(); match flags { None => { flag_val } Some(flag_list) => { for fstr in flag_list { match fstr.as_str() { "bind" => { flag_val = flag_val.union(MsFlags::MS_REC) } "rbind" => {} "ro" => { flag_val = flag_val.union(MsFlags::MS_RDONLY) } "rw" => {} "nosuid" => { flag_val = flag_val.union(MsFlags::MS_NOSUID) } "suid" => {} "nodev" => { flag_val = flag_val.union(MsFlags::MS_NODEV) } "dev" => {} "noexec" => { flag_val = flag_val.union(MsFlags::MS_NOEXEC) } "exec" => {} "sync" => { flag_val = flag_val.union(MsFlags::MS_SYNCHRONOUS) } "async" => {} "noatime" => { flag_val = flag_val.union(MsFlags::MS_NOATIME) } "atime" => {} "realtime" => { flag_val = flag_val.union(MsFlags::MS_RELATIME) } "norealtime" => {} "nodiratime" => { flag_val = flag_val.union(MsFlags::MS_NODIRATIME) } "diratime" => {} "silent" => { flag_val = flag_val.union(MsFlags::MS_SILENT) } "loud" => {} "shared" => { flag_val = flag_val.union(MsFlags::MS_SHARED) } "rshared" => { flag_val = flag_val.union(MsFlags::MS_SHARED).union(MsFlags::MS_REC) } "slave" => { flag_val = flag_val.union(MsFlags::MS_SLAVE) } "rslave" => { flag_val = flag_val.union(MsFlags::MS_SLAVE).union(MsFlags::MS_REC) } "private" => { flag_val = flag_val.union(MsFlags::MS_PRIVATE) } "rprivate" => { flag_val = flag_val.union(MsFlags::MS_PRIVATE).union(MsFlags::MS_REC) } "unbindable" => { flag_val = flag_val.union(MsFlags::MS_UNBINDABLE) } "runbindable" => { flag_val = flag_val.union(MsFlags::MS_UNBINDABLE).union(MsFlags::MS_REC) } "remount" => { flag_val = flag_val.union(MsFlags::MS_REMOUNT) } "move" => { flag_val = flag_val.union(MsFlags::MS_MOVE) } _ => { logger().warn("mount", format!("unknown flag name '{}' for mounting '{}'", fstr, fsname).as_str()); } } } flag_val } } }