69 lines
1.1 KiB
Go
69 lines
1.1 KiB
Go
package builtins
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"strconv"
|
|
)
|
|
|
|
func parseAddress(address string) (ip net.IP, port int, err error) {
|
|
var (
|
|
h string
|
|
p string
|
|
n int64
|
|
)
|
|
|
|
h, p, err = net.SplitHostPort(address)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
ip = net.ParseIP(h)
|
|
if ip == nil {
|
|
var addrs []string
|
|
addrs, err = net.LookupHost(address)
|
|
if err != nil {
|
|
err = fmt.Errorf("error resolving host '%s'", address)
|
|
return
|
|
}
|
|
|
|
if len(addrs) == 0 {
|
|
err = fmt.Errorf("host not found '%s'", address)
|
|
return
|
|
}
|
|
|
|
ip = net.ParseIP(addrs[0])
|
|
if ip == nil {
|
|
err = fmt.Errorf("invalid IP address '%s'", address)
|
|
return
|
|
}
|
|
}
|
|
|
|
n, err = strconv.ParseInt(p, 10, 16)
|
|
if err != nil {
|
|
return
|
|
}
|
|
port = int(n)
|
|
return
|
|
}
|
|
|
|
func parseV4Address(address string) (addr [4]byte, port int, err error) {
|
|
var ip net.IP
|
|
ip, port, err = parseAddress(address)
|
|
if err != nil {
|
|
return
|
|
}
|
|
copy(addr[:], ip.To4()[:4])
|
|
return
|
|
}
|
|
|
|
func parseV6Address(address string) (addr [16]byte, port int, err error) {
|
|
var ip net.IP
|
|
ip, port, err = parseAddress(address)
|
|
if err != nil {
|
|
return
|
|
}
|
|
copy(addr[:], ip.To16()[:16])
|
|
return
|
|
}
|