@@ -611,7 +611,7 @@ static MP_DEFINE_CONST_FUN_OBJ_2(socket_setblocking_obj, socket_setblocking);
611
611
// XXX this can end up waiting a very long time if the content is dribbled in one character
612
612
// at a time, as the timeout resets each time a recvfrom succeeds ... this is probably not
613
613
// good behaviour.
614
- static mp_uint_t _socket_read_data (mp_obj_t self_in , void * buf , size_t size ,
614
+ static mp_uint_t _socket_read_data (mp_obj_t self_in , void * buf , size_t size , mp_int_t flags ,
615
615
struct sockaddr * from , socklen_t * from_len , int * errcode ) {
616
616
socket_obj_t * sock = MP_OBJ_TO_PTR (self_in );
617
617
@@ -645,7 +645,7 @@ static mp_uint_t _socket_read_data(mp_obj_t self_in, void *buf, size_t size,
645
645
if (release_gil ) {
646
646
MP_THREAD_GIL_EXIT ();
647
647
}
648
- int r = lwip_recvfrom (sock -> fd , buf , size , 0 , from , from_len );
648
+ int r = lwip_recvfrom (sock -> fd , buf , size , flags , from , from_len );
649
649
if (release_gil ) {
650
650
MP_THREAD_GIL_ENTER ();
651
651
}
@@ -655,7 +655,7 @@ static mp_uint_t _socket_read_data(mp_obj_t self_in, void *buf, size_t size,
655
655
if (r >= 0 ) {
656
656
return r ;
657
657
}
658
- if (errno != EWOULDBLOCK ) {
658
+ if (errno != EWOULDBLOCK || ( flags & MSG_DONTWAIT ) ) {
659
659
* errcode = errno ;
660
660
return MP_STREAM_ERROR ;
661
661
}
@@ -666,14 +666,17 @@ static mp_uint_t _socket_read_data(mp_obj_t self_in, void *buf, size_t size,
666
666
return MP_STREAM_ERROR ;
667
667
}
668
668
669
- mp_obj_t _socket_recvfrom (mp_obj_t self_in , mp_obj_t len_in ,
669
+ mp_obj_t _socket_recvfrom (size_t n_args , const mp_obj_t * args ,
670
670
struct sockaddr * from , socklen_t * from_len ) {
671
- size_t len = mp_obj_get_int (len_in );
671
+ mp_obj_t self_in = args [0 ];
672
+ size_t len = mp_obj_get_int (args [1 ]);
673
+ int flags = n_args > 2 ? mp_obj_get_int (args [2 ]) : 0 ;
674
+
672
675
vstr_t vstr ;
673
676
vstr_init_len (& vstr , len );
674
677
675
678
int errcode ;
676
- mp_uint_t ret = _socket_read_data (self_in , vstr .buf , len , from , from_len , & errcode );
679
+ mp_uint_t ret = _socket_read_data (self_in , vstr .buf , len , flags , from , from_len , & errcode );
677
680
if (ret == MP_STREAM_ERROR ) {
678
681
mp_raise_OSError (errcode );
679
682
}
@@ -682,25 +685,25 @@ mp_obj_t _socket_recvfrom(mp_obj_t self_in, mp_obj_t len_in,
682
685
return mp_obj_new_bytes_from_vstr (& vstr );
683
686
}
684
687
685
- static mp_obj_t socket_recv (mp_obj_t self_in , mp_obj_t len_in ) {
686
- return _socket_recvfrom (self_in , len_in , NULL , NULL );
688
+ static mp_obj_t socket_recv (size_t n_args , const mp_obj_t * args ) {
689
+ return _socket_recvfrom (n_args , args , NULL , NULL );
687
690
}
688
- static MP_DEFINE_CONST_FUN_OBJ_2 (socket_recv_obj , socket_recv ) ;
691
+ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (socket_recv_obj , 2 , 3 , socket_recv ) ;
689
692
690
- static mp_obj_t socket_recvfrom (mp_obj_t self_in , mp_obj_t len_in ) {
693
+ static mp_obj_t socket_recvfrom (size_t n_args , const mp_obj_t * args ) {
691
694
struct sockaddr from ;
692
695
socklen_t fromlen = sizeof (from );
693
696
694
697
mp_obj_t tuple [2 ];
695
- tuple [0 ] = _socket_recvfrom (self_in , len_in , & from , & fromlen );
698
+ tuple [0 ] = _socket_recvfrom (n_args , args , & from , & fromlen );
696
699
697
700
uint8_t * ip = (uint8_t * )& ((struct sockaddr_in * )& from )-> sin_addr ;
698
701
mp_uint_t port = lwip_ntohs (((struct sockaddr_in * )& from )-> sin_port );
699
702
tuple [1 ] = netutils_format_inet_addr (ip , port , NETUTILS_BIG );
700
703
701
704
return mp_obj_new_tuple (2 , tuple );
702
705
}
703
- static MP_DEFINE_CONST_FUN_OBJ_2 (socket_recvfrom_obj , socket_recvfrom ) ;
706
+ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (socket_recvfrom_obj , 2 , 3 , socket_recvfrom ) ;
704
707
705
708
int _socket_send (socket_obj_t * sock , const char * data , size_t datalen ) {
706
709
int sentlen = 0 ;
@@ -789,7 +792,7 @@ static mp_obj_t socket_makefile(size_t n_args, const mp_obj_t *args) {
789
792
static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (socket_makefile_obj , 1 , 3 , socket_makefile ) ;
790
793
791
794
static mp_uint_t socket_stream_read (mp_obj_t self_in , void * buf , mp_uint_t size , int * errcode ) {
792
- return _socket_read_data (self_in , buf , size , NULL , NULL , errcode );
795
+ return _socket_read_data (self_in , buf , size , 0 , NULL , NULL , errcode );
793
796
}
794
797
795
798
static mp_uint_t socket_stream_write (mp_obj_t self_in , const void * buf , mp_uint_t size , int * errcode ) {
@@ -1010,6 +1013,8 @@ static const mp_rom_map_elem_t mp_module_socket_globals_table[] = {
1010
1013
{ MP_ROM_QSTR (MP_QSTR_SO_BINDTODEVICE ), MP_ROM_INT (SO_BINDTODEVICE ) },
1011
1014
{ MP_ROM_QSTR (MP_QSTR_IP_ADD_MEMBERSHIP ), MP_ROM_INT (IP_ADD_MEMBERSHIP ) },
1012
1015
{ MP_ROM_QSTR (MP_QSTR_TCP_NODELAY ), MP_ROM_INT (TCP_NODELAY ) },
1016
+ { MP_ROM_QSTR (MP_QSTR_MSG_PEEK ), MP_ROM_INT (MSG_PEEK ) },
1017
+ { MP_ROM_QSTR (MP_QSTR_MSG_DONTWAIT ), MP_ROM_INT (MSG_DONTWAIT ) },
1013
1018
};
1014
1019
1015
1020
static MP_DEFINE_CONST_DICT (mp_module_socket_globals , mp_module_socket_globals_table ) ;
0 commit comments