diff options
Diffstat (limited to 'container/initoverlay.go')
| -rw-r--r-- | container/initoverlay.go | 52 |
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 } |
