Start using function pointers

This commit is contained in:
netjaileRS 2024-09-23 18:01:59 +02:00
parent dec755a2a5
commit 769132af53
2 changed files with 17 additions and 12 deletions

View File

@ -11,5 +11,5 @@ fn main() {
//namespace::create_ns::create_ns(); //namespace::create_ns::create_ns();
let ns_name = "test-newns".to_string(); let ns_name = "test-newns".to_string();
block_on(NetworkNamespace::add(ns_name.clone())); block_on(NetworkNamespace::add(ns_name.clone()));
namespace::bind_interface::run_in_namespace(&ns_name); namespace::bind_interface::run_in_namespace(|| {namespace::bind_interface::set_lo_up().unwrap();},&ns_name);
} }

View File

@ -21,7 +21,7 @@ use std::process::exit;
use std::os::unix::io::RawFd; use std::os::unix::io::RawFd;
use std::os::fd::FromRawFd; use std::os::fd::FromRawFd;
pub fn run_in_namespace(ns_name: &String) -> Result<(), ()> { pub fn run_in_namespace<F>(f: F,ns_name: &String) -> Result<(), ()> where F:FnMut() + Copy {
// Configure networking in the child namespace: // Configure networking in the child namespace:
// Fork a process that is set to the newly created namespace // Fork a process that is set to the newly created namespace
// Here set the veth ip addr, routing tables etc. // Here set the veth ip addr, routing tables etc.
@ -34,12 +34,12 @@ pub fn run_in_namespace(ns_name: &String) -> Result<(), ()> {
unsafe { unsafe {
match clone( match clone(
Box::new(|| run_child(&ns_name.clone())), Box::new(|| run_child(f,&ns_name.clone())),
&mut tmp_stack, &mut tmp_stack,
flags, flags,
Some(Signal::SIGCHLD as i32)) { Some(Signal::SIGCHLD as i32)) {
Ok(pid) => Ok(()), Ok(_pid) => Ok(()),
Err(e) => { Err(_e) => {
return Err(()); return Err(());
} }
} }
@ -47,8 +47,8 @@ pub fn run_in_namespace(ns_name: &String) -> Result<(), ()> {
} }
fn run_child(ns_name: &String) -> isize { fn run_child<F>(mut f: F, ns_name: &String) -> isize where F:FnMut() {
let res = split_namespace(ns_name); let res = prepare_namespace(ns_name);
match res { match res {
Err(_) => { Err(_) => {
@ -57,12 +57,13 @@ fn run_child(ns_name: &String) -> isize {
} }
Ok(()) => { Ok(()) => {
log::debug!("Child exited normally"); log::debug!("Child exited normally");
f();
return 0; return 0;
} }
} }
} }
fn split_namespace(ns_name: &String) -> Result<(), ()> { fn prepare_namespace(ns_name: &String) -> Result<(), ()> {
// First create the network namespace // First create the network namespace
// NetworkNamespace::add(ns_name.to_string()).await.map_err(|e| { // NetworkNamespace::add(ns_name.to_string()).await.map_err(|e| {
// log::error!("Can not create namespace {}", e); // log::error!("Can not create namespace {}", e);
@ -114,10 +115,16 @@ fn split_namespace(ns_name: &String) -> Result<(), ()> {
// TODO do not exit for EINVAL error // TODO do not exit for EINVAL error
// unmount_path(&sys_path)?; // unmount_path(&sys_path)?;
// consider the case that a sysfs is not present // consider the case that a sysfs is not present
let stat_sys = statvfs(&sys_path) let stat_sys = match statvfs(&sys_path)
.map_err(|e| { .map_err(|e| {
log::error!("Can not stat sys: {}", e); log::error!("Can not stat sys: {}", e);
}).unwrap(); }){
Ok(stat) => stat,
Err(_e) => {
log::error!("Error in stat sys");
return Err(());
}
};
if stat_sys.flags().contains(FsFlags::ST_RDONLY) { if stat_sys.flags().contains(FsFlags::ST_RDONLY) {
mount_flags.insert(MsFlags::MS_RDONLY); mount_flags.insert(MsFlags::MS_RDONLY);
} }
@ -128,8 +135,6 @@ fn split_namespace(ns_name: &String) -> Result<(), ()> {
() ()
} }
set_lo_up().unwrap();
Ok(()) Ok(())
} }