mirror of
https://github.com/golang/go
synced 2024-11-20 11:14:45 -07:00
net: pass tests on Plan 9 again
R=golang-dev CC=golang-dev https://golang.org/cl/6280045
This commit is contained in:
parent
ede6718cd7
commit
42a76efc92
@ -130,7 +130,7 @@ func TestSelfConnect(t *testing.T) {
|
||||
n = 1000
|
||||
}
|
||||
switch runtime.GOOS {
|
||||
case "darwin", "freebsd", "netbsd", "openbsd", "windows":
|
||||
case "darwin", "freebsd", "netbsd", "openbsd", "plan9", "windows":
|
||||
// Non-Linux systems take a long time to figure
|
||||
// out that there is nothing listening on localhost.
|
||||
n = 100
|
||||
|
@ -2,6 +2,8 @@
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// +build !plan9
|
||||
|
||||
package net
|
||||
|
||||
import (
|
||||
|
@ -14,6 +14,9 @@ import (
|
||||
"time"
|
||||
)
|
||||
|
||||
// /sys/include/ape/sys/socket.h:/SOMAXCONN
|
||||
var listenerBacklog = 5
|
||||
|
||||
// probeIPv6Stack returns two boolean values. If the first boolean value is
|
||||
// true, kernel supports basic IPv6 functionality. If the second
|
||||
// boolean value is true, kernel supports IPv6 IPv4-mapping.
|
||||
@ -48,6 +51,7 @@ func readPlan9Addr(proto, filename string) (addr Addr, err error) {
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer f.Close()
|
||||
n, err := f.Read(buf[:])
|
||||
if err != nil {
|
||||
return
|
||||
@ -192,6 +196,7 @@ func startPlan9(net string, addr Addr) (ctl *os.File, dest, proto, name string,
|
||||
var buf [16]byte
|
||||
n, err := f.Read(buf[:])
|
||||
if err != nil {
|
||||
f.Close()
|
||||
return
|
||||
}
|
||||
return f, dest, proto, string(buf[:n]), nil
|
||||
@ -204,14 +209,17 @@ func dialPlan9(net string, laddr, raddr Addr) (c *plan9Conn, err error) {
|
||||
}
|
||||
_, err = f.WriteString("connect " + dest)
|
||||
if err != nil {
|
||||
f.Close()
|
||||
return
|
||||
}
|
||||
laddr, err = readPlan9Addr(proto, "/net/"+proto+"/"+name+"/local")
|
||||
if err != nil {
|
||||
f.Close()
|
||||
return
|
||||
}
|
||||
raddr, err = readPlan9Addr(proto, "/net/"+proto+"/"+name+"/remote")
|
||||
if err != nil {
|
||||
f.Close()
|
||||
return
|
||||
}
|
||||
return newPlan9Conn(proto, name, f, laddr, raddr), nil
|
||||
@ -230,10 +238,12 @@ func listenPlan9(net string, laddr Addr) (l *plan9Listener, err error) {
|
||||
}
|
||||
_, err = f.WriteString("announce " + dest)
|
||||
if err != nil {
|
||||
f.Close()
|
||||
return
|
||||
}
|
||||
laddr, err = readPlan9Addr(proto, "/net/"+proto+"/"+name+"/local")
|
||||
if err != nil {
|
||||
f.Close()
|
||||
return
|
||||
}
|
||||
l = new(plan9Listener)
|
||||
@ -257,15 +267,18 @@ func (l *plan9Listener) acceptPlan9() (c *plan9Conn, err error) {
|
||||
var buf [16]byte
|
||||
n, err := f.Read(buf[:])
|
||||
if err != nil {
|
||||
f.Close()
|
||||
return
|
||||
}
|
||||
name := string(buf[:n])
|
||||
laddr, err := readPlan9Addr(l.proto, l.dir+"/local")
|
||||
if err != nil {
|
||||
f.Close()
|
||||
return
|
||||
}
|
||||
raddr, err := readPlan9Addr(l.proto, l.dir+"/remote")
|
||||
if err != nil {
|
||||
f.Close()
|
||||
return
|
||||
}
|
||||
return newPlan9Conn(l.proto, name, f, laddr, raddr), nil
|
||||
@ -287,3 +300,9 @@ func (l *plan9Listener) Close() error {
|
||||
}
|
||||
|
||||
func (l *plan9Listener) Addr() Addr { return l.laddr }
|
||||
|
||||
// SetDeadline sets the deadline associated with the listener.
|
||||
// A zero time value disables the deadline.
|
||||
func (l *plan9Listener) SetDeadline(t time.Time) error {
|
||||
return syscall.EPLAN9
|
||||
}
|
||||
|
@ -2,6 +2,8 @@
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// +build !plan9
|
||||
|
||||
package net
|
||||
|
||||
import (
|
||||
|
@ -143,6 +143,11 @@ func TestTCPListenClose(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestUDPListenClose(t *testing.T) {
|
||||
switch runtime.GOOS {
|
||||
case "plan9":
|
||||
t.Logf("skipping test on %q", runtime.GOOS)
|
||||
return
|
||||
}
|
||||
ln, err := ListenPacket("udp", "127.0.0.1:0")
|
||||
if err != nil {
|
||||
t.Fatalf("Listen failed: %v", err)
|
||||
|
@ -6,10 +6,7 @@
|
||||
|
||||
package net
|
||||
|
||||
import (
|
||||
"syscall"
|
||||
"time"
|
||||
)
|
||||
import "syscall"
|
||||
|
||||
// TCPConn is an implementation of the Conn interface
|
||||
// for TCP network connections.
|
||||
@ -17,21 +14,6 @@ type TCPConn struct {
|
||||
plan9Conn
|
||||
}
|
||||
|
||||
// SetDeadline implements the Conn SetDeadline method.
|
||||
func (c *TCPConn) SetDeadline(t time.Time) error {
|
||||
return syscall.EPLAN9
|
||||
}
|
||||
|
||||
// SetReadDeadline implements the Conn SetReadDeadline method.
|
||||
func (c *TCPConn) SetReadDeadline(t time.Time) error {
|
||||
return syscall.EPLAN9
|
||||
}
|
||||
|
||||
// SetWriteDeadline implements the Conn SetWriteDeadline method.
|
||||
func (c *TCPConn) SetWriteDeadline(t time.Time) error {
|
||||
return syscall.EPLAN9
|
||||
}
|
||||
|
||||
// CloseRead shuts down the reading side of the TCP connection.
|
||||
// Most callers should just use Close.
|
||||
func (c *TCPConn) CloseRead() error {
|
||||
@ -76,6 +58,17 @@ type TCPListener struct {
|
||||
plan9Listener
|
||||
}
|
||||
|
||||
func (l *TCPListener) Close() error {
|
||||
if l == nil || l.ctl == nil {
|
||||
return syscall.EINVAL
|
||||
}
|
||||
if _, err := l.ctl.WriteString("hangup"); err != nil {
|
||||
l.ctl.Close()
|
||||
return err
|
||||
}
|
||||
return l.ctl.Close()
|
||||
}
|
||||
|
||||
// ListenTCP announces on the TCP address laddr and returns a TCP listener.
|
||||
// Net must be "tcp", "tcp4", or "tcp6".
|
||||
// If laddr has a port of 0, it means to listen on some available port.
|
||||
|
@ -6,6 +6,10 @@
|
||||
|
||||
package net
|
||||
|
||||
import "errors"
|
||||
|
||||
var ErrWriteToConnected = errors.New("use of WriteTo with pre-connected UDP")
|
||||
|
||||
// UDPAddr represents the address of a UDP end point.
|
||||
type UDPAddr struct {
|
||||
IP IP
|
||||
|
@ -10,7 +10,6 @@ import (
|
||||
"errors"
|
||||
"os"
|
||||
"syscall"
|
||||
"time"
|
||||
)
|
||||
|
||||
// UDPConn is the implementation of the Conn and PacketConn
|
||||
@ -19,21 +18,6 @@ type UDPConn struct {
|
||||
plan9Conn
|
||||
}
|
||||
|
||||
// SetDeadline implements the Conn SetDeadline method.
|
||||
func (c *UDPConn) SetDeadline(t time.Time) error {
|
||||
return syscall.EPLAN9
|
||||
}
|
||||
|
||||
// SetReadDeadline implements the Conn SetReadDeadline method.
|
||||
func (c *UDPConn) SetReadDeadline(t time.Time) error {
|
||||
return syscall.EPLAN9
|
||||
}
|
||||
|
||||
// SetWriteDeadline implements the Conn SetWriteDeadline method.
|
||||
func (c *UDPConn) SetWriteDeadline(t time.Time) error {
|
||||
return syscall.EPLAN9
|
||||
}
|
||||
|
||||
// UDP-specific methods.
|
||||
|
||||
// ReadFromUDP reads a UDP packet from c, copying the payload into b.
|
||||
|
@ -8,12 +8,7 @@
|
||||
|
||||
package net
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"syscall"
|
||||
)
|
||||
|
||||
var ErrWriteToConnected = errors.New("use of WriteTo with pre-connected UDP")
|
||||
import "syscall"
|
||||
|
||||
func sockaddrToUDP(sa syscall.Sockaddr) Addr {
|
||||
switch sa := sa.(type) {
|
||||
|
@ -2,6 +2,8 @@
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// +build !plan9
|
||||
|
||||
package net
|
||||
|
||||
import (
|
||||
|
Loading…
Reference in New Issue
Block a user