// 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 !windows,!appengine package mysql import ( "errors" "io" "net" "syscall" ) var errUnexpectedRead = errors.New("unexpected read from socket") func connCheck(c net.Conn) error { var ( n int err error buff [1]byte ) sconn, ok := c.(syscall.Conn) if !ok { return nil } rc, err := sconn.SyscallConn() if err != nil { return err } rerr := rc.Read(func(fd uintptr) bool { n, err = syscall.Read(int(fd), buff[:]) return true }) switch { case rerr != nil: return rerr case n == 0 && err == nil: return io.EOF case n > 0: return errUnexpectedRead case err == syscall.EAGAIN || err == syscall.EWOULDBLOCK: return nil default: return err } }