diff options
Diffstat (limited to 'container/dispatcher.go')
| -rw-r--r-- | container/dispatcher.go | 44 |
1 files changed, 43 insertions, 1 deletions
diff --git a/container/dispatcher.go b/container/dispatcher.go index 23786b5b..710e4392 100644 --- a/container/dispatcher.go +++ b/container/dispatcher.go @@ -3,6 +3,7 @@ package container import ( "io" "io/fs" + "net" "os" "os/exec" "os/signal" @@ -12,6 +13,7 @@ import ( "hakurei.app/container/seccomp" "hakurei.app/container/std" + "hakurei.app/internal/netlink" "hakurei.app/message" ) @@ -167,7 +169,47 @@ func (k direct) mountTmpfs(fsname, target string, flags uintptr, size int, perm func (direct) ensureFile(name string, perm, pperm os.FileMode) error { return ensureFile(name, perm, pperm) } -func (direct) mustLoopback(msg message.Msg) { mustLoopback(msg) } +func (direct) mustLoopback(msg message.Msg) { + var lo int + if ifi, err := net.InterfaceByName("lo"); err != nil { + msg.GetLogger().Fatalln(err) + } else { + lo = ifi.Index + } + + c, err := netlink.DialRoute() + if err != nil { + msg.GetLogger().Fatalln(err) + } + + must := func(err error) { + if err == nil { + return + } + if closeErr := c.Close(); closeErr != nil { + msg.Verbosef("cannot close RTNETLINK: %v", closeErr) + } + + switch err.(type) { + case *os.SyscallError: + msg.GetLogger().Fatalf("cannot %v", err) + + case syscall.Errno: + msg.GetLogger().Fatalf("RTNETLINK answers: %v", err) + + default: + msg.GetLogger().Fatalf("RTNETLINK answers with malformed message") + } + } + must(c.SendNewaddrLo(uint32(lo))) + must(c.SendIfInfomsg(syscall.RTM_NEWLINK, 0, &syscall.IfInfomsg{ + Family: syscall.AF_UNSPEC, + Index: int32(lo), + Flags: syscall.IFF_UP, + Change: syscall.IFF_UP, + })) + must(c.Close()) +} func (direct) seccompLoad(rules []std.NativeRule, flags seccomp.ExportFlag) error { return seccomp.Load(rules, flags) |
