Skip to content

Commit f7bbf32

Browse files
fix wasmedge getaddrinfo + test address lookup
Signed-off-by: Achille Roussel <[email protected]>
1 parent 67f851e commit f7bbf32

File tree

9 files changed

+287
-52
lines changed

9 files changed

+287
-52
lines changed

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ GO ?= gotip
44
GOPATH ?= $(shell $(GO) env GOPATH)
55
wasirun = $(GOPATH)/bin/wasirun
66

7-
packages.dir = $(wildcard */)
7+
packages.dir = $(filter-out testdata/,$(wildcard */))
88
packages.test = $(packages.dir:/=.test)
99
test: proto wasirun $(packages.test)
1010
@for pkg in $(packages.test); do \
1111
tmp=$$(mktemp); \
12-
$(wasirun) --dir=/ $$pkg > $$tmp; \
12+
$(wasirun) --dir=/ --dns-server=127.0.0.1:5453 $$pkg > $$tmp; \
1313
if (($$?)); then cat $$tmp; exit 1; else printf "ok\tgithub.com/stealthrocket/net/$$pkg\n"; fi \
1414
done
1515

docker-compose.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,13 @@ services:
3030
POSTGRES_PASSWORD: password
3131
ports:
3232
- '5432:5432'
33+
34+
coredns:
35+
image: coredns/coredns:1.10.1
36+
command:
37+
- '-conf=/etc/coredns/Corefile'
38+
ports:
39+
- '5453:53/tcp'
40+
- '5453:53/udp'
41+
volumes:
42+
- ./testdata/etc/coredns:/etc/coredns

testdata/etc/coredns/Corefile

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
. {
2+
log
3+
errors
4+
hosts {
5+
10.0.0.1 example.com
6+
10.0.0.2 example.com
7+
fe80::ec34:70ff:fe53:470e example.com
8+
}
9+
}

