github.com/hellobchain/third_party@v0.0.0-20230331131523-deb0478a2e52/go-sql-driver/mysql/conncheck.go (about) 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 9 // +build !windows,!appengine 10 11 package mysql 12 13 import ( 14 "errors" 15 "io" 16 "net" 17 "syscall" 18 ) 19 20 var errUnexpectedRead = errors.New("unexpected read from socket") 21 22 func connCheck(c net.Conn) error { 23 var ( 24 n int 25 err error 26 buff [1]byte 27 ) 28 29 sconn, ok := c.(syscall.Conn) 30 if !ok { 31 return nil 32 } 33 rc, err := sconn.SyscallConn() 34 if err != nil { 35 return err 36 } 37 rerr := rc.Read(func(fd uintptr) bool { 38 n, err = syscall.Read(int(fd), buff[:]) 39 return true 40 }) 41 switch { 42 case rerr != nil: 43 return rerr 44 case n == 0 && err == nil: 45 return io.EOF 46 case n > 0: 47 return errUnexpectedRead 48 case err == syscall.EAGAIN || err == syscall.EWOULDBLOCK: 49 return nil 50 default: 51 return err 52 } 53 }