1
2
3
4
5
6
7 package net
8
9 import (
10 "os"
11 )
12
13
14 type IPAddr struct {
15 IP IP
16 }
17
18
19 func (a *IPAddr) Network() string { return "ip" }
20
21 func (a *IPAddr) String() string {
22 if a == nil {
23 return "<nil>"
24 }
25 return a.IP.String()
26 }
27
28
29
30
31
32 func ResolveIPAddr(net, addr string) (*IPAddr, os.Error) {
33 ip, err := hostToIP(net, addr)
34 if err != nil {
35 return nil, err
36 }
37 return &IPAddr{ip}, nil
38 }
39
40
41 func hostToIP(net, host string) (ip IP, err os.Error) {
42 var addr IP
43
44 addr = ParseIP(host)
45 if addr == nil {
46 filter := anyaddr
47 if net != "" && net[len(net)-1] == '4' {
48 filter = ipv4only
49 }
50 if net != "" && net[len(net)-1] == '6' {
51 filter = ipv6only
52 }
53
54 addrs, err1 := LookupHost(host)
55 if err1 != nil {
56 err = err1
57 goto Error
58 }
59 addr = firstFavoriteAddr(filter, addrs)
60 if addr == nil {
61
62 err = &AddrError{"LookupHost returned no suitable address", addrs[0]}
63 goto Error
64 }
65 }
66 return addr, nil
67 Error:
68 return nil, err
69 }