diff options
| author | Ophestra <cat@gensokyo.uk> | 2025-08-29 02:56:56 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2025-08-29 02:56:56 +0900 |
| commit | 905b9f9785263297611a61facc8b6bdf4c3e257f (patch) | |
| tree | 07a1724005486f2bb2b02da2c2ca3ebe4215dc15 /container/initoverlay.go | |
| parent | 1c7e634f09f6644faf611477dc0e223d9b0b4ecb (diff) | |
container/initoverlay: invalid argument type
This eliminates generic WrapErr from overlay.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'container/initoverlay.go')
| -rw-r--r-- | container/initoverlay.go | 40 |
1 files changed, 36 insertions, 4 deletions
diff --git a/container/initoverlay.go b/container/initoverlay.go index f9daaaa0..c3f1c590 100644 --- a/container/initoverlay.go +++ b/container/initoverlay.go @@ -3,7 +3,6 @@ package container import ( "encoding/gob" "fmt" - "io/fs" "slices" "strings" ) @@ -19,6 +18,39 @@ const ( func init() { gob.Register(new(MountOverlayOp)) } +const ( + // OverlayEphemeralUnexpectedUpper is set when [MountOverlayOp.Work] is nil + // and [MountOverlayOp.Upper] holds an unexpected value. + OverlayEphemeralUnexpectedUpper = iota + // OverlayReadonlyLower is set when [MountOverlayOp.Lower] contains less than + // two entries when mounting readonly. + OverlayReadonlyLower + // OverlayEmptyLower is set when [MountOverlayOp.Lower] has length of zero. + OverlayEmptyLower +) + +// OverlayArgumentError is returned for [MountOverlayOp] supplied with invalid argument. +type OverlayArgumentError struct { + Type uintptr + Value string +} + +func (e *OverlayArgumentError) Error() string { + switch e.Type { + case OverlayEphemeralUnexpectedUpper: + return fmt.Sprintf("upperdir has unexpected value %q", e.Value) + + case OverlayReadonlyLower: + return "readonly overlay requires at least two lowerdir" + + case OverlayEmptyLower: + return "overlay requires at least one lowerdir" + + default: + return fmt.Sprintf("invalid overlay argument error %#x", e.Type) + } +} + // Overlay appends an [Op] that mounts the overlay pseudo filesystem on [MountOverlayOp.Target]. func (f *Ops) Overlay(target, state, work *Absolute, layers ...*Absolute) *Ops { *f = append(*f, &MountOverlayOp{ @@ -89,7 +121,7 @@ func (o *MountOverlayOp) early(_ *setupState, k syscallDispatcher) error { o.ephemeral = true // intermediate root not yet available default: - return msg.WrapErr(fs.ErrInvalid, fmt.Sprintf("upperdir has unexpected value %q", o.Upper)) + return &OverlayArgumentError{OverlayEphemeralUnexpectedUpper, o.Upper.String()} } } // readonly handled in apply @@ -152,12 +184,12 @@ func (o *MountOverlayOp) apply(state *setupState, k syscallDispatcher) error { if o.upper == zeroString && o.work == zeroString { // readonly if len(o.Lower) < 2 { - return msg.WrapErr(fs.ErrInvalid, "readonly overlay requires at least two lowerdir") + return &OverlayArgumentError{OverlayReadonlyLower, zeroString} } // "upperdir=" and "workdir=" may be omitted. In that case the overlay will be read-only } else { if len(o.Lower) == 0 { - return msg.WrapErr(fs.ErrInvalid, "overlay requires at least one lowerdir") + return &OverlayArgumentError{OverlayEmptyLower, zeroString} } options = append(options, OptionOverlayUpperdir+"="+o.upper, |
