mirror of
				https://codeberg.org/forgejo/forgejo.git
				synced 2025-11-04 08:21:11 +00:00 
			
		
		
		
	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
 | 
						|
}
 |