summaryrefslogtreecommitdiffhomepage
path: root/server/sockopt.go
diff options
context:
space:
mode:
Diffstat (limited to 'server/sockopt.go')
-rw-r--r--server/sockopt.go37
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))
}