mirror of
https://github.com/tinygo-org/net.git
synced 2026-08-22 05:18:59 +00:00
stub out more types/funcs to compile against golang.org/x/net/internal/socket (#17)
* stub out more types/funcs to compile against golang.org/x/net/internal/socket These are changes need to compile github.com/domainr/dnsr/ with TinyGo. See issue tinygo-org/net#14. These change are mostly to fix missing symbols in src/net. Missing types and functions are cut-and-pasted from go1.21.4. Functions are stubbed out returning errors.New("not implemented"). DNRS is compiled by running tinygo test: sfeldma@nuc:~/work/dnsr$ tinygo test -target=wasi With this patch, and a corresponding patch for tinygo/ to fixup crypto/tls, you should get a clean compile.
This commit is contained in:
@@ -49,9 +49,11 @@ src/net
|
|||||||
│ ├── status.go
|
│ ├── status.go
|
||||||
│ ├── transfer.go *
|
│ ├── transfer.go *
|
||||||
│ └── transport.go *
|
│ └── transport.go *
|
||||||
|
├── interface.go *
|
||||||
├── ip.go
|
├── ip.go
|
||||||
├── iprawsock.go *
|
├── iprawsock.go *
|
||||||
├── ipsock.go *
|
├── ipsock.go *
|
||||||
|
├── lookup.go *
|
||||||
├── mac.go
|
├── mac.go
|
||||||
├── mac_test.go
|
├── mac_test.go
|
||||||
├── netdev.go +
|
├── netdev.go +
|
||||||
@@ -61,10 +63,12 @@ src/net
|
|||||||
├── README.md
|
├── README.md
|
||||||
├── tcpsock.go *
|
├── tcpsock.go *
|
||||||
├── tlssock.go +
|
├── tlssock.go +
|
||||||
└── udpsock.go *
|
├── udpsock.go *
|
||||||
|
└── unixsock.go *
|
||||||
|
|
||||||
src/crypto/tls/
|
src/crypto/tls/
|
||||||
├── common.go *
|
├── common.go *
|
||||||
|
├── ticket.go *
|
||||||
└── tls.go *
|
└── tls.go *
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,9 @@ package net
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -24,6 +26,9 @@ const (
|
|||||||
defaultTCPKeepAlive = 15 * time.Second
|
defaultTCPKeepAlive = 15 * time.Second
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// mptcpStatus is a tristate for Multipath TCP, see go.dev/issue/56539
|
||||||
|
type mptcpStatus uint8
|
||||||
|
|
||||||
// A Dialer contains options for connecting to an address.
|
// A Dialer contains options for connecting to an address.
|
||||||
//
|
//
|
||||||
// The zero value for each field is equivalent to dialing
|
// The zero value for each field is equivalent to dialing
|
||||||
@@ -146,6 +151,46 @@ func (d *Dialer) DialContext(ctx context.Context, network, address string) (Conn
|
|||||||
return nil, fmt.Errorf("Network %s not supported", network)
|
return nil, fmt.Errorf("Network %s not supported", network)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ListenConfig contains options for listening to an address.
|
||||||
|
type ListenConfig struct {
|
||||||
|
// If Control is not nil, it is called after creating the network
|
||||||
|
// connection but before binding it to the operating system.
|
||||||
|
//
|
||||||
|
// Network and address parameters passed to Control method are not
|
||||||
|
// necessarily the ones passed to Listen. For example, passing "tcp" to
|
||||||
|
// Listen will cause the Control function to be called with "tcp4" or "tcp6".
|
||||||
|
Control func(network, address string, c syscall.RawConn) error
|
||||||
|
|
||||||
|
// KeepAlive specifies the keep-alive period for network
|
||||||
|
// connections accepted by this listener.
|
||||||
|
// If zero, keep-alives are enabled if supported by the protocol
|
||||||
|
// and operating system. Network protocols or operating systems
|
||||||
|
// that do not support keep-alives ignore this field.
|
||||||
|
// If negative, keep-alives are disabled.
|
||||||
|
KeepAlive time.Duration
|
||||||
|
|
||||||
|
// If mptcpStatus is set to a value allowing Multipath TCP (MPTCP) to be
|
||||||
|
// used, any call to Listen with "tcp(4|6)" as network will use MPTCP if
|
||||||
|
// supported by the operating system.
|
||||||
|
mptcpStatus mptcpStatus
|
||||||
|
}
|
||||||
|
|
||||||
|
// Listen announces on the local network address.
|
||||||
|
//
|
||||||
|
// See func Listen for a description of the network and address
|
||||||
|
// parameters.
|
||||||
|
func (lc *ListenConfig) Listen(ctx context.Context, network, address string) (Listener, error) {
|
||||||
|
return nil, errors.New("dial:ListenConfig:Listen not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListenPacket announces on the local network address.
|
||||||
|
//
|
||||||
|
// See func ListenPacket for a description of the network and address
|
||||||
|
// parameters.
|
||||||
|
func (lc *ListenConfig) ListenPacket(ctx context.Context, network, address string) (PacketConn, error) {
|
||||||
|
return nil, errors.New("dial:ListenConfig:ListenPacket not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
// Listen announces on the local network address.
|
// Listen announces on the local network address.
|
||||||
//
|
//
|
||||||
// See Go "net" package Listen() for more information.
|
// See Go "net" package Listen() for more information.
|
||||||
|
|||||||
@@ -0,0 +1,86 @@
|
|||||||
|
// TINYGO: The following is copied and modified from Go 1.21.4 official implementation.
|
||||||
|
|
||||||
|
// Copyright 2011 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 net
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
// BUG(mikio): On JS, methods and functions related to
|
||||||
|
// Interface are not implemented.
|
||||||
|
|
||||||
|
// BUG(mikio): On AIX, DragonFly BSD, NetBSD, OpenBSD, Plan 9 and
|
||||||
|
// Solaris, the MulticastAddrs method of Interface is not implemented.
|
||||||
|
|
||||||
|
var (
|
||||||
|
errInvalidInterface = errors.New("invalid network interface")
|
||||||
|
errInvalidInterfaceIndex = errors.New("invalid network interface index")
|
||||||
|
errInvalidInterfaceName = errors.New("invalid network interface name")
|
||||||
|
errNoSuchInterface = errors.New("no such network interface")
|
||||||
|
errNoSuchMulticastInterface = errors.New("no such multicast network interface")
|
||||||
|
)
|
||||||
|
|
||||||
|
// Interface represents a mapping between network interface name
|
||||||
|
// and index. It also represents network interface facility
|
||||||
|
// information.
|
||||||
|
type Interface struct {
|
||||||
|
Index int // positive integer that starts at one, zero is never used
|
||||||
|
MTU int // maximum transmission unit
|
||||||
|
Name string // e.g., "en0", "lo0", "eth0.100"
|
||||||
|
HardwareAddr HardwareAddr // IEEE MAC-48, EUI-48 and EUI-64 form
|
||||||
|
Flags Flags // e.g., FlagUp, FlagLoopback, FlagMulticast
|
||||||
|
}
|
||||||
|
|
||||||
|
type Flags uint
|
||||||
|
|
||||||
|
const (
|
||||||
|
FlagUp Flags = 1 << iota // interface is administratively up
|
||||||
|
FlagBroadcast // interface supports broadcast access capability
|
||||||
|
FlagLoopback // interface is a loopback interface
|
||||||
|
FlagPointToPoint // interface belongs to a point-to-point link
|
||||||
|
FlagMulticast // interface supports multicast access capability
|
||||||
|
FlagRunning // interface is in running state
|
||||||
|
)
|
||||||
|
|
||||||
|
var flagNames = []string{
|
||||||
|
"up",
|
||||||
|
"broadcast",
|
||||||
|
"loopback",
|
||||||
|
"pointtopoint",
|
||||||
|
"multicast",
|
||||||
|
"running",
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f Flags) String() string {
|
||||||
|
s := ""
|
||||||
|
for i, name := range flagNames {
|
||||||
|
if f&(1<<uint(i)) != 0 {
|
||||||
|
if s != "" {
|
||||||
|
s += "|"
|
||||||
|
}
|
||||||
|
s += name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if s == "" {
|
||||||
|
s = "0"
|
||||||
|
}
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
// Interfaces returns a list of the system's network interfaces.
|
||||||
|
func Interfaces() ([]Interface, error) {
|
||||||
|
return nil, errors.New("Interfaces not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
// InterfaceByIndex returns the interface specified by index.
|
||||||
|
//
|
||||||
|
// On Solaris, it returns one of the logical network interfaces
|
||||||
|
// sharing the logical data link; for more precision use
|
||||||
|
// InterfaceByName.
|
||||||
|
func InterfaceByIndex(index int) (*Interface, error) {
|
||||||
|
return nil, errors.New("InterfaceByIndex not implemented")
|
||||||
|
}
|
||||||
@@ -6,6 +6,11 @@
|
|||||||
|
|
||||||
package net
|
package net
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
// BUG(mikio): On every POSIX platform, reads from the "ip4" network
|
// BUG(mikio): On every POSIX platform, reads from the "ip4" network
|
||||||
// using the ReadFrom or ReadFromIP method might not return a complete
|
// using the ReadFrom or ReadFromIP method might not return a complete
|
||||||
// IPv4 packet, including its header, even if there is space
|
// IPv4 packet, including its header, even if there is space
|
||||||
@@ -57,3 +62,42 @@ func (a *IPAddr) opAddr() Addr {
|
|||||||
}
|
}
|
||||||
return a
|
return a
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IPConn is the implementation of the Conn and PacketConn interfaces
|
||||||
|
// for IP network connections.
|
||||||
|
type IPConn struct {
|
||||||
|
conn
|
||||||
|
}
|
||||||
|
|
||||||
|
// SyscallConn returns a raw network connection.
|
||||||
|
// This implements the syscall.Conn interface.
|
||||||
|
func (c *IPConn) SyscallConn() (syscall.RawConn, error) {
|
||||||
|
return nil, errors.New("SyscallConn not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReadMsgIP reads a message from c, copying the payload into b and
|
||||||
|
// the associated out-of-band data into oob. It returns the number of
|
||||||
|
// bytes copied into b, the number of bytes copied into oob, the flags
|
||||||
|
// that were set on the message and the source address of the message.
|
||||||
|
//
|
||||||
|
// The packages golang.org/x/net/ipv4 and golang.org/x/net/ipv6 can be
|
||||||
|
// used to manipulate IP-level socket options in oob.
|
||||||
|
func (c *IPConn) ReadMsgIP(b, oob []byte) (n, oobn, flags int, addr *IPAddr, err error) {
|
||||||
|
err = errors.New("ReadMsgIP not implemented")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReadFrom implements the PacketConn ReadFrom method.
|
||||||
|
func (c *IPConn) ReadFrom(b []byte) (int, Addr, error) {
|
||||||
|
return 0, nil, errors.New("ReadFrom not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
// WriteToIP acts like WriteTo but takes an IPAddr.
|
||||||
|
func (c *IPConn) WriteToIP(b []byte, addr *IPAddr) (int, error) {
|
||||||
|
return 0, errors.New("WriteToIP not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
// WriteTo implements the PacketConn WriteTo method.
|
||||||
|
func (c *IPConn) WriteTo(b []byte, addr Addr) (int, error) {
|
||||||
|
return 0, errors.New("WriteTo not implemented")
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
// TINYGO: The following is copied and modified from Go 1.21.4 official implementation.
|
||||||
|
|
||||||
|
// Copyright 2012 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 net
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
// LookupPort looks up the port for the given network and service.
|
||||||
|
//
|
||||||
|
// LookupPort uses context.Background internally; to specify the context, use
|
||||||
|
// Resolver.LookupPort.
|
||||||
|
func LookupPort(network, service string) (port int, err error) {
|
||||||
|
return 0, errors.New("net:LookupPort not implemented")
|
||||||
|
}
|
||||||
@@ -7,6 +7,7 @@
|
|||||||
package net
|
package net
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -80,6 +81,102 @@ type Conn interface {
|
|||||||
SetWriteDeadline(t time.Time) error
|
SetWriteDeadline(t time.Time) error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type conn struct {
|
||||||
|
// TINYGO: no fd defined
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close closes the connection.
|
||||||
|
func (c *conn) Close() error {
|
||||||
|
return errors.New("conn.Close not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
// LocalAddr returns the local network address.
|
||||||
|
// The Addr returned is shared by all invocations of LocalAddr, so
|
||||||
|
// do not modify it.
|
||||||
|
func (c *conn) LocalAddr() Addr {
|
||||||
|
// TINYGO: not implemented
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetDeadline implements the Conn SetDeadline method.
|
||||||
|
func (c *conn) SetDeadline(t time.Time) error {
|
||||||
|
return errors.New("conn.SetDeadline not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetReadDeadline implements the Conn SetReadDeadline method.
|
||||||
|
func (c *conn) SetReadDeadline(t time.Time) error {
|
||||||
|
return errors.New("conn.SetReadDeadline not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetWriteDeadline implements the Conn SetWriteDeadline method.
|
||||||
|
func (c *conn) SetWriteDeadline(t time.Time) error {
|
||||||
|
return errors.New("conn.SetWriteDeadline not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
// PacketConn is a generic packet-oriented network connection.
|
||||||
|
//
|
||||||
|
// Multiple goroutines may invoke methods on a PacketConn simultaneously.
|
||||||
|
type PacketConn interface {
|
||||||
|
// ReadFrom reads a packet from the connection,
|
||||||
|
// copying the payload into p. It returns the number of
|
||||||
|
// bytes copied into p and the return address that
|
||||||
|
// was on the packet.
|
||||||
|
// It returns the number of bytes read (0 <= n <= len(p))
|
||||||
|
// and any error encountered. Callers should always process
|
||||||
|
// the n > 0 bytes returned before considering the error err.
|
||||||
|
// ReadFrom can be made to time out and return an error after a
|
||||||
|
// fixed time limit; see SetDeadline and SetReadDeadline.
|
||||||
|
ReadFrom(p []byte) (n int, addr Addr, err error)
|
||||||
|
|
||||||
|
// WriteTo writes a packet with payload p to addr.
|
||||||
|
// WriteTo can be made to time out and return an Error after a
|
||||||
|
// fixed time limit; see SetDeadline and SetWriteDeadline.
|
||||||
|
// On packet-oriented connections, write timeouts are rare.
|
||||||
|
WriteTo(p []byte, addr Addr) (n int, err error)
|
||||||
|
|
||||||
|
// Close closes the connection.
|
||||||
|
// Any blocked ReadFrom or WriteTo operations will be unblocked and return errors.
|
||||||
|
Close() error
|
||||||
|
|
||||||
|
// LocalAddr returns the local network address, if known.
|
||||||
|
LocalAddr() Addr
|
||||||
|
|
||||||
|
// SetDeadline sets the read and write deadlines associated
|
||||||
|
// with the connection. It is equivalent to calling both
|
||||||
|
// SetReadDeadline and SetWriteDeadline.
|
||||||
|
//
|
||||||
|
// A deadline is an absolute time after which I/O operations
|
||||||
|
// fail instead of blocking. The deadline applies to all future
|
||||||
|
// and pending I/O, not just the immediately following call to
|
||||||
|
// Read or Write. After a deadline has been exceeded, the
|
||||||
|
// connection can be refreshed by setting a deadline in the future.
|
||||||
|
//
|
||||||
|
// If the deadline is exceeded a call to Read or Write or to other
|
||||||
|
// I/O methods will return an error that wraps os.ErrDeadlineExceeded.
|
||||||
|
// This can be tested using errors.Is(err, os.ErrDeadlineExceeded).
|
||||||
|
// The error's Timeout method will return true, but note that there
|
||||||
|
// are other possible errors for which the Timeout method will
|
||||||
|
// return true even if the deadline has not been exceeded.
|
||||||
|
//
|
||||||
|
// An idle timeout can be implemented by repeatedly extending
|
||||||
|
// the deadline after successful ReadFrom or WriteTo calls.
|
||||||
|
//
|
||||||
|
// A zero value for t means I/O operations will not time out.
|
||||||
|
SetDeadline(t time.Time) error
|
||||||
|
|
||||||
|
// SetReadDeadline sets the deadline for future ReadFrom calls
|
||||||
|
// and any currently-blocked ReadFrom call.
|
||||||
|
// A zero value for t means ReadFrom will not time out.
|
||||||
|
SetReadDeadline(t time.Time) error
|
||||||
|
|
||||||
|
// SetWriteDeadline sets the deadline for future WriteTo calls
|
||||||
|
// and any currently-blocked WriteTo call.
|
||||||
|
// Even if write times out, it may return n > 0, indicating that
|
||||||
|
// some of the data was successfully written.
|
||||||
|
// A zero value for t means WriteTo will not time out.
|
||||||
|
SetWriteDeadline(t time.Time) error
|
||||||
|
}
|
||||||
|
|
||||||
// A Listener is a generic network listener for stream-oriented protocols.
|
// A Listener is a generic network listener for stream-oriented protocols.
|
||||||
//
|
//
|
||||||
// Multiple goroutines may invoke methods on a Listener simultaneously.
|
// Multiple goroutines may invoke methods on a Listener simultaneously.
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ const (
|
|||||||
_SOCK_DGRAM = 0x2
|
_SOCK_DGRAM = 0x2
|
||||||
_SOL_SOCKET = 0x1
|
_SOL_SOCKET = 0x1
|
||||||
_SO_KEEPALIVE = 0x9
|
_SO_KEEPALIVE = 0x9
|
||||||
|
_SO_LINGER = 0xd
|
||||||
_SOL_TCP = 0x6
|
_SOL_TCP = 0x6
|
||||||
_TCP_KEEPINTVL = 0x5
|
_TCP_KEEPINTVL = 0x5
|
||||||
_IPPROTO_TCP = 0x6
|
_IPPROTO_TCP = 0x6
|
||||||
|
|||||||
+28
@@ -13,6 +13,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -178,6 +179,12 @@ func DialTCP(network string, laddr, raddr *TCPAddr) (*TCPConn, error) {
|
|||||||
|
|
||||||
// TINYGO: Use netdev for Conn methods: Read = Recv, Write = Send, etc.
|
// TINYGO: Use netdev for Conn methods: Read = Recv, Write = Send, etc.
|
||||||
|
|
||||||
|
// SyscallConn returns a raw network connection.
|
||||||
|
// This implements the syscall.Conn interface.
|
||||||
|
func (c *TCPConn) SyscallConn() (syscall.RawConn, error) {
|
||||||
|
return nil, errors.New("SyscallConn not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
func (c *TCPConn) Read(b []byte) (int, error) {
|
func (c *TCPConn) Read(b []byte) (int, error) {
|
||||||
n, err := netdev.Recv(c.fd, b, 0, c.readDeadline)
|
n, err := netdev.Recv(c.fd, b, 0, c.readDeadline)
|
||||||
// Turn the -1 socket error into 0 and let err speak for error
|
// Turn the -1 socket error into 0 and let err speak for error
|
||||||
@@ -220,10 +227,31 @@ func (c *TCPConn) SetDeadline(t time.Time) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetLinger sets the behavior of Close on a connection which still
|
||||||
|
// has data waiting to be sent or to be acknowledged.
|
||||||
|
//
|
||||||
|
// If sec < 0 (the default), the operating system finishes sending the
|
||||||
|
// data in the background.
|
||||||
|
//
|
||||||
|
// If sec == 0, the operating system discards any unsent or
|
||||||
|
// unacknowledged data.
|
||||||
|
//
|
||||||
|
// If sec > 0, the data is sent in the background as with sec < 0.
|
||||||
|
// On some operating systems including Linux, this may cause Close to block
|
||||||
|
// until all data has been sent or discarded.
|
||||||
|
// On some operating systems after sec seconds have elapsed any remaining
|
||||||
|
// unsent data may be discarded.
|
||||||
|
func (c *TCPConn) SetLinger(sec int) error {
|
||||||
|
return netdev.SetSockOpt(c.fd, _SOL_SOCKET, _SO_LINGER, sec)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetKeepAlive sets whether the operating system should send
|
||||||
|
// keep-alive messages on the connection.
|
||||||
func (c *TCPConn) SetKeepAlive(keepalive bool) error {
|
func (c *TCPConn) SetKeepAlive(keepalive bool) error {
|
||||||
return netdev.SetSockOpt(c.fd, _SOL_SOCKET, _SO_KEEPALIVE, keepalive)
|
return netdev.SetSockOpt(c.fd, _SOL_SOCKET, _SO_KEEPALIVE, keepalive)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetKeepAlivePeriod sets period between keep-alives.
|
||||||
func (c *TCPConn) SetKeepAlivePeriod(d time.Duration) error {
|
func (c *TCPConn) SetKeepAlivePeriod(d time.Duration) error {
|
||||||
// Units are 1/2 seconds
|
// Units are 1/2 seconds
|
||||||
return netdev.SetSockOpt(c.fd, _SOL_TCP, _TCP_KEEPINTVL, 2*d.Seconds())
|
return netdev.SetSockOpt(c.fd, _SOL_TCP, _TCP_KEEPINTVL, 2*d.Seconds())
|
||||||
|
|||||||
+42
@@ -7,11 +7,13 @@
|
|||||||
package net
|
package net
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"internal/itoa"
|
"internal/itoa"
|
||||||
"io"
|
"io"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -198,6 +200,12 @@ func DialUDP(network string, laddr, raddr *UDPAddr) (*UDPConn, error) {
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SyscallConn returns a raw network connection.
|
||||||
|
// This implements the syscall.Conn interface.
|
||||||
|
func (c *UDPConn) SyscallConn() (syscall.RawConn, error) {
|
||||||
|
return nil, errors.New("SyscallConn not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
// TINYGO: Use netdev for Conn methods: Read = Recv, Write = Send, etc.
|
// TINYGO: Use netdev for Conn methods: Read = Recv, Write = Send, etc.
|
||||||
|
|
||||||
func (c *UDPConn) Read(b []byte) (int, error) {
|
func (c *UDPConn) Read(b []byte) (int, error) {
|
||||||
@@ -224,6 +232,40 @@ func (c *UDPConn) Write(b []byte) (int, error) {
|
|||||||
return n, err
|
return n, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ReadFrom implements the PacketConn ReadFrom method.
|
||||||
|
func (c *UDPConn) ReadFrom(b []byte) (int, Addr, error) {
|
||||||
|
return 0, nil, errors.New("ReadFrom not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReadMsgUDP reads a message from c, copying the payload into b and
|
||||||
|
// the associated out-of-band data into oob. It returns the number of
|
||||||
|
// bytes copied into b, the number of bytes copied into oob, the flags
|
||||||
|
// that were set on the message and the source address of the message.
|
||||||
|
//
|
||||||
|
// The packages golang.org/x/net/ipv4 and golang.org/x/net/ipv6 can be
|
||||||
|
// used to manipulate IP-level socket options in oob.
|
||||||
|
func (c *UDPConn) ReadMsgUDP(b, oob []byte) (n, oobn, flags int, addr *UDPAddr, err error) {
|
||||||
|
err = errors.New("ReadMsgUDP not implemented")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// WriteTo implements the PacketConn WriteTo method.
|
||||||
|
func (c *UDPConn) WriteTo(b []byte, addr Addr) (int, error) {
|
||||||
|
return 0, errors.New("WriteTo not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
// WriteMsgUDP writes a message to addr via c if c isn't connected, or
|
||||||
|
// to c's remote address if c is connected (in which case addr must be
|
||||||
|
// nil). The payload is copied from b and the associated out-of-band
|
||||||
|
// data is copied from oob. It returns the number of payload and
|
||||||
|
// out-of-band bytes written.
|
||||||
|
//
|
||||||
|
// The packages golang.org/x/net/ipv4 and golang.org/x/net/ipv6 can be
|
||||||
|
// used to manipulate IP-level socket options in oob.
|
||||||
|
func (c *UDPConn) WriteMsgUDP(b, oob []byte, addr *UDPAddr) (n, oobn int, err error) {
|
||||||
|
return 0, 0, errors.New("WriteMsgUDP not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
func (c *UDPConn) Close() error {
|
func (c *UDPConn) Close() error {
|
||||||
return netdev.Close(c.fd)
|
return netdev.Close(c.fd)
|
||||||
}
|
}
|
||||||
|
|||||||
+43
@@ -0,0 +1,43 @@
|
|||||||
|
// TINYGO: The following is copied and modified from Go 1.21.4 official implementation.
|
||||||
|
|
||||||
|
// Copyright 2009 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 net
|
||||||
|
|
||||||
|
// BUG(mikio): On JS, WASIP1 and Plan 9, methods and functions related
|
||||||
|
// to UnixConn and UnixListener are not implemented.
|
||||||
|
|
||||||
|
// BUG(mikio): On Windows, methods and functions related to UnixConn
|
||||||
|
// and UnixListener don't work for "unixgram" and "unixpacket".
|
||||||
|
|
||||||
|
// UnixAddr represents the address of a Unix domain socket end point.
|
||||||
|
type UnixAddr struct {
|
||||||
|
Name string
|
||||||
|
Net string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Network returns the address's network name, "unix", "unixgram" or
|
||||||
|
// "unixpacket".
|
||||||
|
func (a *UnixAddr) Network() string {
|
||||||
|
return a.Net
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *UnixAddr) String() string {
|
||||||
|
if a == nil {
|
||||||
|
return "<nil>"
|
||||||
|
}
|
||||||
|
return a.Name
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *UnixAddr) isWildcard() bool {
|
||||||
|
return a == nil || a.Name == ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *UnixAddr) opAddr() Addr {
|
||||||
|
if a == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return a
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user