diff options
author | Ondřej Surý <ondrej@sury.org> | 2011-09-13 13:13:40 +0200 |
---|---|---|
committer | Ondřej Surý <ondrej@sury.org> | 2011-09-13 13:13:40 +0200 |
commit | 5ff4c17907d5b19510a62e08fd8d3b11e62b431d (patch) | |
tree | c0650497e988f47be9c6f2324fa692a52dea82e1 /src/pkg/net/iprawsock.go | |
parent | 80f18fc933cf3f3e829c5455a1023d69f7b86e52 (diff) | |
download | golang-upstream/60.tar.gz |
Imported Upstream version 60upstream/60
Diffstat (limited to 'src/pkg/net/iprawsock.go')
-rw-r--r-- | src/pkg/net/iprawsock.go | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/pkg/net/iprawsock.go b/src/pkg/net/iprawsock.go new file mode 100644 index 000000000..662b9f57b --- /dev/null +++ b/src/pkg/net/iprawsock.go @@ -0,0 +1,69 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// (Raw) IP sockets + +package net + +import ( + "os" +) + +// IPAddr represents the address of a IP end point. +type IPAddr struct { + IP IP +} + +// Network returns the address's network name, "ip". +func (a *IPAddr) Network() string { return "ip" } + +func (a *IPAddr) String() string { + if a == nil { + return "<nil>" + } + return a.IP.String() +} + +// ResolveIPAddr parses addr as a IP address and resolves domain +// names to numeric addresses on the network net, which must be +// "ip", "ip4" or "ip6". A literal IPv6 host address must be +// enclosed in square brackets, as in "[::]". +func ResolveIPAddr(net, addr string) (*IPAddr, os.Error) { + ip, err := hostToIP(net, addr) + if err != nil { + return nil, err + } + return &IPAddr{ip}, nil +} + +// Convert "host" into IP address. +func hostToIP(net, host string) (ip IP, err os.Error) { + var addr IP + // Try as an IP address. + addr = ParseIP(host) + if addr == nil { + filter := anyaddr + if net != "" && net[len(net)-1] == '4' { + filter = ipv4only + } + if net != "" && net[len(net)-1] == '6' { + filter = ipv6only + } + // Not an IP address. Try as a DNS name. + addrs, err1 := LookupHost(host) + if err1 != nil { + err = err1 + goto Error + } + addr = firstFavoriteAddr(filter, addrs) + if addr == nil { + // should not happen + err = &AddrError{"LookupHost returned no suitable address", addrs[0]} + goto Error + } + } + return addr, nil +Error: + return nil, err +} |