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  }