Browse Source

go.net/ipv4: simplify socket option helpers

R=dave
CC=golang-dev
https://golang.org/cl/9379043
Mikio Hara 12 years ago
parent
commit
c94a7ef89e
6 changed files with 51 additions and 162 deletions
  1. 15 43
      ipv4/sockopt_bsd.go
  2. 1 5
      ipv4/sockopt_freebsd.go
  3. 10 38
      ipv4/sockopt_linux.go
  4. 1 3
      ipv4/sockopt_plan9.go
  5. 4 20
      ipv4/sockopt_unix.go
  6. 20 53
      ipv4/sockopt_windows.go

+ 15 - 43
ipv4/sockopt_bsd.go

@@ -21,11 +21,7 @@ func ipv4MulticastTTL(fd int) (int, error) {
 }
 
 func setIPv4MulticastTTL(fd int, v int) error {
-	err := syscall.SetsockoptByte(fd, ianaProtocolIP, syscall.IP_MULTICAST_TTL, byte(v))
-	if err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return nil
+	return os.NewSyscallError("setsockopt", syscall.SetsockoptByte(fd, ianaProtocolIP, syscall.IP_MULTICAST_TTL, byte(v)))
 }
 
 func ipv4ReceiveDestinationAddress(fd int) (bool, error) {
@@ -37,11 +33,7 @@ func ipv4ReceiveDestinationAddress(fd int) (bool, error) {
 }
 
 func setIPv4ReceiveDestinationAddress(fd int, v bool) error {
-	err := syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_RECVDSTADDR, boolint(v))
-	if err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return nil
+	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_RECVDSTADDR, boolint(v)))
 }
 
 func ipv4ReceiveInterface(fd int) (bool, error) {
@@ -53,19 +45,15 @@ func ipv4ReceiveInterface(fd int) (bool, error) {
 }
 
 func setIPv4ReceiveInterface(fd int, v bool) error {
-	err := syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_RECVIF, boolint(v))
-	if err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return nil
+	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_RECVIF, boolint(v)))
 }
 
 func ipv4MulticastInterface(fd int) (*net.Interface, error) {
-	a, err := syscall.GetsockoptInet4Addr(fd, ianaProtocolIP, syscall.IP_MULTICAST_IF)
+	v, err := syscall.GetsockoptInet4Addr(fd, ianaProtocolIP, syscall.IP_MULTICAST_IF)
 	if err != nil {
 		return nil, os.NewSyscallError("getsockopt", err)
 	}
-	return netIP4ToInterface(net.IPv4(a[0], a[1], a[2], a[3]))
+	return netIP4ToInterface(net.IPv4(v[0], v[1], v[2], v[3]))
 }
 
 func setIPv4MulticastInterface(fd int, ifi *net.Interface) error {
@@ -73,13 +61,9 @@ func setIPv4MulticastInterface(fd int, ifi *net.Interface) error {
 	if err != nil {
 		return os.NewSyscallError("setsockopt", err)
 	}
-	var a [4]byte
-	copy(a[:], ip.To4())
-	err = syscall.SetsockoptInet4Addr(fd, ianaProtocolIP, syscall.IP_MULTICAST_IF, a)
-	if err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return nil
+	var v [4]byte
+	copy(v[:], ip.To4())
+	return os.NewSyscallError("setsockopt", syscall.SetsockoptInet4Addr(fd, ianaProtocolIP, syscall.IP_MULTICAST_IF, v))
 }
 
 func ipv4MulticastLoopback(fd int) (bool, error) {
@@ -91,33 +75,21 @@ func ipv4MulticastLoopback(fd int) (bool, error) {
 }
 
 func setIPv4MulticastLoopback(fd int, v bool) error {
-	err := syscall.SetsockoptByte(fd, ianaProtocolIP, syscall.IP_MULTICAST_LOOP, byte(boolint(v)))
-	if err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return nil
+	return os.NewSyscallError("setsockopt", syscall.SetsockoptByte(fd, ianaProtocolIP, syscall.IP_MULTICAST_LOOP, byte(boolint(v))))
 }
 
 func joinIPv4Group(fd int, ifi *net.Interface, grp net.IP) error {
-	mreq := &syscall.IPMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}}
-	if err := setSyscallIPMreq(mreq, ifi); err != nil {
+	mreq := syscall.IPMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}}
+	if err := setSyscallIPMreq(&mreq, ifi); err != nil {
 		return err
 	}
