github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/net/ipv4/sockopt_ssmreq_unix.go (about) 1 // Copyright 2014 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // +build darwin freebsd linux 6 7 package ipv4 8 9 import ( 10 "net" 11 "os" 12 "unsafe" 13 14 "golang.org/x/net/internal/iana" 15 ) 16 17 var freebsd32o64 bool 18 19 func setsockoptGroupReq(fd, name int, ifi *net.Interface, grp net.IP) error { 20 var gr sysGroupReq 21 if ifi != nil { 22 gr.Interface = uint32(ifi.Index) 23 } 24 gr.setGroup(grp) 25 var p unsafe.Pointer 26 var l sysSockoptLen 27 if freebsd32o64 { 28 var d [sysSizeofGroupReq + 4]byte 29 s := (*[sysSizeofGroupReq]byte)(unsafe.Pointer(&gr)) 30 copy(d[:4], s[:4]) 31 copy(d[8:], s[4:]) 32 p = unsafe.Pointer(&d[0]) 33 l = sysSizeofGroupReq + 4 34 } else { 35 p = unsafe.Pointer(&gr) 36 l = sysSizeofGroupReq 37 } 38 return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolIP, name, p, l)) 39 } 40 41 func setsockoptGroupSourceReq(fd, name int, ifi *net.Interface, grp, src net.IP) error { 42 var gsr sysGroupSourceReq 43 if ifi != nil { 44 gsr.Interface = uint32(ifi.Index) 45 } 46 gsr.setSourceGroup(grp, src) 47 var p unsafe.Pointer 48 var l sysSockoptLen 49 if freebsd32o64 { 50 var d [sysSizeofGroupSourceReq + 4]byte 51 s := (*[sysSizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr)) 52 copy(d[:4], s[:4]) 53 copy(d[8:], s[4:]) 54 p = unsafe.Pointer(&d[0]) 55 l = sysSizeofGroupSourceReq + 4 56 } else { 57 p = unsafe.Pointer(&gsr) 58 l = sysSizeofGroupSourceReq 59 } 60 return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolIP, name, p, l)) 61 }