diff options
Diffstat (limited to 'vendor/github.com/tetratelabs/wazero/internal/sock')
3 files changed, 110 insertions, 0 deletions
diff --git a/vendor/github.com/tetratelabs/wazero/internal/sock/sock.go b/vendor/github.com/tetratelabs/wazero/internal/sock/sock.go new file mode 100644 index 000000000..ca17aa39e --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sock/sock.go @@ -0,0 +1,89 @@ +package sock + +import ( +	"fmt" +	"net" + +	"github.com/tetratelabs/wazero/experimental/sys" +) + +// TCPSock is a pseudo-file representing a TCP socket. +type TCPSock interface { +	sys.File + +	Accept() (TCPConn, sys.Errno) +} + +// TCPConn is a pseudo-file representing a TCP connection. +type TCPConn interface { +	sys.File + +	// Recvfrom only supports the flag sysfs.MSG_PEEK +	// TODO: document this like sys.File with known sys.Errno +	Recvfrom(p []byte, flags int) (n int, errno sys.Errno) + +	// TODO: document this like sys.File with known sys.Errno +	Shutdown(how int) sys.Errno +} + +// ConfigKey is a context.Context Value key. Its associated value should be a Config. +type ConfigKey struct{} + +// Config is an internal struct meant to implement +// the interface in experimental/sock/Config. +type Config struct { +	// TCPAddresses is a slice of the configured host:port pairs. +	TCPAddresses []TCPAddress +} + +// TCPAddress is a host:port pair to pre-open. +type TCPAddress struct { +	// Host is the host name for this listener. +	Host string +	// Port is the port number for this listener. +	Port int +} + +// WithTCPListener implements the method of the same name in experimental/sock/Config. +// +// However, to avoid cyclic dependencies, this is returning the *Config in this scope. +// The interface is implemented in experimental/sock/Config via delegation. +func (c *Config) WithTCPListener(host string, port int) *Config { +	ret := c.clone() +	ret.TCPAddresses = append(ret.TCPAddresses, TCPAddress{host, port}) +	return &ret +} + +// Makes a deep copy of this sockConfig. +func (c *Config) clone() Config { +	ret := *c +	ret.TCPAddresses = make([]TCPAddress, 0, len(c.TCPAddresses)) +	ret.TCPAddresses = append(ret.TCPAddresses, c.TCPAddresses...) +	return ret +} + +// BuildTCPListeners build listeners from the current configuration. +func (c *Config) BuildTCPListeners() (tcpListeners []*net.TCPListener, err error) { +	for _, tcpAddr := range c.TCPAddresses { +		var ln net.Listener +		ln, err = net.Listen("tcp", tcpAddr.String()) +		if err != nil { +			break +		} +		if tcpln, ok := ln.(*net.TCPListener); ok { +			tcpListeners = append(tcpListeners, tcpln) +		} +	} +	if err != nil { +		// An error occurred, cleanup. +		for _, l := range tcpListeners { +			_ = l.Close() // Ignore errors, we are already cleaning. +		} +		tcpListeners = nil +	} +	return +} + +func (t TCPAddress) String() string { +	return fmt.Sprintf("%s:%d", t.Host, t.Port) +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sock/sock_supported.go b/vendor/github.com/tetratelabs/wazero/internal/sock/sock_supported.go new file mode 100644 index 000000000..e317be832 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sock/sock_supported.go @@ -0,0 +1,11 @@ +//go:build !plan9 && !js && !tinygo + +package sock + +import "syscall" + +const ( +	SHUT_RD   = syscall.SHUT_RD +	SHUT_RDWR = syscall.SHUT_RDWR +	SHUT_WR   = syscall.SHUT_WR +) diff --git a/vendor/github.com/tetratelabs/wazero/internal/sock/sock_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/sock/sock_unsupported.go new file mode 100644 index 000000000..77026754f --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sock/sock_unsupported.go @@ -0,0 +1,10 @@ +//go:build plan9 || js || tinygo + +package sock + +// plan9/js doesn't declare these constants +const ( +	SHUT_RD = 1 << iota +	SHUT_WR +	SHUT_RDWR = SHUT_RD | SHUT_WR +)  | 
