|
|
@@ -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))
|
|
|
}
|