conncheck.go 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. // Go MySQL Driver - A MySQL-Driver for Go's database/sql package
  2. //
  3. // Copyright 2019 The Go-MySQL-Driver Authors. All rights reserved.
  4. //
  5. // This Source Code Form is subject to the terms of the Mozilla Public
  6. // License, v. 2.0. If a copy of the MPL was not distributed with this file,
  7. // You can obtain one at http://mozilla.org/MPL/2.0/.
  8. // +build !windows,!appengine
  9. package mysql
  10. import (
  11. "errors"
  12. "io"
  13. "net"
  14. "syscall"
  15. )
  16. var errUnexpectedRead = errors.New("unexpected read from socket")
  17. func connCheck(c net.Conn) error {
  18. var (
  19. n int
  20. err error
  21. buff [1]byte
  22. )
  23. sconn, ok := c.(syscall.Conn)
  24. if !ok {
  25. return nil
  26. }
  27. rc, err := sconn.SyscallConn()
  28. if err != nil {
  29. return err
  30. }
  31. rerr := rc.Read(func(fd uintptr) bool {
  32. n, err = syscall.Read(int(fd), buff[:])
  33. return true
  34. })
  35. switch {
  36. case rerr != nil:
  37. return rerr
  38. case n == 0 && err == nil:
  39. return io.EOF
  40. case n > 0:
  41. return errUnexpectedRead
  42. case err == syscall.EAGAIN || err == syscall.EWOULDBLOCK:
  43. return nil
  44. default:
  45. return err
  46. }
  47. }