aboutsummaryrefslogtreecommitdiffhomepage
path: root/container/initoverlay.go
diff options
context:
space:
mode:
Diffstat (limited to 'container/initoverlay.go')
-rw-r--r--container/initoverlay.go52
1 files changed, 40 insertions, 12 deletions
diff --git a/container/initoverlay.go b/container/initoverlay.go
index 910ce425..e4cb0f5a 100644
--- a/container/initoverlay.go
+++ b/container/initoverlay.go
@@ -4,9 +4,9 @@ import (
"encoding/gob"
"fmt"
"slices"
- "strings"
"hakurei.app/check"
+ "hakurei.app/ext"
"hakurei.app/fhs"
)
@@ -150,7 +150,7 @@ func (o *MountOverlayOp) early(_ *setupState, k syscallDispatcher) error {
if v, err := k.evalSymlinks(o.Upper.String()); err != nil {
return err
} else {
- o.upper = check.EscapeOverlayDataSegment(toHost(v))
+ o.upper = toHost(v)
}
}
@@ -158,7 +158,7 @@ func (o *MountOverlayOp) early(_ *setupState, k syscallDispatcher) error {
if v, err := k.evalSymlinks(o.Work.String()); err != nil {
return err
} else {
- o.work = check.EscapeOverlayDataSegment(toHost(v))
+ o.work = toHost(v)
}
}
}
@@ -168,12 +168,39 @@ func (o *MountOverlayOp) early(_ *setupState, k syscallDispatcher) error {
if v, err := k.evalSymlinks(a.String()); err != nil {
return err
} else {
- o.lower[i] = check.EscapeOverlayDataSegment(toHost(v))
+ o.lower[i] = toHost(v)
}
}
return nil
}
+// mountOverlay sets up an overlay mount via [ext.FS].
+func mountOverlay(target string, options [][2]string) error {
+ fs, err := ext.OpenFS(SourceOverlay, 0)
+ if err != nil {
+ return err
+ }
+ if err = fs.SetString("source", SourceOverlay); err != nil {
+ _ = fs.Close()
+ return err
+ }
+ for _, option := range options {
+ if err = fs.SetString(option[0], option[1]); err != nil {
+ _ = fs.Close()
+ return err
+ }
+ }
+ if err = fs.SetFlag(OptionOverlayUserxattr); err != nil {
+ _ = fs.Close()
+ return err
+ }
+ if err = fs.Mount(target, 0); err != nil {
+ _ = fs.Close()
+ return err
+ }
+ return fs.Close()
+}
+
func (o *MountOverlayOp) apply(state *setupState, k syscallDispatcher) error {
target := o.Target.String()
if !o.noPrefix {
@@ -194,7 +221,7 @@ func (o *MountOverlayOp) apply(state *setupState, k syscallDispatcher) error {
}
}
- options := make([]string, 0, 4)
+ options := make([][2]string, 0, 2+len(o.lower))
if o.upper == zeroString && o.work == zeroString { // readonly
if len(o.Lower) < 2 {
@@ -205,15 +232,16 @@ func (o *MountOverlayOp) apply(state *setupState, k syscallDispatcher) error {
if len(o.Lower) == 0 {
return &OverlayArgumentError{OverlayEmptyLower, zeroString}
}
- options = append(options,
- OptionOverlayUpperdir+"="+o.upper,
- OptionOverlayWorkdir+"="+o.work)
+ options = append(options, [][2]string{
+ {OptionOverlayUpperdir, o.upper},
+ {OptionOverlayWorkdir, o.work},
+ }...)
+ }
+ for _, lower := range o.lower {
+ options = append(options, [2]string{OptionOverlayLowerdir + "+", lower})
}
- options = append(options,
- OptionOverlayLowerdir+"="+strings.Join(o.lower, check.SpecialOverlayPath),
- OptionOverlayUserxattr)
- return k.mount(SourceOverlay, target, FstypeOverlay, 0, strings.Join(options, check.SpecialOverlayOption))
+ return k.mountOverlay(target, options)
}
func (o *MountOverlayOp) late(*setupState, syscallDispatcher) error { return nil }