wasip1/dial_wasip1.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,16 +86,23 @@ func Dial(network, address string) (net.Conn, error) {
8686

8787
// DialContext is a variant of Dial that accepts a context.
8888
func DialContext(ctx context.Context, network, address string) (net.Conn, error) {
89-
addr, err := lookupAddr("dial", network, address)
89+
addrs, err := lookupAddr(ctx, "dial", network, address)
9090
if err != nil {
9191
addr := &netAddr{network, address}
9292
return nil, dialErr(addr, err)
9393
}
94-
conn, err := dialAddr(ctx, addr)
95-
if err != nil {
96-
return nil, dialErr(addr, err)
94+
var addr net.Addr
95+
var conn net.Conn
96+
for _, addr = range addrs {
97+
conn, err = dialAddr(ctx, addr)
98+
if err == nil {
99+
return conn, nil
100+
}
101+
if ctx.Err() != nil {
102+
break
103+
}
97104
}
98-
return conn, nil
105+
return nil, dialErr(addr, err)
99106
}
100107

101108
func dialErr(addr net.Addr, err error) error {

wasip1/listen_wasip1.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,22 @@
33
package wasip1
44

55
import (
6+
"context"
67
"net"
78
"os"
89
"syscall"
910
)
1011

1112
// Listen announces on the local network address.
1213
func Listen(network, address string) (net.Listener, error) {
13-
addr, err := lookupAddr("listen", network, address)
14+
addrs, err := lookupAddr(context.Background(), "listen", network, address)
1415
if err != nil {
1516
addr := &netAddr{network, address}
1617
return nil, listenErr(addr, err)
1718
}
18-
lstn, err := listenAddr(addr)
19+
lstn, err := listenAddr(addrs[0])
1920
if err != nil {
20-
return nil, listenErr(addr, err)
21+
return nil, listenErr(addrs[0], err)
2122
}
2223
return lstn, nil
2324
}

wasip1/lookup_wasip1.go

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@ func init() {
2727
net.DefaultResolver.Dial = dialResolverNotSupported
2828
}
2929

30-
func lookupAddr(op, network, address string) (net.Addr, error) {
30+
func lookupAddr(ctx context.Context, op, network, address string) ([]net.Addr, error) {
3131
var hints addrInfo
32+
3233
switch network {
3334
case "tcp", "tcp4", "tcp6":
3435
hints.socketType = SOCK_STREAM
@@ -37,10 +38,11 @@ func lookupAddr(op, network, address string) (net.Addr, error) {
3738
hints.socketType = SOCK_DGRAM
3839
hints.protocol = IPPROTO_UDP
3940
case "unix", "unixgram":
40-
return &net.UnixAddr{Name: address, Net: network}, nil
41+
return []net.Addr{&net.UnixAddr{Name: address, Net: network}}, nil
4142
default:
4243
return nil, net.UnknownNetworkError(network)
4344
}
45+
4446
switch network {
4547
case "tcp", "udp":
4648
hints.family = AF_UNSPEC
@@ -49,9 +51,10 @@ func lookupAddr(op, network, address string) (net.Addr, error) {
4951
case "tcp6", "udp6":
5052
hints.family = AF_INET6
5153
}
54+
5255
hostname, service, err := net.SplitHostPort(address)
5356
if err != nil {
54-
return nil, net.InvalidAddrError(address)
57+
return nil, err
5558
}
5659
if ip := net.ParseIP(hostname); ip != nil {
5760
hints.flags |= AI_NUMERICHOST
@@ -63,14 +66,15 @@ func lookupAddr(op, network, address string) (net.Addr, error) {
6366
hints.flags |= AI_PASSIVE
6467
}
6568

66-
results := make([]addrInfo, 16)
69+
results := make([]addrInfo, 8)
6770
n, err := getaddrinfo(hostname, service, &hints, results)
6871
if err != nil {
6972
addr := &netAddr{network, address}
7073
return nil, newOpError(op, addr, os.NewSyscallError("getaddrinfo", err))
7174
}
72-
results = results[:n]
73-
for _, r := range results {
75+
76+
addrs := make([]net.Addr, 0, n)
77+
for _, r := range results[:n] {
7478
var ip net.IP
7579
var port int
7680
switch a := r.address.(type) {
@@ -83,11 +87,15 @@ func lookupAddr(op, network, address string) (net.Addr, error) {
8387
}
8488
switch network {
8589
case "tcp", "tcp4", "tcp6":
86-
return &net.TCPAddr{IP: ip, Port: port}, nil
90+
addrs = append(addrs, &net.TCPAddr{IP: ip, Port: port})
8791
case "udp", "udp4", "udp6":
88-
return &net.UDPAddr{IP: ip, Port: port}, nil
92+
addrs = append(addrs, &net.UDPAddr{IP: ip, Port: port})
8993
}
9094
}
95+
if len(addrs) != 0 {
96+
return addrs, nil
97+
}
98+
9199
return nil, &net.DNSError{
92100
Err: "lookup failed",
93101
Name: hostname,

wasip1/lookup_wasip1_purego.go

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,74 +3,74 @@
33
package wasip1
44

55
import (
6-
"fmt"
6+
"context"
77
"net"
88
)
99

1010
func init() {
1111
net.DefaultResolver.Dial = DialContext
1212
}
1313

14-
func lookupAddr(context, network, address string) (net.Addr, error) {
14+
func lookupAddr(ctx context.Context, op, network, address string) ([]net.Addr, error) {
1515
switch network {
1616
case "tcp", "tcp4", "tcp6":
1717
case "udp", "udp4", "udp6":
1818
case "unix", "unixgram":
19-
return &net.UnixAddr{Name: address, Net: network}, nil
19+
return []net.Addr{&net.UnixAddr{Name: address, Net: network}}, nil
2020
default:
2121
return nil, net.UnknownNetworkError(network)
2222
}
23+
2324
hostname, service, err := net.SplitHostPort(address)
2425
if err != nil {
2526
return nil, net.InvalidAddrError(address)
2627
}
27-
port, err := net.LookupPort(network, service)
28+
29+
port, err := net.DefaultResolver.LookupPort(ctx, network, service)
2830
if err != nil {
2931
return nil, err
3032
}
33+
3134
if hostname == "" {
32-
if context == "listen" {
35+
if op == "listen" {
3336
switch network {
3437
case "tcp", "tcp4":
35-
return &net.TCPAddr{IP: net.IPv4zero, Port: port}, nil
38+
return []net.Addr{&net.TCPAddr{IP: net.IPv4zero, Port: port}}, nil
3639
case "tcp6":
37-
return &net.TCPAddr{IP: net.IPv6zero, Port: port}, nil
40+
return []net.Addr{&net.TCPAddr{IP: net.IPv6zero, Port: port}}, nil
3841
}
3942
}
40-
return nil, fmt.Errorf("invalid address %q for %s", address, context)
43+
return nil, net.InvalidAddrError(address)
4144
}
42-
ips, err := net.LookupIP(hostname)
45+
46+
ipAddrs, err := net.DefaultResolver.LookupIPAddr(ctx, hostname)
4347
if err != nil {
4448
return nil, err
4549
}
46-
if network == "tcp" || network == "tcp4" {
47-
for _, ip := range ips {
48-
if len(ip) == net.IPv4len {
49-
return &net.TCPAddr{IP: ip, Port: port}, nil
50-
}
51-
}
52-
}
53-
if network == "tcp" || network == "tcp6" {
54-
for _, ip := range ips {
55-
if len(ip) == net.IPv6len {
56-
return &net.TCPAddr{IP: ip, Port: port}, nil
57-
}
50+
51+
addrs := make([]net.Addr, 0, len(ipAddrs))
52+
switch network {
53+
case "tcp", "tcp4", "tcp6":
54+
for _, ipAddr := range ipAddrs {
55+
addrs = append(addrs, &net.TCPAddr{
56+
IP: ipAddr.IP,
57+
Zone: ipAddr.Zone,
58+
Port: port,
59+
})
5860
}
59-
}
60-
if network == "udp" || network == "udp4" {
61-
for _, ip := range ips {
62-
if len(ip) == net.IPv4len {
63-
return &net.UDPAddr{IP: ip, Port: port}, nil
64-
}
61+
case "udp", "udp4", "udp6":
62+
for _, ipAddr := range ipAddrs {
63+
addrs = append(addrs, &net.UDPAddr{
64+
IP: ipAddr.IP,
65+
Zone: ipAddr.Zone,
66+
Port: port,
67+
})
6568
}
6669
}
67-
if network == "udp" || network == "udp6" {
68-
for _, ip := range ips {
69-
if len(ip) == net.IPv6len {
70-
return &net.UDPAddr{IP: ip, Port: port}, nil
71-
}
72-
}
70+
if len(addrs) != 0 {
71+
return addrs, nil
7372
}
73+
7474
return nil, &net.DNSError{
7575
Err: "lookup failed",
7676
Name: hostname,

0 commit comments

Comments
 (0)