github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/net/ipv6/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 ipv6 8 9 import ( 10 "net" 11 "os" 12 "unsafe" 13 ) 14 15 var freebsd32o64 bool 16 17 func setsockoptGroupReq(fd int, opt *sockOpt, ifi *net.Interface, grp net.IP) error { 18 var gr sysGroupReq 19 if ifi != nil { 20 gr.Interface = uint32(ifi.Index) 21 } 22 gr.setGroup(grp) 23 var p unsafe.Pointer 24 var l sysSockoptLen 25 if freebsd32o64 { 26 var d [sysSizeofGroupReq + 4]byte 27 s := (*[sysSizeofGroupReq]byte)(unsafe.Pointer(&gr)) 28 copy(d[:4], s[:4]) 29 copy(d[8:], s[4:]) 30 p = unsafe.Pointer(&d[0]) 31 l = sysSizeofGroupReq + 4 32 } else { 33 p = unsafe.Pointer(&gr) 34 l = sysSizeofGroupReq 35 } 36 return os.NewSyscallError("setsockopt", setsockopt(fd, opt.level, opt.name, p, l)) 37 } 38 39 func setsockoptGroupSourceReq(fd int, opt *sockOpt, ifi *net.Interface, grp, src net.IP) error { 40 var gsr sysGroupSourceReq 41 if ifi != nil { 42 gsr.Interface = uint32(ifi.Index) 43 } 44 gsr.setSourceGroup(grp, src) 45 var p unsafe.Pointer 46 var l sysSockoptLen 47 if freebsd32o64 { 48 var d [sysSizeofGroupSourceReq + 4]byte 49 s := (*[sysSizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr)) 50 copy(d[:4], s[:4]) 51 copy(d[8:], s[4:]) 52 p = unsafe.Pointer(&d[0]) 53 l = sysSizeofGroupSourceReq + 4 54 } else { 55 p = unsafe.Pointer(&gsr) 56 l = sysSizeofGroupSourceReq 57 } 58 return os.NewSyscallError("setsockopt", setsockopt(fd, opt.level, opt.name, p, l)) 59 }