github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/net/ipv4/sockopt_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 linux 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 getInt(fd int, opt *sockOpt) (int, error) { 18 if opt.name < 1 || (opt.typ != ssoTypeByte && opt.typ != ssoTypeInt) { 19 return 0, errOpNoSupport 20 } 21 var i int32 22 var b byte 23 p := unsafe.Pointer(&i) 24 l := sysSockoptLen(4) 25 if opt.typ == ssoTypeByte { 26 p = unsafe.Pointer(&b) 27 l = sysSockoptLen(1) 28 } 29 if err := getsockopt(fd, iana.ProtocolIP, opt.name, p, &l); err != nil { 30 return 0, os.NewSyscallError("getsockopt", err) 31 } 32 if opt.typ == ssoTypeByte { 33 return int(b), nil 34 } 35 return int(i), nil 36 } 37 38 func setInt(fd int, opt *sockOpt, v int) error { 39 if opt.name < 1 || (opt.typ != ssoTypeByte && opt.typ != ssoTypeInt) { 40 return errOpNoSupport 41 } 42 i := int32(v) 43 var b byte 44 p := unsafe.Pointer(&i) 45 l := sysSockoptLen(4) 46 if opt.typ == ssoTypeByte { 47 b = byte(v) 48 p = unsafe.Pointer(&b) 49 l = sysSockoptLen(1) 50 } 51 return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolIP, opt.name, p, l)) 52 } 53 54 func getInterface(fd int, opt *sockOpt) (*net.Interface, error) { 55 if opt.name < 1 { 56 return nil, errOpNoSupport 57 } 58 switch opt.typ { 59 case ssoTypeInterface: 60 return getsockoptInterface(fd, opt.name) 61 case ssoTypeIPMreqn: 62 return getsockoptIPMreqn(fd, opt.name) 63 default: 64 return nil, errOpNoSupport 65 } 66 } 67 68 func setInterface(fd int, opt *sockOpt, ifi *net.Interface) error { 69 if opt.name < 1 { 70 return errOpNoSupport 71 } 72 switch opt.typ { 73 case ssoTypeInterface: 74 return setsockoptInterface(fd, opt.name, ifi) 75 case ssoTypeIPMreqn: 76 return setsockoptIPMreqn(fd, opt.name, ifi, nil) 77 default: 78 return errOpNoSupport 79 } 80 } 81 82 func getICMPFilter(fd int, opt *sockOpt) (*ICMPFilter, error) { 83 if opt.name < 1 || opt.typ != ssoTypeICMPFilter { 84 return nil, errOpNoSupport 85 } 86 var f ICMPFilter 87 l := sysSockoptLen(sysSizeofICMPFilter) 88 if err := getsockopt(fd, iana.ProtocolReserved, opt.name, unsafe.Pointer(&f.sysICMPFilter), &l); err != nil { 89 return nil, os.NewSyscallError("getsockopt", err) 90 } 91 return &f, nil 92 } 93 94 func setICMPFilter(fd int, opt *sockOpt, f *ICMPFilter) error { 95 if opt.name < 1 || opt.typ != ssoTypeICMPFilter { 96 return errOpNoSupport 97 } 98 return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolReserved, opt.name, unsafe.Pointer(&f.sysICMPFilter), sysSizeofICMPFilter)) 99 } 100 101 func setGroup(fd int, opt *sockOpt, ifi *net.Interface, grp net.IP) error { 102 if opt.name < 1 { 103 return errOpNoSupport 104 } 105 switch opt.typ { 106 case ssoTypeIPMreq: 107 return setsockoptIPMreq(fd, opt.name, ifi, grp) 108 case ssoTypeIPMreqn: 109 return setsockoptIPMreqn(fd, opt.name, ifi, grp) 110 case ssoTypeGroupReq: 111 return setsockoptGroupReq(fd, opt.name, ifi, grp) 112 default: 113 return errOpNoSupport 114 } 115 } 116 117 func setSourceGroup(fd int, opt *sockOpt, ifi *net.Interface, grp, src net.IP) error { 118 if opt.name < 1 || opt.typ != ssoTypeGroupSourceReq { 119 return errOpNoSupport 120 } 121 return setsockoptGroupSourceReq(fd, opt.name, ifi, grp, src) 122 }