package sandbox import ( "encoding/gob" "fmt" "math" "os" "path" "syscall" ) func init() { gob.Register(new(MountTmpfs)) } type MountTmpfs struct { Path string Size int Mode os.FileMode } func (t *MountTmpfs) apply() error { if !path.IsAbs(t.Path) || t.Size < 0 || t.Size > math.MaxUint>>1 { return syscall.EBADE } target := toSysroot(t.Path) if err := os.MkdirAll(target, 0755); err != nil { return err } opt := fmt.Sprintf("mode=%#o", t.Mode) if t.Size > 0 { opt += fmt.Sprintf(",size=%d", t.Mode) } return syscall.Mount("tmpfs", target, "tmpfs", syscall.MS_NOSUID|syscall.MS_NODEV, opt) } func (t *MountTmpfs) Is(op FSOp) bool { vt, ok := op.(*MountTmpfs); return ok && *t == *vt } func (t *MountTmpfs) String() string { return fmt.Sprintf("tmpfs on %q size %d", t.Path, t.Size) } func (f *Filesystem) Tmpfs(dest string, size int, mode os.FileMode) *Filesystem { *f = append(*f, &MountTmpfs{dest, size, mode}) return f }