// Copyright 2012 The Go Authors.  All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// +build darwin freebsd linux netbsd openbsd

package ipv4

import (
	"net"
	"reflect"
)

func (c *genericOpt) sysfd() (int, error) {
	switch p := c.c.(type) {
	case *net.TCPConn, *net.UDPConn, *net.IPConn:
		return sysfd(p)
	}
	return 0, errInvalidConnType
}

func (c *dgramOpt) sysfd() (int, error) {
	switch p := c.c.(type) {
	case *net.UDPConn, *net.IPConn:
		return sysfd(p.(net.Conn))
	}
	return 0, errInvalidConnType
}

func (c *payloadHandler) sysfd() (int, error) {
	return sysfd(c.c.(net.Conn))
}

func (c *packetHandler) sysfd() (int, error) {
	return sysfd(c.c)
}

func sysfd(c net.Conn) (int, error) {
	cv := reflect.ValueOf(c)
	switch ce := cv.Elem(); ce.Kind() {
	case reflect.Struct:
		nfd := ce.FieldByName("conn").FieldByName("fd")
		switch fe := nfd.Elem(); fe.Kind() {
		case reflect.Struct:
			fd := fe.FieldByName("sysfd")
			return int(fd.Int()), nil
		}
	}
	return 0, errInvalidConnType
}
