From 769132af531e3d6a80981b04475dce68c162a616 Mon Sep 17 00:00:00 2001 From: netjaileRS Date: Mon, 23 Sep 2024 18:01:59 +0200 Subject: [PATCH] Start using function pointers --- src/main.rs | 2 +- src/namespace/bind_interface.rs | 27 ++++++++++++++++----------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/main.rs b/src/main.rs index 3340774..ee61c8c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,5 +11,5 @@ fn main() { //namespace::create_ns::create_ns(); let ns_name = "test-newns".to_string(); 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); } diff --git a/src/namespace/bind_interface.rs b/src/namespace/bind_interface.rs index 0618ae0..4710224 100644 --- a/src/namespace/bind_interface.rs +++ b/src/namespace/bind_interface.rs @@ -21,7 +21,7 @@ use std::process::exit; use std::os::unix::io::RawFd; use std::os::fd::FromRawFd; -pub fn run_in_namespace(ns_name: &String) -> Result<(), ()> { +pub fn run_in_namespace(f: F,ns_name: &String) -> Result<(), ()> where F:FnMut() + Copy { // Configure networking in the child namespace: // Fork a process that is set to the newly created namespace // Here set the veth ip addr, routing tables etc. @@ -34,12 +34,12 @@ pub fn run_in_namespace(ns_name: &String) -> Result<(), ()> { unsafe { match clone( - Box::new(|| run_child(&ns_name.clone())), + Box::new(|| run_child(f,&ns_name.clone())), &mut tmp_stack, flags, Some(Signal::SIGCHLD as i32)) { - Ok(pid) => Ok(()), - Err(e) => { + Ok(_pid) => Ok(()), + Err(_e) => { return Err(()); } } @@ -47,8 +47,8 @@ pub fn run_in_namespace(ns_name: &String) -> Result<(), ()> { } -fn run_child(ns_name: &String) -> isize { - let res = split_namespace(ns_name); +fn run_child(mut f: F, ns_name: &String) -> isize where F:FnMut() { + let res = prepare_namespace(ns_name); match res { Err(_) => { @@ -57,12 +57,13 @@ fn run_child(ns_name: &String) -> isize { } Ok(()) => { log::debug!("Child exited normally"); + f(); return 0; } } } -fn split_namespace(ns_name: &String) -> Result<(), ()> { +fn prepare_namespace(ns_name: &String) -> Result<(), ()> { // First create the network namespace // NetworkNamespace::add(ns_name.to_string()).await.map_err(|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 // unmount_path(&sys_path)?; // 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| { 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) { mount_flags.insert(MsFlags::MS_RDONLY); } @@ -128,8 +135,6 @@ fn split_namespace(ns_name: &String) -> Result<(), ()> { () } - set_lo_up().unwrap(); - Ok(()) }