| // Copyright 2009 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // TCP sockets for Plan 9 |
| |
| package net |
| |
| import "syscall" |
| |
| // TCPConn is an implementation of the Conn interface for TCP network |
| // connections. |
| type TCPConn struct { |
| plan9Conn |
| } |
| |
| // CloseRead shuts down the reading side of the TCP connection. |
| // Most callers should just use Close. |
| func (c *TCPConn) CloseRead() error { |
| if !c.ok() { |
| return syscall.EINVAL |
| } |
| return syscall.EPLAN9 |
| } |
| |
| // CloseWrite shuts down the writing side of the TCP connection. |
| // Most callers should just use Close. |
| func (c *TCPConn) CloseWrite() error { |
| if !c.ok() { |
| return syscall.EINVAL |
| } |
| return syscall.EPLAN9 |
| } |
| |
| // DialTCP connects to the remote address raddr on the network net, |
| // which must be "tcp", "tcp4", or "tcp6". If laddr is not nil, it is |
| // used as the local address for the connection. |
| func DialTCP(net string, laddr, raddr *TCPAddr) (c *TCPConn, err error) { |
| switch net { |
| case "tcp", "tcp4", "tcp6": |
| default: |
| return nil, UnknownNetworkError(net) |
| } |
| if raddr == nil { |
| return nil, &OpError{"dial", net, nil, errMissingAddress} |
| } |
| c1, err := dialPlan9(net, laddr, raddr) |
| if err != nil { |
| return |
| } |
| return &TCPConn{*c1}, nil |
| } |
| |
| // TCPListener is a TCP network listener. Clients should typically |
| // use variables of type Listener instead of assuming TCP. |
| 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. The caller |
| // can use l.Addr() to retrieve the chosen address. |
| func ListenTCP(net string, laddr *TCPAddr) (l *TCPListener, err error) { |
| switch net { |
| case "tcp", "tcp4", "tcp6": |
| default: |
| return nil, UnknownNetworkError(net) |
| } |
| if laddr == nil { |
| return nil, &OpError{"listen", net, nil, errMissingAddress} |
| } |
| l1, err := listenPlan9(net, laddr) |
| if err != nil { |
| return |
| } |
| return &TCPListener{*l1}, nil |
| } |