Selaa lähdekoodia

ipv4: fix multicast socket options on freebsd/386 on amd64

Change-Id: I59d627d85d6df089595037681cecb85db73955a9
Reviewed-on: https://go-review.googlesource.com/11225
Run-TryBot: Mikio Hara <mikioh.mikioh@gmail.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Mikio Hara 10 vuotta sitten
vanhempi
commit
4d302b6b44
2 muutettua tiedostoa jossa 41 lisäystä ja 2 poistoa
  1. 30 2
      ipv4/sockopt_ssmreq_unix.go
  2. 11 0
      ipv4/sys_freebsd.go

+ 30 - 2
ipv4/sockopt_ssmreq_unix.go

@@ -14,13 +14,28 @@ import (
 	"golang.org/x/net/internal/iana"
 )
 
+var freebsd32o64 bool
+
 func setsockoptGroupReq(fd, name int, ifi *net.Interface, grp net.IP) error {
 	var gr sysGroupReq
 	if ifi != nil {
 		gr.Interface = uint32(ifi.Index)
 	}
 	gr.setGroup(grp)
-	return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolIP, name, unsafe.Pointer(&gr), sysSizeofGroupReq))
+	var p unsafe.Pointer
+	var l sysSockoptLen
+	if freebsd32o64 {
+		var d [sysSizeofGroupReq + 4]byte
+		s := (*[sysSizeofGroupReq]byte)(unsafe.Pointer(&gr))
+		copy(d[:4], s[:4])
+		copy(d[8:], s[4:])
+		p = unsafe.Pointer(&d[0])
+		l = sysSizeofGroupReq + 4
+	} else {
+		p = unsafe.Pointer(&gr)
+		l = sysSizeofGroupReq
+	}
+	return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolIP, name, p, l))
 }
 
 func setsockoptGroupSourceReq(fd, name int, ifi *net.Interface, grp, src net.IP) error {
@@ -29,5 +44,18 @@ func setsockoptGroupSourceReq(fd, name int, ifi *net.Interface, grp, src net.IP)
 		gsr.Interface = uint32(ifi.Index)
 	}
 	gsr.setSourceGroup(grp, src)
-	return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolIP, name, unsafe.Pointer(&gsr), sysSizeofGroupSourceReq))
+	var p unsafe.Pointer
+	var l sysSockoptLen
+	if freebsd32o64 {
+		var d [sysSizeofGroupSourceReq + 4]byte
+		s := (*[sysSizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr))
+		copy(d[:4], s[:4])
+		copy(d[8:], s[4:])
+		p = unsafe.Pointer(&d[0])
+		l = sysSizeofGroupSourceReq + 4
+	} else {
+		p = unsafe.Pointer(&gsr)
+		l = sysSizeofGroupSourceReq
+	}
+	return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolIP, name, p, l))
 }

+ 11 - 0
ipv4/sys_freebsd.go

@@ -6,6 +6,8 @@ package ipv4
 
 import (
 	"net"
+	"runtime"
+	"strings"
 	"syscall"
 	"unsafe"
 )
@@ -43,6 +45,15 @@ func init() {
 	if freebsdVersion >= 1000000 {
 		sockOpts[ssoMulticastInterface].typ = ssoTypeIPMreqn
 	}
+	if runtime.GOOS == "freebsd" && runtime.GOARCH == "386" {
+		archs, _ := syscall.Sysctl("kern.supported_archs")
+		for _, s := range strings.Split(archs, " ") {
+			if strings.TrimSpace(s) == "amd64" {
+				freebsd32o64 = true
+				break
+			}
+		}
+	}
 }
 
 func (gr *sysGroupReq) setGroup(grp net.IP) {