@@ -24,6 +24,11 @@ type netFD struct {
24
24
net string
25
25
laddr Addr
26
26
raddr Addr
27
+
28
+ // hooks (if provided) are called after successful reads or writes with the
29
+ // number of bytes transferred.
30
+ readHook func (int )
31
+ writeHook func (int )
27
32
}
28
33
29
34
func (fd * netFD ) setAddr (laddr , raddr Addr ) {
@@ -53,83 +58,125 @@ func (fd *netFD) closeWrite() error {
53
58
54
59
func (fd * netFD ) Read (p []byte ) (n int , err error ) {
55
60
n , err = fd .pfd .Read (p )
61
+ if fd .readHook != nil && err == nil {
62
+ fd .readHook (n )
63
+ }
56
64
runtime .KeepAlive (fd )
57
65
return n , wrapSyscallError (readSyscallName , err )
58
66
}
59
67
60
68
func (fd * netFD ) readFrom (p []byte ) (n int , sa syscall.Sockaddr , err error ) {
61
69
n , sa , err = fd .pfd .ReadFrom (p )
70
+ if fd .readHook != nil && err == nil {
71
+ fd .readHook (n )
72
+ }
62
73
runtime .KeepAlive (fd )
63
74
return n , sa , wrapSyscallError (readFromSyscallName , err )
64
75
}
65
76
func (fd * netFD ) readFromInet4 (p []byte , from * syscall.SockaddrInet4 ) (n int , err error ) {
66
77
n , err = fd .pfd .ReadFromInet4 (p , from )
78
+ if fd .readHook != nil && err == nil {
79
+ fd .readHook (n )
80
+ }
67
81
runtime .KeepAlive (fd )
68
82
return n , wrapSyscallError (readFromSyscallName , err )
69
83
}
70
84
71
85
func (fd * netFD ) readFromInet6 (p []byte , from * syscall.SockaddrInet6 ) (n int , err error ) {
72
86
n , err = fd .pfd .ReadFromInet6 (p , from )
87
+ if fd .readHook != nil && err == nil {
88
+ fd .readHook (n )
89
+ }
73
90
runtime .KeepAlive (fd )
74
91
return n , wrapSyscallError (readFromSyscallName , err )
75
92
}
76
93
77
94
func (fd * netFD ) readMsg (p []byte , oob []byte , flags int ) (n , oobn , retflags int , sa syscall.Sockaddr , err error ) {
78
95
n , oobn , retflags , sa , err = fd .pfd .ReadMsg (p , oob , flags )
96
+ if fd .readHook != nil && err == nil {
97
+ fd .readHook (n + oobn )
98
+ }
79
99
runtime .KeepAlive (fd )
80
100
return n , oobn , retflags , sa , wrapSyscallError (readMsgSyscallName , err )
81
101
}
82
102
83
103
func (fd * netFD ) readMsgInet4 (p []byte , oob []byte , flags int , sa * syscall.SockaddrInet4 ) (n , oobn , retflags int , err error ) {
84
104
n , oobn , retflags , err = fd .pfd .ReadMsgInet4 (p , oob , flags , sa )
105
+ if fd .readHook != nil && err == nil {
106
+ fd .readHook (n + oobn )
107
+ }
85
108
runtime .KeepAlive (fd )
86
109
return n , oobn , retflags , wrapSyscallError (readMsgSyscallName , err )
87
110
}
88
111
89
112
func (fd * netFD ) readMsgInet6 (p []byte , oob []byte , flags int , sa * syscall.SockaddrInet6 ) (n , oobn , retflags int , err error ) {
90
113
n , oobn , retflags , err = fd .pfd .ReadMsgInet6 (p , oob , flags , sa )
114
+ if fd .readHook != nil && err == nil {
115
+ fd .readHook (n + oobn )
116
+ }
91
117
runtime .KeepAlive (fd )
92
118
return n , oobn , retflags , wrapSyscallError (readMsgSyscallName , err )
93
119
}
94
120
95
121
func (fd * netFD ) Write (p []byte ) (nn int , err error ) {
96
122
nn , err = fd .pfd .Write (p )
123
+ if fd .writeHook != nil && err == nil {
124
+ fd .writeHook (nn )
125
+ }
97
126
runtime .KeepAlive (fd )
98
127
return nn , wrapSyscallError (writeSyscallName , err )
99
128
}
100
129
101
130
func (fd * netFD ) writeTo (p []byte , sa syscall.Sockaddr ) (n int , err error ) {
102
131
n , err = fd .pfd .WriteTo (p , sa )
132
+ if fd .writeHook != nil && err == nil {
133
+ fd .writeHook (n )
134
+ }
103
135
runtime .KeepAlive (fd )
104
136
return n , wrapSyscallError (writeToSyscallName , err )
105
137
}
106
138
107
139
func (fd * netFD ) writeToInet4 (p []byte , sa * syscall.SockaddrInet4 ) (n int , err error ) {
108
140
n , err = fd .pfd .WriteToInet4 (p , sa )
141
+ if fd .writeHook != nil && err == nil {
142
+ fd .writeHook (n )
143
+ }
109
144
runtime .KeepAlive (fd )
110
145
return n , wrapSyscallError (writeToSyscallName , err )
111
146
}
112
147
113
148
func (fd * netFD ) writeToInet6 (p []byte , sa * syscall.SockaddrInet6 ) (n int , err error ) {
114
149
n , err = fd .pfd .WriteToInet6 (p , sa )
150
+ if fd .writeHook != nil && err == nil {
151
+ fd .writeHook (n )
152
+ }
115
153
runtime .KeepAlive (fd )
116
154
return n , wrapSyscallError (writeToSyscallName , err )
117
155
}
118
156
119
157
func (fd * netFD ) writeMsg (p []byte , oob []byte , sa syscall.Sockaddr ) (n int , oobn int , err error ) {
120
158
n , oobn , err = fd .pfd .WriteMsg (p , oob , sa )
159
+ if fd .writeHook != nil && err == nil {
160
+ fd .writeHook (n + oobn )
161
+ }
121
162
runtime .KeepAlive (fd )
122
163
return n , oobn , wrapSyscallError (writeMsgSyscallName , err )
123
164
}
124
165
125
166
func (fd * netFD ) writeMsgInet4 (p []byte , oob []byte , sa * syscall.SockaddrInet4 ) (n int , oobn int , err error ) {
126
167
n , oobn , err = fd .pfd .WriteMsgInet4 (p , oob , sa )
168
+ if fd .writeHook != nil && err == nil {
169
+ fd .writeHook (n + oobn )
170
+ }
127
171
runtime .KeepAlive (fd )
128
172
return n , oobn , wrapSyscallError (writeMsgSyscallName , err )
129
173
}
130
174
131
175
func (fd * netFD ) writeMsgInet6 (p []byte , oob []byte , sa * syscall.SockaddrInet6 ) (n int , oobn int , err error ) {
132
176
n , oobn , err = fd .pfd .WriteMsgInet6 (p , oob , sa )
177
+ if fd .writeHook != nil && err == nil {
178
+ fd .writeHook (n + oobn )
179
+ }
133
180
runtime .KeepAlive (fd )
134
181
return n , oobn , wrapSyscallError (writeMsgSyscallName , err )
135
182
}
0 commit comments