diff options
author | root <sina@snix.ir> | 2022-05-27 13:13:53 +0000 |
---|---|---|
committer | root <sina@snix.ir> | 2022-05-27 13:13:53 +0000 |
commit | 937c561db4b25a1becdc81701511fafc67b90389 (patch) | |
tree | 17e5d4c692ec4ab3c8b0deb0072d5784cc4be084 /conncheck.go |
Diffstat (limited to 'conncheck.go')
-rw-r--r-- | conncheck.go | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/conncheck.go b/conncheck.go new file mode 100644 index 0000000..912d909 --- /dev/null +++ b/conncheck.go @@ -0,0 +1,54 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2019 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +// +build linux darwin dragonfly freebsd netbsd openbsd solaris illumos + +package mariadb + +import ( + "errors" + "io" + "net" + "syscall" +) + +var errUnexpectedRead = errors.New("unexpected read from socket") + +func connCheck(conn net.Conn) error { + var sysErr error + + sysConn, ok := conn.(syscall.Conn) + if !ok { + return nil + } + rawConn, err := sysConn.SyscallConn() + if err != nil { + return err + } + + err = rawConn.Read(func(fd uintptr) bool { + var buf [1]byte + n, err := syscall.Read(int(fd), buf[:]) + switch { + case n == 0 && err == nil: + sysErr = io.EOF + case n > 0: + sysErr = errUnexpectedRead + case err == syscall.EAGAIN || err == syscall.EWOULDBLOCK: + sysErr = nil + default: + sysErr = err + } + return true + }) + if err != nil { + return err + } + + return sysErr +} |