github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/net/ipv6/helper_unix.go (about) 1 // Copyright 2013 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 ipv6 8 9 import ( 10 "net" 11 "reflect" 12 ) 13 14 func (c *genericOpt) sysfd() (int, error) { 15 switch p := c.Conn.(type) { 16 case *net.TCPConn, *net.UDPConn, *net.IPConn: 17 return sysfd(p) 18 } 19 return 0, errInvalidConnType 20 } 21 22 func (c *dgramOpt) sysfd() (int, error) { 23 switch p := c.PacketConn.(type) { 24 case *net.UDPConn, *net.IPConn: 25 return sysfd(p.(net.Conn)) 26 } 27 return 0, errInvalidConnType 28 } 29 30 func (c *payloadHandler) sysfd() (int, error) { 31 return sysfd(c.PacketConn.(net.Conn)) 32 } 33 34 func sysfd(c net.Conn) (int, error) { 35 cv := reflect.ValueOf(c) 36 switch ce := cv.Elem(); ce.Kind() { 37 case reflect.Struct: 38 nfd := ce.FieldByName("conn").FieldByName("fd") 39 switch fe := nfd.Elem(); fe.Kind() { 40 case reflect.Struct: 41 fd := fe.FieldByName("sysfd") 42 return int(fd.Int()), nil 43 } 44 } 45 return 0, errInvalidConnType 46 }