Source file src/pkg/net/iprawsock.go
1 // Copyright 2010 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 // (Raw) IP sockets
6
7 package net
8
9 // IPAddr represents the address of a IP end point.
10 type IPAddr struct {
11 IP IP
12 }
13
14 // Network returns the address's network name, "ip".
15 func (a *IPAddr) Network() string { return "ip" }
16
17 func (a *IPAddr) String() string {
18 if a == nil {
19 return "<nil>"
20 }
21 return a.IP.String()
22 }
23
24 // ResolveIPAddr parses addr as a IP address and resolves domain
25 // names to numeric addresses on the network net, which must be
26 // "ip", "ip4" or "ip6". A literal IPv6 host address must be
27 // enclosed in square brackets, as in "[::]".
28 func ResolveIPAddr(net, addr string) (*IPAddr, error) {
29 ip, err := hostToIP(net, addr)
30 if err != nil {
31 return nil, err
32 }
33 return &IPAddr{ip}, nil
34 }
35
36 // Convert "host" into IP address.
37 func hostToIP(net, host string) (ip IP, err error) {
38 var addr IP
39 // Try as an IP address.
40 addr = ParseIP(host)
41 if addr == nil {
42 filter := anyaddr
43 if net != "" && net[len(net)-1] == '4' {
44 filter = ipv4only
45 }
46 if net != "" && net[len(net)-1] == '6' {
47 filter = ipv6only
48 }
49 // Not an IP address. Try as a DNS name.
50 addrs, err1 := LookupHost(host)
51 if err1 != nil {
52 err = err1
53 goto Error
54 }
55 addr = firstFavoriteAddr(filter, addrs)
56 if addr == nil {
57 // should not happen
58 err = &AddrError{"LookupHost returned no suitable address", addrs[0]}
59 goto Error
60 }
61 }
62 return addr, nil
63 Error:
64 return nil, err
65 }