@@ -155,15 +155,37 @@ def send(message, flags, dest_sockaddr = nil)
155
155
bytes_sent
156
156
end
157
157
158
- def recv ( bytes_to_read , flags = 0 )
158
+ private def internal_recv ( bytes_to_read , flags , buffer , exception )
159
+ raise ArgumentError , 'buffer argument not yet supported' if buffer
160
+
159
161
Truffle ::Socket ::Foreign . memory_pointer ( bytes_to_read ) do |buf |
160
162
n_bytes = Truffle ::Socket ::Foreign . recv ( @descriptor , buf , bytes_to_read , flags )
161
- Errno . handle ( 'recv(2)' ) if n_bytes == -1
163
+
164
+ if n_bytes == -1
165
+ if exception
166
+ Truffle ::Socket ::Error . read_error ( 'recv(2)' , self )
167
+ else
168
+ return :wait_readable
169
+ end
170
+ end
171
+
162
172
return buf . read_string ( n_bytes )
163
173
end
164
174
end
165
175
166
- def recvmsg ( max_msg_len = nil , flags = 0 , *_ )
176
+ def recv ( bytes_to_read , flags = 0 , buf = nil )
177
+ internal_recv ( bytes_to_read , flags , buf , true )
178
+ end
179
+
180
+ def recv_nonblock ( bytes_to_read , flags = 0 , buf = nil , exception : true )
181
+ fcntl ( Fcntl ::F_SETFL , Fcntl ::O_NONBLOCK )
182
+
183
+ Truffle ::Socket ::Error . wrap_read_nonblock do
184
+ internal_recv ( bytes_to_read , flags , buf , exception )
185
+ end
186
+ end
187
+
188
+ private def internal_recvmsg ( max_msg_len , flags , max_control_len , scm_rights , exception )
167
189
socket_type = getsockopt ( :SOCKET , :TYPE ) . int
168
190
169
191
if socket_type == Socket ::SOCK_STREAM
@@ -188,7 +210,13 @@ def recvmsg(max_msg_len = nil, flags = 0, *_)
188
210
msg_size = Truffle ::Socket ::Foreign
189
211
. recvmsg ( @descriptor , header . pointer , flags )
190
212
191
- Truffle ::Socket ::Error . read_error ( 'recvmsg(2)' , self ) if msg_size < 0
213
+ if msg_size < 0
214
+ if exception
215
+ Truffle ::Socket ::Error . read_error ( 'recvmsg(2)' , self )
216
+ else
217
+ return :wait_readable
218
+ end
219
+ end
192
220
193
221
if grow_msg and header . message_truncated?
194
222
need_more = true
@@ -216,13 +244,17 @@ def recvmsg(max_msg_len = nil, flags = 0, *_)
216
244
nil
217
245
end
218
246
219
- def recvmsg_nonblock ( max_msg_len = nil , flags = 0 , *_ )
247
+ def recvmsg ( max_msg_len = nil , flags = 0 , max_control_len = nil , scm_rights : false )
248
+ internal_recvmsg ( max_msg_len , flags , max_control_len , scm_rights , true )
249
+ end
250
+
251
+ def recvmsg_nonblock ( max_msg_len = nil , flags = 0 , max_control_len = nil , exception : true , scm_rights : false )
220
252
fcntl ( Fcntl ::F_SETFL , Fcntl ::O_NONBLOCK )
221
253
222
- recvmsg ( max_msg_len , flags | Socket ::MSG_DONTWAIT )
254
+ internal_recvmsg ( max_msg_len , flags | Socket ::MSG_DONTWAIT , max_control_len , scm_rights , exception )
223
255
end
224
256
225
- def sendmsg ( message , flags = 0 , dest_sockaddr = nil , * _ )
257
+ private def internal_sendmsg ( message , flags , dest_sockaddr , exception )
226
258
msg_buffer = Truffle ::Socket ::Foreign . char_pointer ( message . bytesize )
227
259
io_vec = Truffle ::Socket ::Foreign ::Iovec . with_buffer ( msg_buffer )
228
260
header = Truffle ::Socket ::Foreign ::Msghdr . new
@@ -247,7 +279,13 @@ def sendmsg(message, flags = 0, dest_sockaddr = nil, *_)
247
279
num_bytes = Truffle ::Socket ::Foreign
248
280
. sendmsg ( @descriptor , header . pointer , flags )
249
281
250
- Truffle ::Socket ::Error . read_error ( 'sendmsg(2)' , self ) if num_bytes < 0
282
+ if num_bytes < 0
283
+ if exception
284
+ Truffle ::Socket ::Error . read_error ( 'sendmsg(2)' , self )
285
+ else
286
+ return :wait_writable
287
+ end
288
+ end
251
289
252
290
num_bytes
253
291
ensure
@@ -258,10 +296,14 @@ def sendmsg(message, flags = 0, dest_sockaddr = nil, *_)
258
296
end
259
297
end
260
298
261
- def sendmsg_nonblock ( message , flags = 0 , dest_sockaddr = nil , *_ )
299
+ def sendmsg ( message , flags = 0 , dest_sockaddr = nil , *controls )
300
+ internal_sendmsg ( message , flags , dest_sockaddr , true )
301
+ end
302
+
303
+ def sendmsg_nonblock ( message , flags = 0 , dest_sockaddr = nil , *controls , exception : true )
262
304
fcntl ( Fcntl ::F_SETFL , Fcntl ::O_NONBLOCK )
263
305
264
- sendmsg ( message , flags | Socket ::MSG_DONTWAIT , dest_sockaddr )
306
+ internal_sendmsg ( message , flags | Socket ::MSG_DONTWAIT , dest_sockaddr , exception )
265
307
end
266
308
267
309
def close_read
@@ -292,14 +334,6 @@ def close_write
292
334
nil
293
335
end
294
336
295
- def recv_nonblock ( bytes_to_read , flags = 0 )
296
- fcntl ( Fcntl ::F_SETFL , Fcntl ::O_NONBLOCK )
297
-
298
- Truffle ::Socket ::Error . wrap_read_nonblock do
299
- recv ( bytes_to_read , flags )
300
- end
301
- end
302
-
303
337
def shutdown ( how = Socket ::SHUT_RDWR )
304
338
how = Truffle ::Socket . shutdown_option ( how )
305
339
err = Truffle ::Socket ::Foreign . shutdown ( @descriptor , how )
0 commit comments