aboutsummaryrefslogtreecommitdiffhomepage
path: root/container/initremount.go
diff options
context:
space:
mode:
Diffstat (limited to 'container/initremount.go')
-rw-r--r--container/initremount.go34
1 files changed, 34 insertions, 0 deletions
diff --git a/container/initremount.go b/container/initremount.go
new file mode 100644
index 00000000..2b290af0
--- /dev/null
+++ b/container/initremount.go
@@ -0,0 +1,34 @@
+package container
+
+import (
+ "encoding/gob"
+ "fmt"
+ "syscall"
+)
+
+func init() { gob.Register(new(RemountOp)) }
+
+// Remount appends an [Op] that applies [RemountOp.Flags] on container path [RemountOp.Target].
+func (f *Ops) Remount(target *Absolute, flags uintptr) *Ops {
+ *f = append(*f, &RemountOp{target, flags})
+ return f
+}
+
+// RemountOp remounts Target with Flags.
+type RemountOp struct {
+ Target *Absolute
+ Flags uintptr
+}
+
+func (*RemountOp) early(*setupState) error { return nil }
+func (r *RemountOp) apply(*setupState) error {
+ if r.Target == nil {
+ return syscall.EBADE
+ }
+ return wrapErrSuffix(hostProc.remount(toSysroot(r.Target.String()), r.Flags),
+ fmt.Sprintf("cannot remount %q:", r.Target))
+}
+
+func (r *RemountOp) Is(op Op) bool { vr, ok := op.(*RemountOp); return ok && *r == *vr }
+func (*RemountOp) prefix() string { return "remounting" }
+func (r *RemountOp) String() string { return fmt.Sprintf("%q flags %#x", r.Target, r.Flags) }