aboutsummaryrefslogtreecommitdiff
path: root/src/lib/net/net_linux.go
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2008-09-29 13:37:00 -0700
committerRuss Cox <rsc@golang.org>2008-09-29 13:37:00 -0700
commite4a61c6524bd6877c962db4dd89b3df8cea711b3 (patch)
treeea13fc64b0665ed56ba3685d5ea857198de93a20 /src/lib/net/net_linux.go
parent878fe69bc1f22089f5b5aef8a57bd4b3ac1e4790 (diff)
downloadgo-e4a61c6524bd6877c962db4dd89b3df8cea711b3.tar.xz
* implement Linux epoll for polling i/o
* isolate OS-specific polling goop in Pollster type * move generic poll loop out of fd_darwin.go into fd.go R=r DELTA=782 (448 added, 281 deleted, 53 changed) OCL=16108 CL=16119
Diffstat (limited to 'src/lib/net/net_linux.go')
-rw-r--r--src/lib/net/net_linux.go10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/lib/net/net_linux.go b/src/lib/net/net_linux.go
index bc0b8f6d3a..17ffa5a9ec 100644
--- a/src/lib/net/net_linux.go
+++ b/src/lib/net/net_linux.go
@@ -25,11 +25,21 @@ export func IPv4ToSockaddr(p *[]byte, port int) (sa1 *syscall.Sockaddr, err *os.
return syscall.SockaddrInet4ToSockaddr(sa), nil
}
+var IPv6zero [16]byte;
+
export func IPv6ToSockaddr(p *[]byte, port int) (sa1 *syscall.Sockaddr, err *os.Error) {
p = ToIPv6(p)
if p == nil || port < 0 || port > 0xFFFF {
return nil, os.EINVAL
}
+
+ // IPv4 callers use 0.0.0.0 to mean "announce on any available address".
+ // In IPv6 mode, Linux treats that as meaning "announce on 0.0.0.0",
+ // which it refuses to do. Rewrite to the IPv6 all zeros.
+ if p4 := ToIPv4(p); p4 != nil && p4[0] == 0 && p4[1] == 0 && p4[2] == 0 && p4[3] == 0 {
+ p = &IPv6zero;
+ }
+
sa := new(syscall.SockaddrInet6);
sa.family = syscall.AF_INET6;
sa.port[0] = byte(port>>8);