aboutsummaryrefslogtreecommitdiff
path: root/src/net/lookup.go
diff options
context:
space:
mode:
authorAndrew Pilloud <andrewpilloud@igneoussystems.com>2015-02-12 20:24:47 -0800
committerMikio Hara <mikioh.mikioh@gmail.com>2015-03-08 09:58:11 +0000
commitf00362b9ecf9fbca6f099493a4e8d1c6a030dee3 (patch)
tree034ac1024dc1e7d73ed2cb52d483e1f532b14859 /src/net/lookup.go
parentcbc854a7993accd581c3ad2a58cb51788372e29c (diff)
downloadgo-f00362b9ecf9fbca6f099493a4e8d1c6a030dee3.tar.gz
go-f00362b9ecf9fbca6f099493a4e8d1c6a030dee3.zip
net: LookupHost and Resolve{TCP,UDP,IP}Addr should use zone from getaddrinfo
The unix and windows getaddrinfo calls return a zone with IPv6 addresses. IPv6 link-local addresses returned are only valid on the given zone. When the zone is dropped, connections to the address will fail. This patch replaces IP with IPAddr in several internal resolver functions, and plumbs through the zone. Change-Id: Ifea891654f586f15b76988464f82e04a42ccff6d Reviewed-on: https://go-review.googlesource.com/5851 Reviewed-by: Mikio Hara <mikioh.mikioh@gmail.com>
Diffstat (limited to 'src/net/lookup.go')
-rw-r--r--src/net/lookup.go22
1 files changed, 15 insertions, 7 deletions
diff --git a/src/net/lookup.go b/src/net/lookup.go
index aeffe6c9b7..65abc81309 100644
--- a/src/net/lookup.go
+++ b/src/net/lookup.go
@@ -27,8 +27,16 @@ func LookupHost(host string) (addrs []string, err error) {
// LookupIP looks up host using the local resolver.
// It returns an array of that host's IPv4 and IPv6 addresses.
-func LookupIP(host string) (addrs []IP, err error) {
- return lookupIPMerge(host)
+func LookupIP(host string) (ips []IP, err error) {
+ addrs, err := lookupIPMerge(host)
+ if err != nil {
+ return
+ }
+ ips = make([]IP, len(addrs))
+ for i, addr := range addrs {
+ ips[i] = addr.IP
+ }
+ return
}
var lookupGroup singleflight
@@ -36,7 +44,7 @@ var lookupGroup singleflight
// lookupIPMerge wraps lookupIP, but makes sure that for any given
// host, only one lookup is in-flight at a time. The returned memory
// is always owned by the caller.
-func lookupIPMerge(host string) (addrs []IP, err error) {
+func lookupIPMerge(host string) (addrs []IPAddr, err error) {
addrsi, err, shared := lookupGroup.Do(host, func() (interface{}, error) {
return lookupIP(host)
})
@@ -45,13 +53,13 @@ func lookupIPMerge(host string) (addrs []IP, err error) {
// lookupIPReturn turns the return values from singleflight.Do into
// the return values from LookupIP.
-func lookupIPReturn(addrsi interface{}, err error, shared bool) ([]IP, error) {
+func lookupIPReturn(addrsi interface{}, err error, shared bool) ([]IPAddr, error) {
if err != nil {
return nil, err
}
- addrs := addrsi.([]IP)
+ addrs := addrsi.([]IPAddr)
if shared {
- clone := make([]IP, len(addrs))
+ clone := make([]IPAddr, len(addrs))
copy(clone, addrs)
addrs = clone
}
@@ -59,7 +67,7 @@ func lookupIPReturn(addrsi interface{}, err error, shared bool) ([]IP, error) {
}
// lookupIPDeadline looks up a hostname with a deadline.
-func lookupIPDeadline(host string, deadline time.Time) (addrs []IP, err error) {
+func lookupIPDeadline(host string, deadline time.Time) (addrs []IPAddr, err error) {
if deadline.IsZero() {
return lookupIPMerge(host)
}