diff options
| author | Russ Cox <rsc@golang.org> | 2008-09-29 13:37:00 -0700 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2008-09-29 13:37:00 -0700 |
| commit | e4a61c6524bd6877c962db4dd89b3df8cea711b3 (patch) | |
| tree | ea13fc64b0665ed56ba3685d5ea857198de93a20 /src/lib/net/net_linux.go | |
| parent | 878fe69bc1f22089f5b5aef8a57bd4b3ac1e4790 (diff) | |
| download | go-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.go | 10 |
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); |
