The Go Programming Language

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	import (
    10		"os"
    11	)
    12	
    13	// IPAddr represents the address of a IP end point.
    14	type IPAddr struct {
    15		IP IP
    16	}
    17	
    18	// Network returns the address's network name, "ip".
    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	// ResolveIPAddr parses addr as a IP address and resolves domain
    29	// names to numeric addresses on the network net, which must be
    30	// "ip", "ip4" or "ip6".  A literal IPv6 host address must be
    31	// enclosed in square brackets, as in "[::]".
    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	// Convert "host" into IP address.
    41	func hostToIP(net, host string) (ip IP, err os.Error) {
    42		var addr IP
    43		// Try as an IP address.
    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			// Not an IP address.  Try as a DNS name.
    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				// should not happen
    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	}

release.r60.3. Except as noted, this content is licensed under a Creative Commons Attribution 3.0 License.