|  | // Copyright 2014 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. | 
|  |  | 
|  | //go:build aix || darwin || freebsd || linux || solaris || zos | 
|  |  | 
|  | package ipv6 | 
|  |  | 
|  | import ( | 
|  | "net" | 
|  | "unsafe" | 
|  |  | 
|  | "golang.org/x/net/internal/socket" | 
|  | ) | 
|  |  | 
|  | var compatFreeBSD32 bool // 386 emulation on amd64 | 
|  |  | 
|  | func (so *sockOpt) setGroupReq(c *socket.Conn, ifi *net.Interface, grp net.IP) error { | 
|  | var gr groupReq | 
|  | if ifi != nil { | 
|  | gr.Interface = uint32(ifi.Index) | 
|  | } | 
|  | gr.setGroup(grp) | 
|  | var b []byte | 
|  | if compatFreeBSD32 { | 
|  | var d [sizeofGroupReq + 4]byte | 
|  | s := (*[sizeofGroupReq]byte)(unsafe.Pointer(&gr)) | 
|  | copy(d[:4], s[:4]) | 
|  | copy(d[8:], s[4:]) | 
|  | b = d[:] | 
|  | } else { | 
|  | b = (*[sizeofGroupReq]byte)(unsafe.Pointer(&gr))[:sizeofGroupReq] | 
|  | } | 
|  | return so.Set(c, b) | 
|  | } | 
|  |  | 
|  | func (so *sockOpt) setGroupSourceReq(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error { | 
|  | var gsr groupSourceReq | 
|  | if ifi != nil { | 
|  | gsr.Interface = uint32(ifi.Index) | 
|  | } | 
|  | gsr.setSourceGroup(grp, src) | 
|  | var b []byte | 
|  | if compatFreeBSD32 { | 
|  | var d [sizeofGroupSourceReq + 4]byte | 
|  | s := (*[sizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr)) | 
|  | copy(d[:4], s[:4]) | 
|  | copy(d[8:], s[4:]) | 
|  | b = d[:] | 
|  | } else { | 
|  | b = (*[sizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr))[:sizeofGroupSourceReq] | 
|  | } | 
|  | return so.Set(c, b) | 
|  | } |