aboutsummaryrefslogtreecommitdiffhomepage
path: root/container/dispatcher.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2026-03-16 23:32:42 +0900
committerOphestra <cat@gensokyo.uk>2026-03-16 23:33:52 +0900
commit08c35ca24fabc41268411cec14ea386a6d87ece9 (patch)
tree2889ef6931666dbd7048f3e8b2902804081c929c /container/dispatcher.go
parent72bd3fb05ef796e04e3b61015f6ffac3c1a937e3 (diff)
container: use new netlink implementation
This is adapted from the container netlink implementation and is much more reusable. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'container/dispatcher.go')
-rw-r--r--container/dispatcher.go44
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)