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  }