 d08996c7b9
			
		
	
	
		d08996c7b9
		
			
		
	
	
	
	
		
			
			Co-authored-by: Lauris BH <lauris@nix.lv> Co-authored-by: techknowlogick <techknowlogick@gitea.io>
		
			
				
	
	
		
			54 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
		
			Vendored
		
	
	
	
			
		
		
	
	
			54 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
		
			Vendored
		
	
	
	
| // 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
 | |
| }
 |