You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
subgraph-oz/ns/ns.go

87 lines
1.6 KiB

package ns
import (
"errors"
"os"
"path"
"strconv"
"syscall"
)
type Namespace struct {
Path string
Type uintptr
}
const (
CLONE_NEWNS = syscall.CLONE_NEWNS
CLONE_NEWUTS = syscall.CLONE_NEWUTS
CLONE_NEWIPC = syscall.CLONE_NEWIPC
CLONE_NEWNET = syscall.CLONE_NEWNET
CLONE_NEWUSER = syscall.CLONE_NEWUSER
CLONE_NEWPID = syscall.CLONE_NEWPID
)
var (
Types []Namespace
)
func init() {
Types = []Namespace{
Namespace{Path: "ns/user", Type: syscall.CLONE_NEWUSER},
Namespace{Path: "ns/ipc", Type: syscall.CLONE_NEWIPC},
Namespace{Path: "ns/uts", Type: syscall.CLONE_NEWUTS},
Namespace{Path: "ns/net", Type: syscall.CLONE_NEWNET},
Namespace{Path: "ns/pid", Type: syscall.CLONE_NEWPID},
Namespace{Path: "ns/mnt", Type: syscall.CLONE_NEWNS},
}
}
func Set(fd, nsType uintptr) error {
_, _, err := syscall.Syscall(SYS_SETNS, uintptr(fd), uintptr(nsType), 0)
if err != 0 {
return errors.New("Unable to set namespace")
}
return nil
}
func GetPath(pid int, nsType uintptr) (string, error) {
var nsPath string
for _, n := range Types {
if n.Type == nsType {
nsPath = path.Join("/", "proc", strconv.Itoa(pid), n.Path)
break
}
}
if nsPath == "" {
return "", errors.New("Unable to find namespace type")
}
return nsPath, nil
}
func OpenProcess(pid int, nsType uintptr) (uintptr, error) {
nsPath, err := GetPath(pid, nsType)
if err != nil {
return 0, err
}
return Open(nsPath)
}
func Open(nsPath string) (uintptr, error) {
fd, err := os.Open(nsPath)
if err != nil {
return 0, err
}
return fd.Fd(), nil
}
func Close(fd uintptr) error {
return syscall.Close(int(fd))
}