blob: d2860607f8b9be253388dd412555c208d3036b7c [file] [log] [blame]
Brad Fitzpatrick51947442016-03-01 22:57:46 +00001// Copyright 2009 The Go Authors. All rights reserved.
Fazlul Shahriar0f7bc922011-08-17 13:28:29 -04002// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
Fazlul Shahriar0f7bc922011-08-17 13:28:29 -04005package net
6
Brad Fitzpatrickef6806f2012-11-08 10:35:16 -06007import (
Brad Fitzpatrickb6b40042016-04-14 17:47:25 -07008 "context"
Mikio Hara306afc72012-11-13 16:18:37 +09009 "io"
10 "os"
Brad Fitzpatrickef6806f2012-11-08 10:35:16 -060011)
Fazlul Shahriar0f7bc922011-08-17 13:28:29 -040012
Mikio Harab0f4ee52016-03-02 20:08:18 +090013func (c *TCPConn) readFrom(r io.Reader) (int64, error) {
14 return genericReadFrom(c, r)
Brad Fitzpatrickef6806f2012-11-08 10:35:16 -060015}
16
Brad Fitzpatrickb6b40042016-04-14 17:47:25 -070017func 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
24func doDialTCP(ctx context.Context, net string, laddr, raddr *TCPAddr) (*TCPConn, error) {
Fazlul Shahriar0f7bc922011-08-17 13:28:29 -040025 switch net {
26 case "tcp", "tcp4", "tcp6":
27 default:
Mikio Harab0f4ee52016-03-02 20:08:18 +090028 return nil, UnknownNetworkError(net)
Fazlul Shahriar0f7bc922011-08-17 13:28:29 -040029 }
30 if raddr == nil {
Mikio Harab0f4ee52016-03-02 20:08:18 +090031 return nil, errMissingAddress
Fazlul Shahriar0f7bc922011-08-17 13:28:29 -040032 }
Brad Fitzpatrickf60fcca2016-04-16 14:17:40 -070033 fd, err := dialPlan9(ctx, net, laddr, raddr)
Fazlul Shahriar0f7bc922011-08-17 13:28:29 -040034 if err != nil {
Mikio Hara306afc72012-11-13 16:18:37 +090035 return nil, err
Fazlul Shahriar0f7bc922011-08-17 13:28:29 -040036 }
Akshat Kumar66b69a12013-02-19 17:11:17 -080037 return newTCPConn(fd), nil
Fazlul Shahriar0f7bc922011-08-17 13:28:29 -040038}
39
Mikio Harab0f4ee52016-03-02 20:08:18 +090040func (ln *TCPListener) ok() bool { return ln != nil && ln.fd != nil && ln.fd.ctl != nil }
Fazlul Shahriar0f7bc922011-08-17 13:28:29 -040041
Mikio Harab0f4ee52016-03-02 20:08:18 +090042func (ln *TCPListener) accept() (*TCPConn, error) {
43 fd, err := ln.fd.acceptPlan9()
Mikio Hara306afc72012-11-13 16:18:37 +090044 if err != nil {
45 return nil, err
46 }
47 return newTCPConn(fd), nil
48}
49
Mikio Harab0f4ee52016-03-02 20:08:18 +090050func (ln *TCPListener) close() error {
51 if _, err := ln.fd.ctl.WriteString("hangup"); err != nil {
52 ln.fd.ctl.Close()
53 return err
Mikio Hara306afc72012-11-13 16:18:37 +090054 }
Mikio Harab0f4ee52016-03-02 20:08:18 +090055 if err := ln.fd.ctl.Close(); err != nil {
56 return err
Mikio Hara2173a272015-04-19 19:01:49 +090057 }
58 return nil
Mikio Hara306afc72012-11-13 16:18:37 +090059}
60
Mikio Harab0f4ee52016-03-02 20:08:18 +090061func (ln *TCPListener) file() (*os.File, error) {
62 f, err := ln.dup()
Mikio Hara88511132015-04-18 16:53:55 +090063 if err != nil {
Mikio Harab0f4ee52016-03-02 20:08:18 +090064 return nil, err
Mikio Hara88511132015-04-18 16:53:55 +090065 }
Mikio Harab0f4ee52016-03-02 20:08:18 +090066 return f, nil
Mikio Hara88511132015-04-18 16:53:55 +090067}
Mikio Hara306afc72012-11-13 16:18:37 +090068
Brad Fitzpatrickb6b40042016-04-14 17:47:25 -070069func listenTCP(ctx context.Context, network string, laddr *TCPAddr) (*TCPListener, error) {
Brad Fitzpatrickf60fcca2016-04-16 14:17:40 -070070 fd, err := listenPlan9(ctx, network, laddr)
Fazlul Shahriar0f7bc922011-08-17 13:28:29 -040071 if err != nil {
Mikio Hara306afc72012-11-13 16:18:37 +090072 return nil, err
Fazlul Shahriar0f7bc922011-08-17 13:28:29 -040073 }
Mikio Hara306afc72012-11-13 16:18:37 +090074 return &TCPListener{fd}, nil
Fazlul Shahriar0f7bc922011-08-17 13:28:29 -040075}