Skip to content

Commit 499c4b4

Browse files
use standard error types from the net package
Signed-off-by: Achille Roussel <[email protected]>
1 parent ca8fdd2 commit 499c4b4

File tree

5 files changed

+87
-69
lines changed

5 files changed

+87
-69
lines changed

internal/syscall/errno_wasip1.go

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,17 @@
44

55
package syscall
66

7-
import (
8-
"syscall"
9-
)
7+
import "syscall"
108

119
type Errno = syscall.Errno
1210

1311
const (
14-
EAGAIN Errno = 6
15-
EINPROGRESS Errno = 26
16-
EINTR Errno = 27
17-
EISCONN Errno = 30
18-
ENOSYS Errno = 52
19-
ENOTSUP Errno = 58
12+
EAGAIN = syscall.EAGAIN
13+
EINPROGRESS = syscall.EINPROGRESS
14+
EINTR = syscall.EINTR
15+
EISCONN = syscall.EISCONN
16+
ENOSYS = syscall.ENOSYS
17+
ENOTSUP = syscall.ENOTSUP
2018
)
2119

2220
// Do the interface allocations only once for common

wasip1/dial_wasip1.go

Lines changed: 34 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package wasip1
22

33
import (
44
"context"
5-
"fmt"
65
"net"
76
"net/http"
87
"os"
@@ -20,72 +19,65 @@ func init() {
2019
func Dial(network, address string) (net.Conn, error) {
2120
addr, err := lookupAddr("dial", network, address)
2221
if err != nil {
23-
return nil, err
22+
addr := &netAddr{network, address}
23+
return nil, dialErr(addr, err)
24+
}
25+
conn, err := dialAddr(addr)
26+
if err != nil {
27+
return nil, dialErr(addr, err)
2428
}
25-
return dialAddr(addr)
29+
return conn, nil
2630
}
2731

2832
// DialContext is a variant of Dial that accepts a context.
2933
func DialContext(ctx context.Context, network, address string) (net.Conn, error) {
3034
select {
3135
case <-ctx.Done():
32-
addr := &networkAddress{
33-
network: network,
34-
address: address,
35-
}
36-
return nil, dialErr(nil, addr, context.Cause(err))
36+
addr := &netAddr{network, address}
37+
return nil, dialErr(addr, context.Cause(ctx))
3738
default:
3839
return Dial(network, address)
3940
}
4041
}
4142

42-
func dialErr(source, addr net.Addr, err error) error {
43-
return &net.OpError{
44-
Op: "dial",
45-
Net: addr.Network(),
46-
Source: source,
47-
Addr: addr,
48-
Err: err,
49-
}
43+
func dialErr(addr net.Addr, err error) error {
44+
return newOpError("dial", addr, err)
5045
}
5146

52-
type networkAddress struct {
53-
network string
54-
address string
55-
}
56-
57-
func (na *networkAddress) Network() string { return na.address }
58-
func (na *networkAddress) String() string { return na.address }
59-
6047
func dialAddr(addr net.Addr) (net.Conn, error) {
6148
proto := family(addr)
6249
sotype := socketType(addr)
6350

6451
fd, err := syscall.Socket(proto, sotype, 0)
6552
if err != nil {
66-
return nil, err
53+
return nil, os.NewSyscallError("socket", err)
6754
}
6855

6956
if err := syscall.SetNonblock(fd, true); err != nil {
7057
syscall.Close(fd)
71-
return nil, fmt.Errorf("SetNonblock: %w", err)
58+
return nil, os.NewSyscallError("setnonblock", err)
7259
}
7360

7461
if sotype == syscall.SOCK_DGRAM && proto != syscall.AF_UNIX {
7562
if err := syscall.SetsockoptInt(fd, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1); err != nil {
7663
syscall.Close(fd)
77-
return nil, err
64+
return nil, os.NewSyscallError("setsockopt", err)
7865
}
7966
}
8067

68+
connectAddr, err := socketAddress(addr)
69+
if err != nil {
70+
return nil, os.NewSyscallError("connect", err)
71+
}
72+
8173
var inProgress bool
82-
switch err := syscall.Connect(fd, socketAddress(addr)); err {
74+
switch err := syscall.Connect(fd, connectAddr); err {
8375
case nil:
8476
case syscall.EINPROGRESS:
8577
inProgress = true
8678
default:
8779
syscall.Close(fd)
88-
return nil, fmt.Errorf("Connect: %w", err)
80+
return nil, os.NewSyscallError("connect", err)
8981
}
9082

9183
f := os.NewFile(uintptr(fd), "")
@@ -117,10 +109,11 @@ func dialAddr(addr net.Addr) (net.Conn, error) {
117109
return true
118110
}
119111
})
112+
if err == nil {
113+
err = rawConnErr
114+
}
120115
if err != nil {
121-
return nil, err
122-
} else if rawConnErr != nil {
123-
return nil, err
116+
return nil, os.NewSyscallError("connect", err)
124117
}
125118
}
126119

@@ -130,7 +123,6 @@ func dialAddr(addr net.Addr) (net.Conn, error) {
130123
}
131124

132125
// TODO: get local+peer address; wrap FileConn to implement LocalAddr() and RemoteAddr()
133-
134126
return c, nil
135127
}
136128

@@ -165,12 +157,12 @@ func socketType(addr net.Addr) int {
165157
}
166158
}
167159

