package internal

import (
	"net"
	"reflect"

	"v2ray.com/core/common/errors"
)

var (
	errInvalidConn = errors.New("Invalid Connection.")
)

// GetSysFd returns the underlying fd of a connection.
func GetSysFd(conn net.Conn) (int, error) {
	cv := reflect.ValueOf(conn)
	switch ce := cv.Elem(); ce.Kind() {
	case reflect.Struct:
		netfd := ce.FieldByName("conn").FieldByName("fd")
		switch fe := netfd.Elem(); fe.Kind() {
		case reflect.Struct:
			fd := fe.FieldByName("sysfd")
			return int(fd.Int()), nil
		}
	}
	return 0, errInvalidConn
}
