Add sysSocket fallback (revert 7c1157f)
This commit is contained in:
@@ -13,6 +13,7 @@ var (
|
||||
hostsFilePath = windows.GetSystemDirectory() + "/Drivers/etc/hosts"
|
||||
|
||||
// Placeholders for socket system calls.
|
||||
socketFunc func(int, int, int) (syscall.Handle, error) = syscall.Socket
|
||||
wsaSocketFunc func(int32, int32, int32, *syscall.WSAProtocolInfo, uint32, uint32) (syscall.Handle, error) = windows.WSASocket
|
||||
connectFunc func(syscall.Handle, syscall.Sockaddr) error = syscall.Connect
|
||||
listenFunc func(syscall.Handle, int) error = syscall.Listen
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
//go:build !js && !plan9 && !wasip1 && !windows
|
||||
//go:build !js && !plan9 && !wasip1
|
||||
|
||||
package socktest_test
|
||||
|
||||
|
||||
22
src/net/internal/socktest/main_windows_test.go
Normal file
22
src/net/internal/socktest/main_windows_test.go
Normal file
@@ -0,0 +1,22 @@
|
||||
// Copyright 2015 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package socktest_test
|
||||
|
||||
import "syscall"
|
||||
|
||||
var (
|
||||
socketFunc func(int, int, int) (syscall.Handle, error)
|
||||
closeFunc func(syscall.Handle) error
|
||||
)
|
||||
|
||||
func installTestHooks() {
|
||||
socketFunc = sw.Socket
|
||||
closeFunc = sw.Closesocket
|
||||
}
|
||||
|
||||
func uninstallTestHooks() {
|
||||
socketFunc = syscall.Socket
|
||||
closeFunc = syscall.Closesocket
|
||||
}
|
||||
@@ -9,6 +9,35 @@ import (
|
||||
"syscall"
|
||||
)
|
||||
|
||||
// Socket wraps syscall.Socket.
|
||||
func (sw *Switch) Socket(family, sotype, proto int) (s syscall.Handle, err error) {
|
||||
sw.once.Do(sw.init)
|
||||
so := &Status{Cookie: cookie(family, sotype, proto)}
|
||||
sw.fmu.RLock()
|
||||
f, _ := sw.fltab[FilterSocket]
|
||||
sw.fmu.RUnlock()
|
||||
af, err := f.apply(so)
|
||||
if err != nil {
|
||||
return syscall.InvalidHandle, err
|
||||
}
|
||||
s, so.Err = syscall.Socket(family, sotype, proto)
|
||||
if err = af.apply(so); err != nil {
|
||||
if so.Err == nil {
|
||||
syscall.Closesocket(s)
|
||||
}
|
||||
return syscall.InvalidHandle, err
|
||||
}
|
||||
sw.smu.Lock()
|
||||
defer sw.smu.Unlock()
|
||||
if so.Err != nil {
|
||||
sw.stats.getLocked(so.Cookie).OpenFailed++
|
||||
return syscall.InvalidHandle, so.Err
|
||||
}
|
||||
nso := sw.addLocked(s, family, sotype, proto)
|
||||
sw.stats.getLocked(nso.Cookie).Opened++
|
||||
return s, nil
|
||||
}
|
||||
|
||||
// WSASocket wraps [syscall.WSASocket].
|
||||
func (sw *Switch) WSASocket(family, sotype, proto int32, protinfo *syscall.WSAProtocolInfo, group uint32, flags uint32) (s syscall.Handle, err error) {
|
||||
sw.once.Do(sw.init)
|
||||
|
||||
@@ -8,6 +8,7 @@ import "internal/poll"
|
||||
|
||||
var (
|
||||
// Placeholders for saving original socket system calls.
|
||||
origSocket = socketFunc
|
||||
origWSASocket = wsaSocketFunc
|
||||
origClosesocket = poll.CloseFunc
|
||||
origConnect = connectFunc
|
||||
@@ -17,6 +18,7 @@ var (
|
||||
)
|
||||
|
||||
func installTestHooks() {
|
||||
socketFunc = sw.Socket
|
||||
wsaSocketFunc = sw.WSASocket
|
||||
poll.CloseFunc = sw.Closesocket
|
||||
connectFunc = sw.Connect
|
||||
@@ -26,6 +28,7 @@ func installTestHooks() {
|
||||
}
|
||||
|
||||
func uninstallTestHooks() {
|
||||
socketFunc = origSocket
|
||||
wsaSocketFunc = origWSASocket
|
||||
poll.CloseFunc = origClosesocket
|
||||
connectFunc = origConnect
|
||||
|
||||
@@ -20,6 +20,20 @@ func maxListenerBacklog() int {
|
||||
func sysSocket(family, sotype, proto int) (syscall.Handle, error) {
|
||||
s, err := wsaSocketFunc(int32(family), int32(sotype), int32(proto),
|
||||
nil, 0, windows.WSA_FLAG_OVERLAPPED|windows.WSA_FLAG_NO_HANDLE_INHERIT)
|
||||
if err == nil {
|
||||
return s, nil
|
||||
}
|
||||
// WSA_FLAG_NO_HANDLE_INHERIT flag is not supported on some
|
||||
// old versions of Windows, see
|
||||
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms742212(v=vs.85).aspx
|
||||
// for details. Just use syscall.Socket, if windows.WSASocket failed.
|
||||
// See ../syscall/exec_unix.go for description of ForkLock.
|
||||
syscall.ForkLock.RLock()
|
||||
s, err = socketFunc(family, sotype, proto)
|
||||
if err == nil {
|
||||
syscall.CloseOnExec(s)
|
||||
}
|
||||
syscall.ForkLock.RUnlock()
|
||||
if err != nil {
|
||||
return syscall.InvalidHandle, os.NewSyscallError("socket", err)
|
||||
}
|
||||
|
||||
@@ -14,7 +14,6 @@ import (
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
// ForkLock is not used on Windows.
|
||||
var ForkLock sync.RWMutex
|
||||
|
||||
// EscapeArg rewrites command line argument s as prescribed
|
||||
|
||||
Reference in New Issue
Block a user