168-
func socketAddress(addr net.Addr) syscall.Sockaddr {
160+
func socketAddress(addr net.Addr) (syscall.Sockaddr, error) {
169161
var ip net.IP
170162
var port int
171163
switch a := addr.(type) {
172164
case *net.UnixAddr:
173-
return &syscall.SockaddrUnix{Name: a.Name}
165+
return &syscall.SockaddrUnix{Name: a.Name}, nil
174166
case *net.TCPAddr:
175167
ip, port = a.IP, a.Port
176168
case *net.UDPAddr:
@@ -179,9 +171,13 @@ func socketAddress(addr net.Addr) syscall.Sockaddr {
179171
ip = a.IP
180172
}
181173
if ipv4 := ip.To4(); ipv4 != nil {
182-
return &syscall.SockaddrInet4{Addr: ([4]byte)(ipv4), Port: port}
174+
return &syscall.SockaddrInet4{Addr: ([4]byte)(ipv4), Port: port}, nil
183175
} else if len(ip) == net.IPv6len {
184-
return &syscall.SockaddrInet6{Addr: ([16]byte)(ip), Port: port}
176+
return &syscall.SockaddrInet6{Addr: ([16]byte)(ip), Port: port}, nil
177+
} else {
178+
return nil, &net.AddrError{
179+
Err: "unsupported address type",
180+
Addr: addr.String(),
181+
}
185182
}
186-
panic("not implemented")
187183
}

wasip1/listen_wasip1.go

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package wasip1
22

33
import (
4-
"fmt"
54
"net"
65
"os"
76

@@ -12,35 +11,49 @@ import (
1211
func Listen(network, address string) (net.Listener, error) {
1312
addr, err := lookupAddr("listen", network, address)
1413
if err != nil {
15-
return nil, err
14+
addr := &netAddr{network, address}
15+
return nil, listenErr(addr, err)
16+
}
17+
lstn, err := listenAddr(addr)
18+
if err != nil {
19+
return nil, listenErr(addr, err)
1620
}
17-
return listenAddr(addr)
21+
return lstn, nil
22+
}
23+
24+
func listenErr(addr net.Addr, err error) error {
25+
return newOpError("listen", addr, err)
1826
}
1927

2028
func listenAddr(addr net.Addr) (net.Listener, error) {
2129
fd, err := syscall.Socket(family(addr), socketType(addr), 0)
2230
if err != nil {
23-
return nil, fmt.Errorf("Socket: %w", err)
31+
return nil, os.NewSyscallError("socket", err)
2432
}
2533

2634
if err := syscall.SetNonblock(fd, true); err != nil {
2735
syscall.Close(fd)
28-
return nil, fmt.Errorf("SetNonBlock: %w", err)
36+
return nil, os.NewSyscallError("setnonblock", err)
2937
}
3038
if err := syscall.SetsockoptInt(fd, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1); err != nil {
3139
syscall.Close(fd)
32-
return nil, err
40+
return nil, os.NewSyscallError("setsockopt", err)
41+
}
42+
43+
listenAddr, err := socketAddress(addr)
44+
if err != nil {
45+
return nil, os.NewSyscallError("bind", err)
3346
}
3447

35-
if err := syscall.Bind(fd, socketAddress(addr)); err != nil {
48+
if err := syscall.Bind(fd, listenAddr); err != nil {
3649
syscall.Close(fd)
37-
return nil, fmt.Errorf("Bind: %w", err)
50+
return nil, os.NewSyscallError("bind", err)
3851
}
3952

4053
const backlog = 64 // TODO: configurable?
4154
if err := syscall.Listen(fd, backlog); err != nil {
4255
syscall.Close(fd)
43-
return nil, fmt.Errorf("Listen: %w", err)
56+
return nil, os.NewSyscallError("listen", err)
4457
}
4558

4659
f := os.NewFile(uintptr(fd), "")
@@ -50,7 +63,7 @@ func listenAddr(addr net.Addr) (net.Listener, error) {
5063
if err != nil {
5164
return nil, err
5265
}
53-
return &listener{l, addr}, err
66+
return &listener{l, addr}, nil
5467
}
5568

5669
type listener struct {

wasip1/lookup_wasip1.go

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
1+
//go:build wasip1 && !purego
2+
13
package wasip1
24

35
import (
4-
"fmt"
56
"net"
7+
"os"
68

7-
"github.com/stealthrocket/net/syscall"
9+
"github.com/stealthrocket/net/internal/syscall"
810
)
911

10-
func lookupAddr(context, network, address string) (net.Addr, error) {
12+
func lookupAddr(op, network, address string) (net.Addr, error) {
1113
var hints syscall.AddrInfo
1214
switch network {
1315
case "tcp", "tcp4", "tcp6":
@@ -19,7 +21,7 @@ func lookupAddr(context, network, address string) (net.Addr, error) {
1921
case "unix", "unixgram":
2022
return &net.UnixAddr{Name: address, Net: network}, nil
2123
default:
22-
return nil, fmt.Errorf("not implemented: %s", network)
24+
return nil, net.UnknownNetworkError(network)
2325
}
2426
switch network {
2527
case "tcp", "udp":
@@ -31,16 +33,17 @@ func lookupAddr(context, network, address string) (net.Addr, error) {
3133
}
3234
hostname, service, err := net.SplitHostPort(address)
3335
if err != nil {
34-
return nil, err
36+
return nil, net.InvalidAddrError(address)
3537
}
36-
if context == "listen" && hostname == "" {
38+
if op == "listen" && hostname == "" {
3739
hints.Flags |= syscall.AI_PASSIVE
3840
}
3941

4042
results := make([]syscall.AddrInfo, 16)
4143
n, err := syscall.Getaddrinfo(hostname, service, hints, results)
4244
if err != nil {
43-
return nil, err
45+
addr := &netAddr{network, address}
46+
return nil, newOpError(op, addr, os.NewSyscallError("getaddrinfo", err))
4447
}
4548
results = results[:n]
4649
for _, r := range results {
@@ -61,5 +64,9 @@ func lookupAddr(context, network, address string) (net.Addr, error) {
6164
return &net.UDPAddr{IP: ip, Port: port}, nil
6265
}
6366
}
64-
return nil, &net.DNSError{Err: "lookup failed", Name: hostname, IsNotFound: true}
67+
return nil, &net.DNSError{
68+
Err: "lookup failed",
69+
Name: hostname,
70+
IsNotFound: true,
71+
}
6572
}

lookup_wasip1_purego.go renamed to wasip1/lookup_wasip1_purego.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//go:build wasip1 && purego
22

3-
package net
3+
package wasip1
44

55
import (
66
"fmt"
@@ -18,11 +18,11 @@ func lookupAddr(context, network, address string) (net.Addr, error) {
1818
case "unix", "unixgram":
1919
return &net.UnixAddr{Name: address, Net: network}, nil
2020
default:
21-
return nil, fmt.Errorf("not implemented: %s", network)
21+
return nil, net.UnknownNetworkError(network)
2222
}
2323
hostname, service, err := net.SplitHostPort(address)
2424
if err != nil {
25-
return nil, err
25+
return nil, net.InvalidAddrError(address)
2626
}
2727
port, err := net.LookupPort(network, service)
2828
if err != nil {
@@ -71,5 +71,9 @@ func lookupAddr(context, network, address string) (net.Addr, error) {
7171
}
7272
}
7373
}
74-
return nil, &net.DNSError{Err: "lookup failed", Name: hostname, IsNotFound: true}
74+
return nil, &net.DNSError{
75+
Err: "lookup failed",
76+
Name: hostname,
77+
IsNotFound: true,
78+
}
7579
}

0 commit comments

Comments
 (0)