diff options
Diffstat (limited to 'server/sockopt.go')
-rw-r--r-- | server/sockopt.go | 37 |
1 files changed, 18 insertions, 19 deletions
diff --git a/server/sockopt.go b/server/sockopt.go index 429063b2..43602036 100644 --- a/server/sockopt.go +++ b/server/sockopt.go @@ -3,7 +3,6 @@ package server import ( "net" "os" - "reflect" "strings" "syscall" "unsafe" @@ -39,25 +38,17 @@ func buildTcpMD5Sig(address string, key string) (tcpmd5sig, error) { return t, nil } -func connToFd(v reflect.Value) int { - fd := v.FieldByName("fd") - p := reflect.Indirect(fd) - sysfd := p.FieldByName("sysfd") - return int(sysfd.Int()) -} - -func listenerToFd(l *net.TCPListener) int { - return connToFd(reflect.ValueOf(*l)) -} - -func tcpConnToFd(tcp *net.TCPConn) int { - n := reflect.ValueOf(*tcp) - return connToFd(n.FieldByName("conn")) -} - func SetTcpMD5SigSockopts(l *net.TCPListener, address string, key string) error { t, _ := buildTcpMD5Sig(address, key) - _, _, e := syscall.Syscall6(syscall.SYS_SETSOCKOPT, uintptr(listenerToFd(l)), + fi, err := l.File() + defer fi.Close() + if err != nil { + return err + } + if l, err := net.FileListener(fi); err == nil { + defer l.Close() + } + _, _, e := syscall.Syscall6(syscall.SYS_SETSOCKOPT, fi.Fd(), uintptr(syscall.IPPROTO_TCP), uintptr(TCP_MD5SIG), uintptr(unsafe.Pointer(&t)), unsafe.Sizeof(t), 0) return e @@ -70,5 +61,13 @@ func SetTcpTTLSockopts(conn *net.TCPConn, ttl int) error { level = syscall.IPPROTO_IPV6 name = syscall.IPV6_UNICAST_HOPS } - return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(tcpConnToFd(conn), level, name, ttl)) + fi, err := conn.File() + defer fi.Close() + if err != nil { + return err + } + if conn, err := net.FileConn(fi); err == nil { + defer conn.Close() + } + return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(int(fi.Fd()), level, name, ttl)) } |