Source file
src/net/fd_posix.go
1
2
3
4
5
6
7 package net
8
9 import (
10 "internal/poll"
11 "runtime"
12 "syscall"
13 "time"
14 )
15
16
17 type netFD struct {
18 pfd poll.FD
19
20
21 family int
22 sotype int
23 isConnected bool
24 net string
25 laddr Addr
26 raddr Addr
27 }
28
29 func (fd *netFD) name() string {
30 var ls, rs string
31 if fd.laddr != nil {
32 ls = fd.laddr.String()
33 }
34 if fd.raddr != nil {
35 rs = fd.raddr.String()
36 }
37 return fd.net + ":" + ls + "->" + rs
38 }
39
40 func (fd *netFD) setAddr(laddr, raddr Addr) {
41 fd.laddr = laddr
42 fd.raddr = raddr
43
44 runtime.SetFinalizer(fd, (*netFD).Close)
45 }
46
47 func (fd *netFD) Close() error {
48
49 runtime.SetFinalizer(fd, nil)
50 return fd.pfd.Close()
51 }
52
53 func (fd *netFD) shutdown(how int) error {
54 err := fd.pfd.Shutdown(how)
55 runtime.KeepAlive(fd)
56 return wrapSyscallError("shutdown", err)
57 }
58
59 func (fd *netFD) closeRead() error {
60 return fd.shutdown(syscall.SHUT_RD)
61 }
62
63 func (fd *netFD) closeWrite() error {
64 return fd.shutdown(syscall.SHUT_WR)
65 }
66
67 func (fd *netFD) Read(p []byte) (n int, err error) {
68 n, err = fd.pfd.Read(p)
69 runtime.KeepAlive(fd)
70 return n, wrapSyscallError(readSyscallName, err)
71 }
72
73 func (fd *netFD) readFrom(p []byte) (n int, sa syscall.Sockaddr, err error) {
74 n, sa, err = fd.pfd.ReadFrom(p)
75 runtime.KeepAlive(fd)
76 return n, sa, wrapSyscallError(readFromSyscallName, err)
77 }
78 func (fd *netFD) readFromInet4(p []byte, from *syscall.SockaddrInet4) (n int, err error) {
79 n, err = fd.pfd.ReadFromInet4(p, from)
80 runtime.KeepAlive(fd)
81 return n, wrapSyscallError(readFromSyscallName, err)
82 }
83
84 func (fd *netFD) readFromInet6(p []byte, from *syscall.SockaddrInet6) (n int, err error) {
85 n, err = fd.pfd.ReadFromInet6(p, from)
86 runtime.KeepAlive(fd)
87 return n, wrapSyscallError(readFromSyscallName, err)
88 }
89
90 func (fd *netFD) readMsg(p []byte, oob []byte, flags int) (n, oobn, retflags int, sa syscall.Sockaddr, err error) {
91 n, oobn, retflags, sa, err = fd.pfd.ReadMsg(p, oob, flags)
92 runtime.KeepAlive(fd)
93 return n, oobn, retflags, sa, wrapSyscallError(readMsgSyscallName, err)
94 }
95
96 func (fd *netFD) readMsgInet4(p []byte, oob []byte, flags int, sa *syscall.SockaddrInet4) (n, oobn, retflags int, err error) {
97 n, oobn, retflags, err = fd.pfd.ReadMsgInet4(p, oob, flags, sa)
98 runtime.KeepAlive(fd)
99 return n, oobn, retflags, wrapSyscallError(readMsgSyscallName, err)
100 }
101
102 func (fd *netFD) readMsgInet6(p []byte, oob []byte, flags int, sa *syscall.SockaddrInet6) (n, oobn, retflags int, err error) {
103 n, oobn, retflags, err = fd.pfd.ReadMsgInet6(p, oob, flags, sa)
104 runtime.KeepAlive(fd)
105 return n, oobn, retflags, wrapSyscallError(readMsgSyscallName, err)
106 }
107
108 func (fd *netFD) Write(p []byte) (nn int, err error) {
109 nn, err = fd.pfd.Write(p)
110 runtime.KeepAlive(fd)
111 return nn, wrapSyscallError(writeSyscallName, err)
112 }
113
114 func (fd *netFD) writeTo(p []byte, sa syscall.Sockaddr) (n int, err error) {
115 n, err = fd.pfd.WriteTo(p, sa)
116 runtime.KeepAlive(fd)
117 return n, wrapSyscallError(writeToSyscallName, err)
118 }
119
120 func (fd *netFD) writeToInet4(p []byte, sa *syscall.SockaddrInet4) (n int, err error) {
121 n, err = fd.pfd.WriteToInet4(p, sa)
122 runtime.KeepAlive(fd)
123 return n, wrapSyscallError(writeToSyscallName, err)
124 }
125
126 func (fd *netFD) writeToInet6(p []byte, sa *syscall.SockaddrInet6) (n int, err error) {
127 n, err = fd.pfd.WriteToInet6(p, sa)
128 runtime.KeepAlive(fd)
129 return n, wrapSyscallError(writeToSyscallName, err)
130 }
131
132 func (fd *netFD) writeMsg(p []byte, oob []byte, sa syscall.Sockaddr) (n int, oobn int, err error) {
133 n, oobn, err = fd.pfd.WriteMsg(p, oob, sa)
134 runtime.KeepAlive(fd)
135 return n, oobn, wrapSyscallError(writeMsgSyscallName, err)
136 }
137
138 func (fd *netFD) writeMsgInet4(p []byte, oob []byte, sa *syscall.SockaddrInet4) (n int, oobn int, err error) {
139 n, oobn, err = fd.pfd.WriteMsgInet4(p, oob, sa)
140 runtime.KeepAlive(fd)
141 return n, oobn, wrapSyscallError(writeMsgSyscallName, err)
142 }
143
144 func (fd *netFD) writeMsgInet6(p []byte, oob []byte, sa *syscall.SockaddrInet6) (n int, oobn int, err error) {
145 n, oobn, err = fd.pfd.WriteMsgInet6(p, oob, sa)
146 runtime.KeepAlive(fd)
147 return n, oobn, wrapSyscallError(writeMsgSyscallName, err)
148 }
149
150 func (fd *netFD) SetDeadline(t time.Time) error {
151 return fd.pfd.SetDeadline(t)
152 }
153
154 func (fd *netFD) SetReadDeadline(t time.Time) error {
155 return fd.pfd.SetReadDeadline(t)
156 }
157
158 func (fd *netFD) SetWriteDeadline(t time.Time) error {
159 return fd.pfd.SetWriteDeadline(t)
160 }
161
View as plain text