From a650a34fc3a424075c48ec9d88b4d77bf1735fe4 Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Thu, 8 Jan 2026 23:47:52 +0100 Subject: [PATCH] f-10: code: add function to call a function in a netns #10 Signed-off-by: GnomeZworc --- internal/netns/call.go | 5 ++++ internal/netns/call_linux.go | 44 ++++++++++++++++++++++++++++++++++++ internal/netns/call_other.go | 7 ++++++ 3 files changed, 56 insertions(+) create mode 100644 internal/netns/call.go create mode 100644 internal/netns/call_linux.go create mode 100644 internal/netns/call_other.go diff --git a/internal/netns/call.go b/internal/netns/call.go new file mode 100644 index 0000000..da326fd --- /dev/null +++ b/internal/netns/call.go @@ -0,0 +1,5 @@ +package netns + +func Call(name string, fn func() error) error { + return call(name, fn) +} diff --git a/internal/netns/call_linux.go b/internal/netns/call_linux.go new file mode 100644 index 0000000..b23ac19 --- /dev/null +++ b/internal/netns/call_linux.go @@ -0,0 +1,44 @@ +//go:build linux + +package netns + +import ( + "fmt" + "os" + "runtime" + + "golang.org/x/sys/unix" +) + +func call(name string, fn func() error) error { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + // sauvegarde du netns courant + orig, err := os.Open("/proc/self/ns/net") + if err != nil { + return err + } + defer orig.Close() + + // entrer dans le netns cible + f, err := os.Open(fmt.Sprintf("/var/run/netns/%s", name)) + if err != nil { + return err + } + defer f.Close() + + if err := unix.Setns(int(f.Fd()), unix.CLONE_NEWNET); err != nil { + return err + } + + // exécuter la fonction dans le netns + err = fn() + + // toujours revenir au netns d'origine + if restoreErr := unix.Setns(int(orig.Fd()), unix.CLONE_NEWNET); restoreErr != nil { + return restoreErr + } + + return err +} diff --git a/internal/netns/call_other.go b/internal/netns/call_other.go new file mode 100644 index 0000000..14a8924 --- /dev/null +++ b/internal/netns/call_other.go @@ -0,0 +1,7 @@ +//go:build !linux + +package netns + +func call(name string, fn func() error) error { + return fn() +}