-	err := syscall.SetsockoptIPMreq(fd, ianaProtocolIP, syscall.IP_ADD_MEMBERSHIP, mreq)
-	if err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return nil
+	return os.NewSyscallError("setsockopt", syscall.SetsockoptIPMreq(fd, ianaProtocolIP, syscall.IP_ADD_MEMBERSHIP, &mreq))
 }
 
 func leaveIPv4Group(fd int, ifi *net.Interface, grp net.IP) error {
-	mreq := &syscall.IPMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}}
-	if err := setSyscallIPMreq(mreq, ifi); err != nil {
+	mreq := syscall.IPMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}}
+	if err := setSyscallIPMreq(&mreq, ifi); err != nil {
 		return err
 	}
-	err := syscall.SetsockoptIPMreq(fd, ianaProtocolIP, syscall.IP_DROP_MEMBERSHIP, mreq)
-	if err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return nil
+	return os.NewSyscallError("setsockopt", syscall.SetsockoptIPMreq(fd, ianaProtocolIP, syscall.IP_DROP_MEMBERSHIP, &mreq))
 }

+ 1 - 5
ipv4/sockopt_freebsd.go

@@ -18,9 +18,5 @@ func ipv4SendSourceAddress(fd int) (bool, error) {
 }
 
 func setIPv4SendSourceAddress(fd int, v bool) error {
-	err := syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_SENDSRCADDR, boolint(v))
-	if err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return nil
+	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_SENDSRCADDR, boolint(v)))
 }

+ 10 - 38
ipv4/sockopt_linux.go

@@ -19,11 +19,7 @@ func ipv4ReceiveTOS(fd int) (bool, error) {
 }
 
 func setIPv4ReceiveTOS(fd int, v bool) error {
-	err := syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_RECVTOS, boolint(v))
-	if err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return nil
+	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_RECVTOS, boolint(v)))
 }
 
 func ipv4MulticastTTL(fd int) (int, error) {
@@ -35,11 +31,7 @@ func ipv4MulticastTTL(fd int) (int, error) {
 }
 
 func setIPv4MulticastTTL(fd int, v int) error {
-	err := syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_MULTICAST_TTL, v)
-	if err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return nil
+	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_MULTICAST_TTL, v))
 }
 
 func ipv4PacketInfo(fd int) (bool, error) {
@@ -51,11 +43,7 @@ func ipv4PacketInfo(fd int) (bool, error) {
 }
 
 func setIPv4PacketInfo(fd int, v bool) error {
-	err := syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_PKTINFO, boolint(v))
-	if err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return nil
+	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_PKTINFO, boolint(v)))
 }
 
 func ipv4MulticastInterface(fd int) (*net.Interface, error) {
@@ -70,15 +58,11 @@ func ipv4MulticastInterface(fd int) (*net.Interface, error) {
 }
 
 func setIPv4MulticastInterface(fd int, ifi *net.Interface) error {
-	mreqn := &syscall.IPMreqn{}
+	mreqn := syscall.IPMreqn{}
 	if ifi != nil {
 		mreqn.Ifindex = int32(ifi.Index)
 	}
-	err := syscall.SetsockoptIPMreqn(fd, ianaProtocolIP, syscall.IP_MULTICAST_IF, mreqn)
-	if err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return nil
+	return os.NewSyscallError("setsockopt", syscall.SetsockoptIPMreqn(fd, ianaProtocolIP, syscall.IP_MULTICAST_IF, &mreqn))
 }
 
 func ipv4MulticastLoopback(fd int) (bool, error) {
@@ -90,33 +74,21 @@ func ipv4MulticastLoopback(fd int) (bool, error) {
 }
 
 func setIPv4MulticastLoopback(fd int, v bool) error {
-	err := syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_MULTICAST_LOOP, boolint(v))
-	if err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return nil
+	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_MULTICAST_LOOP, boolint(v)))
 }
 
 func joinIPv4Group(fd int, ifi *net.Interface, grp net.IP) error {
-	mreqn := &syscall.IPMreqn{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}}
+	mreqn := syscall.IPMreqn{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}}
 	if ifi != nil {
 		mreqn.Ifindex = int32(ifi.Index)
 	}
