aboutsummaryrefslogtreecommitdiffhomepage
path: root/container/initdev.go
diff options
context:
space:
mode:
Diffstat (limited to 'container/initdev.go')
-rw-r--r--container/initdev.go37
1 files changed, 17 insertions, 20 deletions
diff --git a/container/initdev.go b/container/initdev.go
index 48d70f37..b3192912 100644
--- a/container/initdev.go
+++ b/container/initdev.go
@@ -3,10 +3,8 @@ package container
import (
"encoding/gob"
"fmt"
- "os"
"path"
. "syscall"
- "unsafe"
)
func init() { gob.Register(new(MountDevOp)) }
@@ -33,21 +31,21 @@ type MountDevOp struct {
Write bool
}
-func (d *MountDevOp) Valid() bool { return d != nil && d.Target != nil }
-func (d *MountDevOp) early(*setupState) error { return nil }
-func (d *MountDevOp) apply(state *setupState) error {
+func (d *MountDevOp) Valid() bool { return d != nil && d.Target != nil }
+func (d *MountDevOp) early(*setupState, syscallDispatcher) error { return nil }
+func (d *MountDevOp) apply(state *setupState, k syscallDispatcher) error {
target := toSysroot(d.Target.String())
- if err := mountTmpfs(SourceTmpfsDevtmpfs, target, MS_NOSUID|MS_NODEV, 0, state.ParentPerm); err != nil {
+ if err := k.mountTmpfs(SourceTmpfsDevtmpfs, target, MS_NOSUID|MS_NODEV, 0, state.ParentPerm); err != nil {
return err
}
for _, name := range []string{"null", "zero", "full", "random", "urandom", "tty"} {
targetPath := path.Join(target, name)
- if err := ensureFile(targetPath, 0444, state.ParentPerm); err != nil {
+ if err := k.ensureFile(targetPath, 0444, state.ParentPerm); err != nil {
return err
}
- if err := hostProc.bindMount(
+ if err := k.bindMount(
toHost(FHSDev+name),
targetPath,
0,
@@ -57,7 +55,7 @@ func (d *MountDevOp) apply(state *setupState) error {
}
}
for i, name := range []string{"stdin", "stdout", "stderr"} {
- if err := os.Symlink(
+ if err := k.symlink(
FHSProc+"self/fd/"+string(rune(i+'0')),
path.Join(target, name),
); err != nil {
@@ -69,34 +67,33 @@ func (d *MountDevOp) apply(state *setupState) error {
{FHSProc + "kcore", "core"},
{"pts/ptmx", "ptmx"},
} {
- if err := os.Symlink(pair[0], path.Join(target, pair[1])); err != nil {
+ if err := k.symlink(pair[0], path.Join(target, pair[1])); err != nil {
return wrapErrSelf(err)
}
}
devPtsPath := path.Join(target, "pts")
for _, name := range []string{path.Join(target, "shm"), devPtsPath} {
- if err := os.Mkdir(name, state.ParentPerm); err != nil {
+ if err := k.mkdir(name, state.ParentPerm); err != nil {
return wrapErrSelf(err)
}
}
- if err := Mount(SourceDevpts, devPtsPath, FstypeDevpts, MS_NOSUID|MS_NOEXEC,
+ if err := k.mount(SourceDevpts, devPtsPath, FstypeDevpts, MS_NOSUID|MS_NOEXEC,
"newinstance,ptmxmode=0666,mode=620"); err != nil {
return wrapErrSuffix(err,
fmt.Sprintf("cannot mount devpts on %q:", devPtsPath))
}
if state.RetainSession {
- var buf [8]byte
- if _, _, errno := Syscall(SYS_IOCTL, 1, TIOCGWINSZ, uintptr(unsafe.Pointer(&buf[0]))); errno == 0 {
+ if k.isatty(Stdout) {
consolePath := path.Join(target, "console")
- if err := ensureFile(consolePath, 0444, state.ParentPerm); err != nil {
+ if err := k.ensureFile(consolePath, 0444, state.ParentPerm); err != nil {
return err
}
- if name, err := os.Readlink(hostProc.stdout()); err != nil {
+ if name, err := k.readlink(hostProc.stdout()); err != nil {
return wrapErrSelf(err)
- } else if err = hostProc.bindMount(
+ } else if err = k.bindMount(
toHost(name),
consolePath,
0,
@@ -109,10 +106,10 @@ func (d *MountDevOp) apply(state *setupState) error {
if d.Mqueue {
mqueueTarget := path.Join(target, "mqueue")
- if err := os.Mkdir(mqueueTarget, state.ParentPerm); err != nil {
+ if err := k.mkdir(mqueueTarget, state.ParentPerm); err != nil {
return wrapErrSelf(err)
}
- if err := Mount(SourceMqueue, mqueueTarget, FstypeMqueue, MS_NOSUID|MS_NOEXEC|MS_NODEV, zeroString); err != nil {
+ if err := k.mount(SourceMqueue, mqueueTarget, FstypeMqueue, MS_NOSUID|MS_NOEXEC|MS_NODEV, zeroString); err != nil {
return wrapErrSuffix(err, "cannot mount mqueue:")
}
}
@@ -120,7 +117,7 @@ func (d *MountDevOp) apply(state *setupState) error {
if d.Write {
return nil
}
- return wrapErrSuffix(hostProc.remount(target, MS_RDONLY),
+ return wrapErrSuffix(k.remount(target, MS_RDONLY),
fmt.Sprintf("cannot remount %q:", target))
}