github.com/epfl-dcsl/gotee@v0.0.0-20200909122901-014b35f5e5e9/src/net/tcpsock_plan9.go (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package net 6 7 import ( 8 "context" 9 "io" 10 "os" 11 ) 12 13 func (c *TCPConn) readFrom(r io.Reader) (int64, error) { 14 return genericReadFrom(c, r) 15 } 16 17 func dialTCP(ctx context.Context, net string, laddr, raddr *TCPAddr) (*TCPConn, error) { 18 if testHookDialTCP != nil { 19 return testHookDialTCP(ctx, net, laddr, raddr) 20 } 21 return doDialTCP(ctx, net, laddr, raddr) 22 } 23 24 func doDialTCP(ctx context.Context, net string, laddr, raddr *TCPAddr) (*TCPConn, error) { 25 switch net { 26 case "tcp", "tcp4", "tcp6": 27 default: 28 return nil, UnknownNetworkError(net) 29 } 30 if raddr == nil { 31 return nil, errMissingAddress 32 } 33 fd, err := dialPlan9(ctx, net, laddr, raddr) 34 if err != nil { 35 return nil, err 36 } 37 return newTCPConn(fd), nil 38 } 39 40 func (ln *TCPListener) ok() bool { return ln != nil && ln.fd != nil && ln.fd.ctl != nil } 41 42 func (ln *TCPListener) accept() (*TCPConn, error) { 43 fd, err := ln.fd.acceptPlan9() 44 if err != nil { 45 return nil, err 46 } 47 return newTCPConn(fd), nil 48 } 49 50 func (ln *TCPListener) close() error { 51 if err := ln.fd.pfd.Close(); err != nil { 52 return err 53 } 54 if _, err := ln.fd.ctl.WriteString("hangup"); err != nil { 55 ln.fd.ctl.Close() 56 return err 57 } 58 if err := ln.fd.ctl.Close(); err != nil { 59 return err 60 } 61 return nil 62 } 63 64 func (ln *TCPListener) file() (*os.File, error) { 65 f, err := ln.dup() 66 if err != nil { 67 return nil, err 68 } 69 return f, nil 70 } 71 72 func listenTCP(ctx context.Context, network string, laddr *TCPAddr) (*TCPListener, error) { 73 fd, err := listenPlan9(ctx, network, laddr) 74 if err != nil { 75 return nil, err 76 } 77 return &TCPListener{fd}, nil 78 }