]> Cypherpunks repositories - gostls13.git/commitdiff
net: implement netbsd sockoptip
authorJoel Sing <jsing@google.com>
Wed, 15 Aug 2012 14:44:20 +0000 (00:44 +1000)
committerJoel Sing <jsing@google.com>
Wed, 15 Aug 2012 14:44:20 +0000 (00:44 +1000)
Provide sockoptip for NetBSD, based on sockoptip for OpenBSD.

R=golang-dev, rsc, mikioh.mikioh, minux.ma
CC=golang-dev
https://golang.org/cl/6308053

src/pkg/net/sockoptip_netbsd.go

index 446d92aa343ae9fdb2d9d26bc47036ac1713fdcf..ace99b0c0f31225318f90478b2af951a32efac4c 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
+// Copyright 2011 The Go Authors.  All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
@@ -6,34 +6,85 @@
 
 package net
 
-import "syscall"
+import (
+       "os"
+       "syscall"
+)
 
 func ipv4MulticastInterface(fd *netFD) (*Interface, error) {
-       // TODO: Implement this
-       return nil, syscall.EAFNOSUPPORT
+       if err := fd.incref(false); err != nil {
+               return nil, err
+       }
+       defer fd.decref()
+       a, err := syscall.GetsockoptInet4Addr(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_IF)
+       if err != nil {
+               return nil, os.NewSyscallError("getsockopt", err)
+       }
+       return ipv4AddrToInterface(IPv4(a[0], a[1], a[2], a[3]))
 }
 
 func setIPv4MulticastInterface(fd *netFD, ifi *Interface) error {
-       // TODO: Implement this
-       return syscall.EAFNOSUPPORT
+       ip, err := interfaceToIPv4Addr(ifi)
+       if err != nil {
+               return os.NewSyscallError("setsockopt", err)
+       }
+       var x [4]byte
+       copy(x[:], ip.To4())
+       if err := fd.incref(false); err != nil {
+               return err
+       }
+       defer fd.decref()
+       err = syscall.SetsockoptInet4Addr(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_IF, x)
+       if err != nil {
+               return os.NewSyscallError("setsockopt", err)
+       }
+       return nil
 }
 
 func ipv4MulticastLoopback(fd *netFD) (bool, error) {
-       // TODO: Implement this
-       return false, syscall.EAFNOSUPPORT
+       if err := fd.incref(false); err != nil {
+               return false, err
+       }
+       defer fd.decref()
+       v, err := syscall.GetsockoptByte(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_LOOP)
+       if err != nil {
+               return false, os.NewSyscallError("getsockopt", err)
+       }
+       return v == 1, nil
 }
 
 func setIPv4MulticastLoopback(fd *netFD, v bool) error {
-       // TODO: Implement this
-       return syscall.EAFNOSUPPORT
+       if err := fd.incref(false); err != nil {
+               return err
+       }
+       defer fd.decref()
+       err := syscall.SetsockoptByte(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_LOOP, byte(boolint(v)))
+       if err != nil {
+               return os.NewSyscallError("setsockopt", err)
+       }
+       return nil
 }
 
 func ipv4ReceiveInterface(fd *netFD) (bool, error) {
-       // TODO: Implement this
-       return false, syscall.EAFNOSUPPORT
+       if err := fd.incref(false); err != nil {
+               return false, err
+       }
+       defer fd.decref()
+       v, err := syscall.GetsockoptInt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_RECVIF)
+       if err != nil {
+               return false, os.NewSyscallError("getsockopt", err)
+       }
+       return v == 1, nil
 }
 
 func setIPv4ReceiveInterface(fd *netFD, v bool) error {
-       // TODO: Implement this
-       return syscall.EAFNOSUPPORT
+       if err := fd.incref(false); err != nil {
+               return err
+       }
+       defer fd.decref()
+       err := syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_RECVIF, boolint(v))
+       if err != nil {
+               return os.NewSyscallError("setsockopt", err)
+       }
+       return nil
 }