-	err := syscall.SetsockoptIPMreqn(fd, ianaProtocolIP, syscall.IP_ADD_MEMBERSHIP, mreqn)
-	if err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return nil
+	return os.NewSyscallError("setsockopt", syscall.SetsockoptIPMreqn(fd, ianaProtocolIP, syscall.IP_ADD_MEMBERSHIP, &mreqn))
 }
 
 func leaveIPv4Group(fd int, ifi *net.Interface, grp net.IP) error {
-	mreqn := &syscall.IPMreqn{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}}
+	mreqn := syscall.IPMreqn{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}}
 	if ifi != nil {
 		mreqn.Ifindex = int32(ifi.Index)
 	}
-	err := syscall.SetsockoptIPMreqn(fd, ianaProtocolIP, syscall.IP_DROP_MEMBERSHIP, mreqn)
-	if err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return nil
+	return os.NewSyscallError("setsockopt", syscall.SetsockoptIPMreqn(fd, ianaProtocolIP, syscall.IP_DROP_MEMBERSHIP, &mreqn))
 }

+ 1 - 3
ipv4/sockopt_plan9.go

@@ -4,9 +4,7 @@
 
 package ipv4
 
-import (
-	"syscall"
-)
+import "syscall"
 
 func ipv4HeaderPrepend(fd int) (bool, error) {
 	// TODO(mikio): Implement this

+ 4 - 20
ipv4/sockopt_unix.go

@@ -20,11 +20,7 @@ func ipv4TOS(fd int) (int, error) {
 }
 
 func setIPv4TOS(fd int, v int) error {
-	err := syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_TOS, v)
-	if err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return nil
+	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_TOS, v))
 }
 
 func ipv4TTL(fd int) (int, error) {
@@ -36,11 +32,7 @@ func ipv4TTL(fd int) (int, error) {
 }
 
 func setIPv4TTL(fd int, v int) error {
-	err := syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_TTL, v)
-	if err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return nil
+	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_TTL, v))
 }
 
 func ipv4ReceiveTTL(fd int) (bool, error) {
@@ -52,11 +44,7 @@ func ipv4ReceiveTTL(fd int) (bool, error) {
 }
 
 func setIPv4ReceiveTTL(fd int, v bool) error {
-	err := syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_RECVTTL, boolint(v))
-	if err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return nil
+	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_RECVTTL, boolint(v)))
 }
 
 func ipv4HeaderPrepend(fd int) (bool, error) {
@@ -68,9 +56,5 @@ func ipv4HeaderPrepend(fd int) (bool, error) {
 }
 
 func setIPv4HeaderPrepend(fd int, v bool) error {
-	err := syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_HDRINCL, boolint(v))
-	if err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return nil
+	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_HDRINCL, boolint(v)))
 }

+ 20 - 53
ipv4/sockopt_windows.go

