go-sandbox/pkg/mount/mount.go
2019-10-15 22:32:50 -07:00

81 lines
1.7 KiB
Go

package mount
import (
"syscall"
)
// Mount defines syscall for mount points
type Mount struct {
Source, Target, FsType, Data string
Flags uintptr
}
// SyscallParams defines the raw syscall arguments to mount
type SyscallParams struct {
Source, Target, FsType, Data *byte
Flags uintptr
Prefixes []*byte
MakeNod bool
}
// ToSyscall convert Mount to SyscallPrams
func (m *Mount) ToSyscall() (*SyscallParams, error) {
var data *byte
source, err := syscall.BytePtrFromString(m.Source)
if err != nil {
return nil, err
}
target, err := syscall.BytePtrFromString(m.Target)
if err != nil {
return nil, err
}
fsType, err := syscall.BytePtrFromString(m.FsType)
if err != nil {
return nil, err
}
if m.Data != "" {
data, err = syscall.BytePtrFromString(m.Data)
if err != nil {
return nil, err
}
}
prefix := pathPrefix(m.Target)
paths, err := arrayPtrFromStrings(prefix)
if err != nil {
return nil, err
}
return &SyscallParams{
Source: source,
Target: target,
FsType: fsType,
Flags: m.Flags,
Data: data,
Prefixes: paths,
}, nil
}
// pathPrefix get all components from path
func pathPrefix(path string) []string {
ret := make([]string, 0)
for i := 1; i < len(path); i++ {
if path[i] == '/' {
ret = append(ret, path[:i])
}
}
ret = append(ret, path)
return ret
}
// arrayPtrFromStrings converts strings to c style strings
func arrayPtrFromStrings(str []string) ([]*byte, error) {
bytes := make([]*byte, 0, len(str))
for _, s := range str {
b, err := syscall.BytePtrFromString(s)
if err != nil {
return nil, err
}
bytes = append(bytes, b)
}
return bytes, nil
}