aboutsummaryrefslogtreecommitdiffhomepage
path: root/container/initbind.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2025-08-25 23:24:54 +0900
committerOphestra <cat@gensokyo.uk>2025-08-26 00:44:45 +0900
commit2e0a4795f6a0016832d8fc51884abce4d01a8a58 (patch)
treed899110e4ff3ac1cc65a2f09ee8d99dac97fee8f /container/initbind.go
parentc328b584c0449e846f8d49976df65fce657c2a67 (diff)
container/initbind: optional ensure host directory
This is used for ensuring persistent data directories specific to the container. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'container/initbind.go')
-rw-r--r--container/initbind.go16
1 files changed, 14 insertions, 2 deletions
diff --git a/container/initbind.go b/container/initbind.go
index 18f44936..bda8cb6c 100644
--- a/container/initbind.go
+++ b/container/initbind.go
@@ -23,8 +23,6 @@ type BindMountOp struct {
Flags int
}
-func (b *BindMountOp) Valid() bool { return b != nil && b.Source != nil && b.Target != nil }
-
const (
// BindOptional skips nonexistent host paths.
BindOptional = 1 << iota
@@ -32,9 +30,23 @@ const (
BindWritable
// BindDevice allows access to devices (special files) on this filesystem.
BindDevice
+ // BindEnsure attempts to create the host path if it does not exist.
+ BindEnsure
)
+func (b *BindMountOp) Valid() bool {
+ return b != nil &&
+ b.Source != nil && b.Target != nil &&
+ b.Flags&(BindOptional|BindEnsure) != (BindOptional|BindEnsure)
+}
+
func (b *BindMountOp) early(_ *setupState, k syscallDispatcher) error {
+ if b.Flags&BindEnsure != 0 {
+ if err := k.mkdirAll(b.Source.String(), 0700); err != nil {
+ return wrapErrSelf(err)
+ }
+ }
+
if pathname, err := k.evalSymlinks(b.Source.String()); err != nil {
if os.IsNotExist(err) && b.Flags&BindOptional != 0 {
// leave sourceFinal as nil