aboutsummaryrefslogtreecommitdiffhomepage
path: root/container/initoverlay.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2025-08-29 02:56:56 +0900
committerOphestra <cat@gensokyo.uk>2025-08-29 02:56:56 +0900
commit905b9f9785263297611a61facc8b6bdf4c3e257f (patch)
tree07a1724005486f2bb2b02da2c2ca3ebe4215dc15 /container/initoverlay.go
parent1c7e634f09f6644faf611477dc0e223d9b0b4ecb (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.go40
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,