// +build linux

package namespaces

import (
	"os"
	"syscall"

	"github.com/docker/libcontainer"
)

type initError struct {
	Message string `json:"message,omitempty"`
}

func (i initError) Error() string {
	return i.Message
}

var namespaceInfo = map[libcontainer.NamespaceType]int{
	libcontainer.NEWNET:  syscall.CLONE_NEWNET,
	libcontainer.NEWNS:   syscall.CLONE_NEWNS,
	libcontainer.NEWUSER: syscall.CLONE_NEWUSER,
	libcontainer.NEWIPC:  syscall.CLONE_NEWIPC,
	libcontainer.NEWUTS:  syscall.CLONE_NEWUTS,
	libcontainer.NEWPID:  syscall.CLONE_NEWPID,
}

// New returns a newly initialized Pipe for communication between processes
func newInitPipe() (parent *os.File, child *os.File, err error) {
	fds, err := syscall.Socketpair(syscall.AF_LOCAL, syscall.SOCK_STREAM|syscall.SOCK_CLOEXEC, 0)
	if err != nil {
		return nil, nil, err
	}
	return os.NewFile(uintptr(fds[1]), "parent"), os.NewFile(uintptr(fds[0]), "child"), nil
}

// GetNamespaceFlags parses the container's Namespaces options to set the correct
// flags on clone, unshare. This functions returns flags only for new namespaces.
func GetNamespaceFlags(namespaces libcontainer.Namespaces) (flag int) {
	for _, v := range namespaces {
		if v.Path != "" {
			continue
		}
		flag |= namespaceInfo[v.Type]
	}
	return flag
}