@@ -235,6 +235,40 @@ STATIC mp_obj_t socket_send(mp_obj_t self_in, mp_obj_t buf_in) {
235
235
}
236
236
STATIC MP_DEFINE_CONST_FUN_OBJ_2 (socket_send_obj , socket_send );
237
237
238
+ STATIC mp_obj_t socket_sendall (mp_obj_t self_in , mp_obj_t buf_in ) {
239
+ mod_network_socket_obj_t * self = MP_OBJ_TO_PTR (self_in );
240
+ if (self -> nic == MP_OBJ_NULL ) {
241
+ // not connected
242
+ mp_raise_OSError (MP_EPIPE );
243
+ }
244
+ mp_buffer_info_t bufinfo ;
245
+ mp_get_buffer_raise (buf_in , & bufinfo , MP_BUFFER_READ );
246
+
247
+ int _errno ;
248
+ mp_uint_t ret = 0 ;
249
+ if (self -> timeout == 0 ) {
250
+ ret = self -> nic_type -> send (self , bufinfo .buf , bufinfo .len , & _errno );
251
+ if (ret == -1 ) {
252
+ mp_raise_OSError (_errno );
253
+ } else if (bufinfo .len > ret ) {
254
+ mp_raise_OSError (MP_EAGAIN );
255
+ }
256
+ } else {
257
+ // TODO: In CPython3.5, socket timeout should apply to the
258
+ // entire sendall() operation, not to individual send() chunks.
259
+ while (bufinfo .len != 0 ) {
260
+ ret = self -> nic_type -> send (self , bufinfo .buf , bufinfo .len , & _errno );
261
+ if (ret == -1 ) {
262
+ mp_raise_OSError (_errno );
263
+ }
264
+ bufinfo .len -= ret ;
265
+ bufinfo .buf = (char * )bufinfo .buf + ret ;
266
+ }
267
+ }
268
+ return mp_obj_new_int_from_uint (ret );
269
+ }
270
+ STATIC MP_DEFINE_CONST_FUN_OBJ_2 (socket_sendall_obj , socket_sendall );
271
+
238
272
// method socket.recv(bufsize)
239
273
STATIC mp_obj_t socket_recv (mp_obj_t self_in , mp_obj_t len_in ) {
240
274
mod_network_socket_obj_t * self = MP_OBJ_TO_PTR (self_in );
@@ -412,6 +446,7 @@ STATIC const mp_rom_map_elem_t socket_locals_dict_table[] = {
412
446
{ MP_ROM_QSTR (MP_QSTR_accept ), MP_ROM_PTR (& socket_accept_obj ) },
413
447
{ MP_ROM_QSTR (MP_QSTR_connect ), MP_ROM_PTR (& socket_connect_obj ) },
414
448
{ MP_ROM_QSTR (MP_QSTR_send ), MP_ROM_PTR (& socket_send_obj ) },
449
+ { MP_ROM_QSTR (MP_QSTR_sendall ), MP_ROM_PTR (& socket_sendall_obj ) },
415
450
{ MP_ROM_QSTR (MP_QSTR_recv ), MP_ROM_PTR (& socket_recv_obj ) },
416
451
{ MP_ROM_QSTR (MP_QSTR_sendto ), MP_ROM_PTR (& socket_sendto_obj ) },
417
452
{ MP_ROM_QSTR (MP_QSTR_recvfrom ), MP_ROM_PTR (& socket_recvfrom_obj ) },
0 commit comments