...
1
2
3 package pool
4
5 import (
6 "errors"
7 "io"
8 "net"
9 "syscall"
10 "time"
11 )
12
13 var errUnexpectedRead = errors.New("unexpected read from socket")
14
15 func connCheck(conn net.Conn) error {
16
17 _ = conn.SetDeadline(time.Time{})
18
19 sysConn, ok := conn.(syscall.Conn)
20 if !ok {
21 return nil
22 }
23 rawConn, err := sysConn.SyscallConn()
24 if err != nil {
25 return err
26 }
27
28 var sysErr error
29
30 if err := rawConn.Read(func(fd uintptr) bool {
31 var buf [1]byte
32 n, err := syscall.Read(int(fd), buf[:])
33 switch {
34 case n == 0 && err == nil:
35 sysErr = io.EOF
36 case n > 0:
37 sysErr = errUnexpectedRead
38 case err == syscall.EAGAIN || err == syscall.EWOULDBLOCK:
39 sysErr = nil
40 default:
41 sysErr = err
42 }
43 return true
44 }); err != nil {
45 return err
46 }
47
48 return sysErr
49 }
50
View as plain text