@@ -17,8 +17,7 @@ import (
 func ipv4TOS(fd syscall.Handle) (int, error) {
 	var v int32
 	l := int32(4)
-	err := syscall.Getsockopt(fd, ianaProtocolIP, syscall.IP_TOS, (*byte)(unsafe.Pointer(&v)), &l)
-	if err != nil {
+	if err := syscall.Getsockopt(fd, ianaProtocolIP, syscall.IP_TOS, (*byte)(unsafe.Pointer(&v)), &l); err != nil {
 		return 0, os.NewSyscallError("getsockopt", err)
 	}
 	return int(v), nil
@@ -26,18 +25,13 @@ func ipv4TOS(fd syscall.Handle) (int, error) {
 
 func setIPv4TOS(fd syscall.Handle, v int) error {
 	vv := int32(v)
-	err := syscall.Setsockopt(fd, ianaProtocolIP, syscall.IP_TOS, (*byte)(unsafe.Pointer(&vv)), 4)
-	if err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return nil
+	return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIP, syscall.IP_TOS, (*byte)(unsafe.Pointer(&vv)), 4))
 }
 
 func ipv4TTL(fd syscall.Handle) (int, error) {
 	var v int32
 	l := int32(4)
-	err := syscall.Getsockopt(fd, ianaProtocolIP, syscall.IP_TTL, (*byte)(unsafe.Pointer(&v)), &l)
-	if err != nil {
+	if err := syscall.Getsockopt(fd, ianaProtocolIP, syscall.IP_TTL, (*byte)(unsafe.Pointer(&v)), &l); err != nil {
 		return 0, os.NewSyscallError("getsockopt", err)
 	}
 	return int(v), nil
@@ -45,18 +39,13 @@ func ipv4TTL(fd syscall.Handle) (int, error) {
 
 func setIPv4TTL(fd syscall.Handle, v int) error {
 	vv := int32(v)
-	err := syscall.Setsockopt(fd, ianaProtocolIP, syscall.IP_TTL, (*byte)(unsafe.Pointer(&vv)), 4)
-	if err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return nil
+	return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIP, syscall.IP_TTL, (*byte)(unsafe.Pointer(&vv)), 4))
 }
 
 func ipv4MulticastTTL(fd syscall.Handle) (int, error) {
 	var v int32
 	l := int32(4)
-	err := syscall.Getsockopt(fd, ianaProtocolIP, syscall.IP_MULTICAST_TTL, (*byte)(unsafe.Pointer(&v)), &l)
-	if err != nil {
+	if err := syscall.Getsockopt(fd, ianaProtocolIP, syscall.IP_MULTICAST_TTL, (*byte)(unsafe.Pointer(&v)), &l); err != nil {
 		return 0, os.NewSyscallError("getsockopt", err)
 	}
 	return int(v), nil
@@ -64,11 +53,7 @@ func ipv4MulticastTTL(fd syscall.Handle) (int, error) {
 
 func setIPv4MulticastTTL(fd syscall.Handle, v int) error {
 	vv := int32(v)
-	err := syscall.Setsockopt(fd, ianaProtocolIP, syscall.IP_MULTICAST_TTL, (*byte)(unsafe.Pointer(&vv)), 4)
-	if err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return nil
+	return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIP, syscall.IP_MULTICAST_TTL, (*byte)(unsafe.Pointer(&vv)), 4))
 }
 
 func ipv4ReceiveTTL(fd syscall.Handle) (bool, error) {
@@ -112,13 +97,12 @@ func setIPv4ReceiveInterface(fd syscall.Handle, v bool) error {
 }
 
 func ipv4MulticastInterface(fd syscall.Handle) (*net.Interface, error) {
-	var a [4]byte
+	var v [4]byte
 	l := int32(4)
-	err := syscall.Getsockopt(fd, ianaProtocolIP, syscall.IP_MULTICAST_IF, (*byte)(unsafe.Pointer(&a[0])), &l)
-	if err != nil {
+	if err := syscall.Getsockopt(fd, ianaProtocolIP, syscall.IP_MULTICAST_IF, (*byte)(unsafe.Pointer(&v[0])), &l); err != nil {
 		return nil, os.NewSyscallError("getsockopt", err)
 	}
-	return netIP4ToInterface(net.IPv4(a[0], a[1], a[2], a[3]))
+	return netIP4ToInterface(net.IPv4(v[0], v[1], v[2], v[3]))
 }
 
 func setIPv4MulticastInterface(fd syscall.Handle, ifi *net.Interface) error {
@@ -126,20 +110,15 @@ func setIPv4MulticastInterface(fd syscall.Handle, ifi *net.Interface) error {
 	if err != nil {
 		return os.NewSyscallError("setsockopt", err)
 	}
-	var a [4]byte
-	copy(a[:], ip.To4())
-	err = syscall.Setsockopt(fd, ianaProtocolIP, syscall.IP_MULTICAST_IF, (*byte)(unsafe.Pointer(&a[0])), 4)
-	if err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return nil
+	var v [4]byte
+	copy(v[:], ip.To4())
+	return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIP, syscall.IP_MULTICAST_IF, (*byte)(unsafe.Pointer(&v[0])), 4))
 }
 
 func ipv4MulticastLoopback(fd syscall.Handle) (bool, error) {
 	var v int32
 	l := int32(4)
-	err := syscall.Getsockopt(fd, ianaProtocolIP, syscall.IP_MULTICAST_LOOP, (*byte)(unsafe.Pointer(&v)), &l)
-	if err != nil {
+	if err := syscall.Getsockopt(fd, ianaProtocolIP, syscall.IP_MULTICAST_LOOP, (*byte)(unsafe.Pointer(&v)), &l); err != nil {
 		return false, os.NewSyscallError("getsockopt", err)
 	}
 	return v == 1, nil
@@ -147,33 +126,21 @@ func ipv4MulticastLoopback(fd syscall.Handle) (bool, error) {
 
 func setIPv4MulticastLoopback(fd syscall.Handle, v bool) error {
 	vv := int32(boolint(v))
-	err := syscall.Setsockopt(fd, ianaProtocolIP, syscall.IP_MULTICAST_LOOP, (*byte)(unsafe.Pointer(&vv)), 4)
-	if err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return nil
+	return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIP, syscall.IP_MULTICAST_LOOP, (*byte)(unsafe.Pointer(&vv)), 4))
 }
 
 func joinIPv4Group(fd syscall.Handle, ifi *net.Interface, grp net.IP) error {
-	mreq := &syscall.IPMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}}
-	if err := setSyscallIPMreq(mreq, ifi); err != nil {
+	mreq := syscall.IPMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}}
+	if err := setSyscallIPMreq(&mreq, ifi); err != nil {
 		return err
 	}
-	err := syscall.Setsockopt(fd, ianaProtocolIP, syscall.IP_ADD_MEMBERSHIP, (*byte)(unsafe.Pointer(mreq)), int32(unsafe.Sizeof(*mreq)))
-	if err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return nil
+	return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIP, syscall.IP_ADD_MEMBERSHIP, (*byte)(unsafe.Pointer(&mreq)), int32(unsafe.Sizeof(mreq))))
 }
 
 func leaveIPv4Group(fd syscall.Handle, ifi *net.Interface, grp net.IP) error {
-	mreq := &syscall.IPMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}}
-	if err := setSyscallIPMreq(mreq, ifi); err != nil {
+	mreq := syscall.IPMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}}
+	if err := setSyscallIPMreq(&mreq, ifi); err != nil {
 		return err
 	}
-	err := syscall.Setsockopt(fd, ianaProtocolIP, syscall.IP_DROP_MEMBERSHIP, (*byte)(unsafe.Pointer(mreq)), int32(unsafe.Sizeof(*mreq)))
-	if err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return nil
+	return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIP, syscall.IP_DROP_MEMBERSHIP, (*byte)(unsafe.Pointer(&mreq)), int32(unsafe.Sizeof(mreq))))
 }