...
1
18
19 package channelz
20
21 import (
22 "syscall"
23
24 "golang.org/x/sys/unix"
25 )
26
27
28
29 type SocketOptionData struct {
30 Linger *unix.Linger
31 RecvTimeout *unix.Timeval
32 SendTimeout *unix.Timeval
33 TCPInfo *unix.TCPInfo
34 }
35
36
37
38 func (s *SocketOptionData) Getsockopt(fd uintptr) {
39 if v, err := unix.GetsockoptLinger(int(fd), syscall.SOL_SOCKET, syscall.SO_LINGER); err == nil {
40 s.Linger = v
41 }
42 if v, err := unix.GetsockoptTimeval(int(fd), syscall.SOL_SOCKET, syscall.SO_RCVTIMEO); err == nil {
43 s.RecvTimeout = v
44 }
45 if v, err := unix.GetsockoptTimeval(int(fd), syscall.SOL_SOCKET, syscall.SO_SNDTIMEO); err == nil {
46 s.SendTimeout = v
47 }
48 if v, err := unix.GetsockoptTCPInfo(int(fd), syscall.SOL_TCP, syscall.TCP_INFO); err == nil {
49 s.TCPInfo = v
50 }
51 }
52
53
54 func GetSocketOption(socket any) *SocketOptionData {
55 c, ok := socket.(syscall.Conn)
56 if !ok {
57 return nil
58 }
59 data := &SocketOptionData{}
60 if rawConn, err := c.SyscallConn(); err == nil {
61 rawConn.Control(data.Getsockopt)
62 return data
63 }
64 return nil
65 }
66
View as plain text