netns: add support for specifying network namespace by path

This commit is contained in:
ginuerzh 2024-07-08 10:59:03 +08:00
parent 13c9e3ba97
commit 949c98adc0
2 changed files with 23 additions and 6 deletions

View File

@ -175,9 +175,15 @@ func ParseService(cfg *config.ServiceConfig) (service.Service, error) {
} }
defer netns.Set(originNs) defer netns.Set(originNs)
ns, err := netns.GetFromName(netnsIn) var ns netns.NsHandle
if strings.HasPrefix(netnsIn, "/") {
ns, err = netns.GetFromPath(netnsIn)
} else {
ns, err = netns.GetFromName(netnsIn)
}
if err != nil { if err != nil {
return nil, fmt.Errorf("netns.GetFromName(%s): %v", netnsIn, err) return nil, fmt.Errorf("netns.Get(%s): %v", netnsIn, err)
} }
defer ns.Close() defer ns.Close()

View File

@ -5,6 +5,7 @@ import (
"fmt" "fmt"
"net" "net"
"runtime" "runtime"
"strings"
"syscall" "syscall"
"github.com/vishvananda/netns" "github.com/vishvananda/netns"
@ -48,9 +49,14 @@ func (lc *ListenConfig) Listen(ctx context.Context, network, address string) (ne
} }
defer netns.Set(originNs) defer netns.Set(originNs)
ns, err := netns.GetFromName(lc.Netns) var ns netns.NsHandle
if strings.HasPrefix(lc.Netns, "/") {
ns, err = netns.GetFromPath(lc.Netns)
} else {
ns, err = netns.GetFromName(lc.Netns)
}
if err != nil { if err != nil {
return nil, fmt.Errorf("netns.GetFromName(%s): %v", lc.Netns, err) return nil, fmt.Errorf("netns.Get(%s): %v", lc.Netns, err)
} }
defer ns.Close() defer ns.Close()
@ -73,9 +79,14 @@ func (lc *ListenConfig) ListenPacket(ctx context.Context, network, address strin
} }
defer netns.Set(originNs) defer netns.Set(originNs)
ns, err := netns.GetFromName(lc.Netns) var ns netns.NsHandle
if strings.HasPrefix(lc.Netns, "/") {
ns, err = netns.GetFromPath(lc.Netns)
} else {
ns, err = netns.GetFromName(lc.Netns)
}
if err != nil { if err != nil {
return nil, fmt.Errorf("netns.GetFromName(%s): %v", lc.Netns, err) return nil, fmt.Errorf("netns.Get(%s): %v", lc.Netns, err)
} }
defer ns.Close() defer ns.Close()