github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/net/ipv4/sockopt_asmreqn_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 func getsockoptIPMreqn(fd, name int) (*net.Interface, error) { 18 var mreqn sysIPMreqn 19 l := sysSockoptLen(sysSizeofIPMreqn) 20 if err := getsockopt(fd, iana.ProtocolIP, name, unsafe.Pointer(&mreqn), &l); err != nil { 21 return nil, os.NewSyscallError("getsockopt", err) 22 } 23 if mreqn.Ifindex == 0 { 24 return nil, nil 25 } 26 ifi, err := net.InterfaceByIndex(int(mreqn.Ifindex)) 27 if err != nil { 28 return nil, err 29 } 30 return ifi, nil 31 } 32 33 func setsockoptIPMreqn(fd, name int, ifi *net.Interface, grp net.IP) error { 34 var mreqn sysIPMreqn 35 if ifi != nil { 36 mreqn.Ifindex = int32(ifi.Index) 37 } 38 if grp != nil { 39 mreqn.Multiaddr = [4]byte{grp[0], grp[1], grp[2], grp[3]} 40 } 41 return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolIP, name, unsafe.Pointer(&mreqn), sysSizeofIPMreqn)) 42 }