mirror of
https://github.com/criyle/go-sandbox.git
synced 2025-11-04 14:49:53 +08:00
allow bind mount file
This commit is contained in:
parent
6a91022c58
commit
f2a28034f3
@ -273,7 +273,15 @@ func (r *Runner) Start() (int, error) {
|
|||||||
// performing mounts
|
// performing mounts
|
||||||
for _, m := range r.Mounts {
|
for _, m := range r.Mounts {
|
||||||
// mkdirs(target)
|
// mkdirs(target)
|
||||||
for _, p := range m.Prefixes {
|
for i, p := range m.Prefixes {
|
||||||
|
// if target mount point is a file, mknod(target)
|
||||||
|
if i == len(m.Prefixes)-1 && m.MakeNod {
|
||||||
|
_, _, err1 = syscall.RawSyscall(syscall.SYS_MKNODAT, uintptr(_AT_FDCWD), uintptr(unsafe.Pointer(p)), 0755)
|
||||||
|
if err1 != 0 && err1 != syscall.EEXIST {
|
||||||
|
goto childerror
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
_, _, err1 = syscall.RawSyscall(syscall.SYS_MKDIRAT, uintptr(_AT_FDCWD), uintptr(unsafe.Pointer(p)), 0755)
|
_, _, err1 = syscall.RawSyscall(syscall.SYS_MKDIRAT, uintptr(_AT_FDCWD), uintptr(unsafe.Pointer(p)), 0755)
|
||||||
if err1 != 0 && err1 != syscall.EEXIST {
|
if err1 != 0 && err1 != syscall.EEXIST {
|
||||||
goto childerror
|
goto childerror
|
||||||
|
|||||||
@ -7,9 +7,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
bind = unix.MS_BIND | unix.MS_NOSUID | unix.MS_PRIVATE
|
bind = unix.MS_BIND | unix.MS_NOSUID | unix.MS_PRIVATE
|
||||||
roBind = bind | unix.MS_RDONLY
|
mFlag = unix.MS_NOSUID | unix.MS_NOATIME | unix.MS_NODEV
|
||||||
mFlag = unix.MS_NOSUID | unix.MS_NOATIME | unix.MS_NODEV
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Builder builds fork_exec friendly mount syscall format
|
// Builder builds fork_exec friendly mount syscall format
|
||||||
@ -25,9 +24,11 @@ func NewBuilder() *Builder {
|
|||||||
// Build creates sequence of syscalls for fork_exec
|
// Build creates sequence of syscalls for fork_exec
|
||||||
// skipNotExists skips bind mounts that source not exists
|
// skipNotExists skips bind mounts that source not exists
|
||||||
func (b *Builder) Build(skipNotExists bool) ([]SyscallParams, error) {
|
func (b *Builder) Build(skipNotExists bool) ([]SyscallParams, error) {
|
||||||
|
var err error
|
||||||
ret := make([]SyscallParams, 0, len(b.Mounts))
|
ret := make([]SyscallParams, 0, len(b.Mounts))
|
||||||
for _, m := range b.Mounts {
|
for _, m := range b.Mounts {
|
||||||
if err := isBindMountNotExists(m); err != nil {
|
mknod := false
|
||||||
|
if mknod, err = isBindMountFileOrNotExists(m); err != nil {
|
||||||
if skipNotExists {
|
if skipNotExists {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@ -37,18 +38,21 @@ func (b *Builder) Build(skipNotExists bool) ([]SyscallParams, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
sp.MakeNod = mknod
|
||||||
ret = append(ret, *sp)
|
ret = append(ret, *sp)
|
||||||
}
|
}
|
||||||
return ret, nil
|
return ret, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func isBindMountNotExists(m Mount) error {
|
func isBindMountFileOrNotExists(m Mount) (bool, error) {
|
||||||
if m.Flags&unix.MS_BIND == unix.MS_BIND {
|
if m.Flags&unix.MS_BIND == unix.MS_BIND {
|
||||||
if _, err := os.Stat(m.Source); os.IsNotExist(err) {
|
if fi, err := os.Stat(m.Source); os.IsNotExist(err) {
|
||||||
return err
|
return false, err
|
||||||
|
} else if !fi.IsDir() {
|
||||||
|
return true, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithMounts add mounts to builder
|
// WithMounts add mounts to builder
|
||||||
@ -67,7 +71,7 @@ func (b *Builder) WithMount(m Mount) *Builder {
|
|||||||
func (b *Builder) WithBind(source, target string, readonly bool) *Builder {
|
func (b *Builder) WithBind(source, target string, readonly bool) *Builder {
|
||||||
var flags uintptr = bind
|
var flags uintptr = bind
|
||||||
if readonly {
|
if readonly {
|
||||||
flags = roBind
|
flags |= unix.MS_RDONLY
|
||||||
}
|
}
|
||||||
b.Mounts = append(b.Mounts, Mount{
|
b.Mounts = append(b.Mounts, Mount{
|
||||||
Source: source,
|
Source: source,
|
||||||
|
|||||||
@ -15,6 +15,7 @@ type SyscallParams struct {
|
|||||||
Source, Target, FsType, Data *byte
|
Source, Target, FsType, Data *byte
|
||||||
Flags uintptr
|
Flags uintptr
|
||||||
Prefixes []*byte
|
Prefixes []*byte
|
||||||
|
MakeNod bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToSyscall convert Mount to SyscallPrams
|
// ToSyscall convert Mount to SyscallPrams
|
||||||
@ -65,10 +66,10 @@ func pathPrefix(path string) []string {
|
|||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
// arrayPtrFromStrings converts srings to c style strings
|
// arrayPtrFromStrings converts strings to c style strings
|
||||||
func arrayPtrFromStrings(strs []string) ([]*byte, error) {
|
func arrayPtrFromStrings(str []string) ([]*byte, error) {
|
||||||
bytes := make([]*byte, 0, len(strs))
|
bytes := make([]*byte, 0, len(str))
|
||||||
for _, s := range strs {
|
for _, s := range str {
|
||||||
b, err := syscall.BytePtrFromString(s)
|
b, err := syscall.BytePtrFromString(s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user