port = hostport[i+1:len(hostport)];
// Can put brackets around host ...
- if host[0] == '[' && host[len(host)-1] == ']' {
+ if len(host) > 0 && host[0] == '[' && host[len(host)-1] == ']' {
host = host[1:len(host)-1]
} else {
// ... but if there are no brackets, no colons.
// Convert "host:port" into IP address and port.
// For now, host and port must be numeric literals.
// Eventually, we'll have name resolution.
-func HostPortToIP(net string, hostport string) (ip []byte, iport int, err *os.Error) {
+func HostPortToIP(net, hostport, mode string) (ip []byte, iport int, err *os.Error) {
var host, port string;
host, port, err = SplitHostPort(hostport);
if err != nil {
return nil, 0, err
}
+ var addr []byte;
+ if host == "" {
+ if mode == "listen" {
+ addr = IPnoaddr; // wildcard - listen to all
+ } else {
+ return nil, 0, MissingAddress;
+ }
+ }
+
// Try as an IP address.
- addr := ParseIP(host);
+ if addr == nil {
+ addr = ParseIP(host);
+ }
if addr == nil {
// Not an IP address. Try as a DNS name.
hostname, addrs, err := LookupHost(host);
// PreferIPv4 here should fall back to the IPv4 socket interface when possible.
const PreferIPv4 = false
-func InternetSocket(net, laddr, raddr string, proto int64) (fd *FD, err *os.Error) {
+func InternetSocket(net, laddr, raddr string, proto int64, mode string) (fd *FD, err *os.Error) {
// Parse addresses (unless they are empty).
var lip, rip []byte;
var lport, rport int;
var lerr, rerr *os.Error;
if laddr != "" {
- lip, lport, lerr = HostPortToIP(net, laddr);
+ lip, lport, lerr = HostPortToIP(net, laddr, mode);
if lerr != nil {
return nil, lerr
}
}
if raddr != "" {
- rip, rport, rerr = HostPortToIP(net, raddr);
+ rip, rport, rerr = HostPortToIP(net, raddr, mode);
if rerr != nil {
return nil, rerr
}
if raddr == "" {
return nil, MissingAddress
}
- fd, e := InternetSocket(net, laddr, raddr, syscall.SOCK_STREAM);
+ fd, e := InternetSocket(net, laddr, raddr, syscall.SOCK_STREAM, "dial");
if e != nil {
return nil, e
}
if raddr == "" {
return nil, MissingAddress
}
- fd, e := InternetSocket(net, laddr, raddr, syscall.SOCK_DGRAM);
+ fd, e := InternetSocket(net, laddr, raddr, syscall.SOCK_DGRAM, "dial");
if e != nil {
return nil, e
}
}
export func ListenTCP(net, laddr string) (l *ListenerTCP, err *os.Error) {
- fd, e := InternetSocket(net, laddr, "", syscall.SOCK_STREAM);
+ fd, e := InternetSocket(net, laddr, "", syscall.SOCK_STREAM, "listen");
if e != nil {
return nil, e
}