linux: Adds Persistent Devs + Setting Owner/Group

This commit is contained in:
Matthew Ellison 2017-05-22 15:49:13 -04:00
parent 70591d2499
commit ad8a32dbd3
No known key found for this signature in database
GPG key ID: A815A44BDC8DD409
2 changed files with 75 additions and 4 deletions

View file

@ -10,8 +10,22 @@ type PlatformSpecificParams struct {
// field, i.e. an empty string, indicates that the default name should be
// used.
Name string
// Enable or disable persistence mode for the interface device.
Persist bool
// ID of the user which will be granted ownership of the device.
// The default value of -1 specifies that any user may use the device.
Owner int
// ID of the group which will be granted access to the device.
// The default value of -1 specifies that any group may use the device.
Group int
}
func defaultPlatformSpecificParams() PlatformSpecificParams {
return PlatformSpecificParams{}
return PlatformSpecificParams{
Owner: -1,
Group: -1,
}
}

View file

@ -21,6 +21,14 @@ type ifReq struct {
pad [0x28 - 0x10 - 2]byte
}
func ioctl(fd uintptr, request int, argp uintptr) error {
_, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), uintptr(request), argp)
if errno != 0 {
return os.NewSyscallError("ioctl", errno)
}
return nil
}
func newTAP(config Config) (ifce *Interface, err error) {
file, err := os.OpenFile("/dev/net/tun", os.O_RDWR, 0)
if err != nil {
@ -30,6 +38,26 @@ func newTAP(config Config) (ifce *Interface, err error) {
if err != nil {
return nil, err
}
// Set Device Owner
if config.Owner >= 0 {
if err = ioctl(file.Fd(), syscall.TUNSETOWNER, uintptr(config.Owner)); err != nil {
return
}
}
// Set Device Group
if config.Group >= 0 {
if err = ioctl(file.Fd(), syscall.TUNSETGROUP, uintptr(config.Group)); err != nil {
return
}
}
// Set/Clear Persist Device Flag
if err = setPersistence(file.Fd(), config.Persist); err != nil {
return
}
ifce = &Interface{isTAP: true, ReadWriteCloser: file, name: name}
return
}
@ -43,6 +71,26 @@ func newTUN(config Config) (ifce *Interface, err error) {
if err != nil {
return nil, err
}
// Set Device Owner
if config.Owner >= 0 {
if err = ioctl(file.Fd(), syscall.TUNSETOWNER, uintptr(config.Owner)); err != nil {
return
}
}
// Set Device Group
if config.Group >= 0 {
if err = ioctl(file.Fd(), syscall.TUNSETGROUP, uintptr(config.Group)); err != nil {
return
}
}
// Set/Clear Persist Device Flag
if err = setPersistence(file.Fd(), config.Persist); err != nil {
return
}
ifce = &Interface{isTAP: false, ReadWriteCloser: file, name: name}
return
}
@ -51,11 +99,20 @@ func createInterface(fd uintptr, ifName string, flags uint16) (createdIFName str
var req ifReq
req.Flags = flags
copy(req.Name[:], ifName)
_, _, errno := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(syscall.TUNSETIFF), uintptr(unsafe.Pointer(&req)))
if errno != 0 {
err = errno
err = ioctl(fd, syscall.TUNSETIFF, uintptr(unsafe.Pointer(&req)))
if err != nil {
return
}
createdIFName = strings.Trim(string(req.Name[:]), "\x00")
return
}
func setPersistence(fd uintptr, enabled bool) error {
value := 0;
if enabled {
value = 1
}
return ioctl(fd, syscall.TUNSETPERSIST, uintptr(value))
}