diff options
author | Mikio Hara <mikioh.mikioh@gmail.com> | 2015-06-18 12:02:03 +0900 |
---|---|---|
committer | Mikio Hara <mikioh.mikioh@gmail.com> | 2015-06-19 01:28:11 +0000 |
commit | 4d302b6b446f7a5d2b73cad083959f7bf27b4181 (patch) | |
tree | fe876cc0da3847149dd32dd5ce82b9ac336419dd | |
parent | 933937213561306ee71d265fb8a2913f20a55123 (diff) | |
download | net-4d302b6b446f7a5d2b73cad083959f7bf27b4181.tar.gz |
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>
-rw-r--r-- | ipv4/sockopt_ssmreq_unix.go | 32 | ||||
-rw-r--r-- | ipv4/sys_freebsd.go | 11 |
2 files changed, 41 insertions, 2 deletions
diff --git a/ipv4/sockopt_ssmreq_unix.go b/ipv4/sockopt_ssmreq_unix.go index 08a6eaa..6f647bc 100644 --- a/ipv4/sockopt_ssmreq_unix.go +++ b/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)) } diff --git a/ipv4/sys_freebsd.go b/ipv4/sys_freebsd.go index 7df658c..a60f95b 100644 --- a/ipv4/sys_freebsd.go +++ b/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) { |