github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/net/ipv4/sockopt_asmreq_unix.go (about) 1 // Copyright 2012 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 dragonfly freebsd netbsd openbsd 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 setsockoptIPMreq(fd, name int, ifi *net.Interface, grp net.IP) error { 18 mreq := sysIPMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}} 19 if err := setIPMreqInterface(&mreq, ifi); err != nil { 20 return err 21 } 22 return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolIP, name, unsafe.Pointer(&mreq), sysSizeofIPMreq)) 23 } 24 25 func getsockoptInterface(fd, name int) (*net.Interface, error) { 26 var b [4]byte 27 l := sysSockoptLen(4) 28 if err := getsockopt(fd, iana.ProtocolIP, name, unsafe.Pointer(&b[0]), &l); err != nil { 29 return nil, os.NewSyscallError("getsockopt", err) 30 } 31 ifi, err := netIP4ToInterface(net.IPv4(b[0], b[1], b[2], b[3])) 32 if err != nil { 33 return nil, err 34 } 35 return ifi, nil 36 } 37 38 func setsockoptInterface(fd, name int, ifi *net.Interface) error { 39 ip, err := netInterfaceToIP4(ifi) 40 if err != nil { 41 return err 42 } 43 var b [4]byte 44 copy(b[:], ip) 45 return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolIP, name, unsafe.Pointer(&b[0]), sysSockoptLen(4))) 46 }