| // 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 mysql | |
| 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 | |
| } |