Платформа ЦРНП "Мирокод" для разработки проектов
https://git.mirocod.ru
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.1 KiB
54 lines
1.1 KiB
// 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 |
|
}
|
|
|