Source file
src/net/tcpsock_plan9.go
1
2
3
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 (sd *sysDialer) dialTCP(ctx context.Context, laddr, raddr *TCPAddr) (*TCPConn, error) {
18 if h := sd.testHookDialTCP; h != nil {
19 return h(ctx, sd.network, laddr, raddr)
20 }
21 if h := testHookDialTCP; h != nil {
22 return h(ctx, sd.network, laddr, raddr)
23 }
24 return sd.doDialTCP(ctx, laddr, raddr)
25 }
26
27 func (sd *sysDialer) doDialTCP(ctx context.Context, laddr, raddr *TCPAddr) (*TCPConn, error) {
28 switch sd.network {
29 case "tcp4":
30
31 if laddr != nil && len(laddr.IP) != 0 && laddr.IP.To4() == nil {
32 return nil, &AddrError{Err: "non-IPv4 local address", Addr: laddr.String()}
33 }
34 case "tcp", "tcp6":
35 default:
36 return nil, UnknownNetworkError(sd.network)
37 }
38 if raddr == nil {
39 return nil, errMissingAddress
40 }
41 fd, err := dialPlan9(ctx, sd.network, laddr, raddr)
42 if err != nil {
43 return nil, err
44 }
45 return newTCPConn(fd, sd.Dialer.KeepAlive, testHookSetKeepAlive), nil
46 }
47
48 func (ln *TCPListener) ok() bool { return ln != nil && ln.fd != nil && ln.fd.ctl != nil }
49
50 func (ln *TCPListener) accept() (*TCPConn, error) {
51 fd, err := ln.fd.acceptPlan9()
52 if err != nil {
53 return nil, err
54 }
55 return newTCPConn(fd, ln.lc.KeepAlive, nil), nil
56 }
57
58 func (ln *TCPListener) close() error {
59 if err := ln.fd.pfd.Close(); err != nil {
60 return err
61 }
62 if _, err := ln.fd.ctl.WriteString("hangup"); err != nil {
63 ln.fd.ctl.Close()
64 return err
65 }
66 if err := ln.fd.ctl.Close(); err != nil {
67 return err
68 }
69 return nil
70 }
71
72 func (ln *TCPListener) file() (*os.File, error) {
73 f, err := ln.dup()
74 if err != nil {
75 return nil, err
76 }
77 return f, nil
78 }
79
80 func (sl *sysListener) listenTCP(ctx context.Context, laddr *TCPAddr) (*TCPListener, error) {
81 fd, err := listenPlan9(ctx, sl.network, laddr)
82 if err != nil {
83 return nil, err
84 }
85 return &TCPListener{fd: fd, lc: sl.ListenConfig}, nil
86 }
87
View as plain text