Skip to content

Commit 4781cde

Browse files
projectgusdpgeorge
authored andcommitted
esp32/modsocket: Add optional flags argument for recv and recvfrom.
Implements MSG_PEEK and MSG_DONTWAIT (both passed through to LWIP sockets API). This work was funded through GitHub Sponsors. Signed-off-by: Angus Gratton <angus@redyak.com.au>
1 parent e844776 commit 4781cde

File tree

1 file changed

+18
-13
lines changed

1 file changed

+18
-13
lines changed

ports/esp32/modsocket.c

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -611,7 +611,7 @@ static MP_DEFINE_CONST_FUN_OBJ_2(socket_setblocking_obj, socket_setblocking);
611611
// XXX this can end up waiting a very long time if the content is dribbled in one character
612612
// at a time, as the timeout resets each time a recvfrom succeeds ... this is probably not
613613
// 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,
615615
struct sockaddr *from, socklen_t *from_len, int *errcode) {
616616
socket_obj_t *sock = MP_OBJ_TO_PTR(self_in);
617617

@@ -645,7 +645,7 @@ static mp_uint_t _socket_read_data(mp_obj_t self_in, void *buf, size_t size,
645645
if (release_gil) {
646646
MP_THREAD_GIL_EXIT();
647647
}
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);
649649
if (release_gil) {
650650
MP_THREAD_GIL_ENTER();
651651
}
@@ -655,7 +655,7 @@ static mp_uint_t _socket_read_data(mp_obj_t self_in, void *buf, size_t size,
655655
if (r >= 0) {
656656
return r;
657657
}
658-
if (errno != EWOULDBLOCK) {
658+
if (errno != EWOULDBLOCK || (flags & MSG_DONTWAIT)) {
659659
*errcode = errno;
660660
return MP_STREAM_ERROR;
661661
}
@@ -666,14 +666,17 @@ static mp_uint_t _socket_read_data(mp_obj_t self_in, void *buf, size_t size,
666666
return MP_STREAM_ERROR;
667667
}
668668

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,
670670
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+
672675
vstr_t vstr;
673676
vstr_init_len(&vstr, len);
674677

675678
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);
677680
if (ret == MP_STREAM_ERROR) {
678681
mp_raise_OSError(errcode);
679682
}
@@ -682,25 +685,25 @@ mp_obj_t _socket_recvfrom(mp_obj_t self_in, mp_obj_t len_in,
682685
return mp_obj_new_bytes_from_vstr(&vstr);
683686
}
684687

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);
687690
}
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);
689692

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) {
691694
struct sockaddr from;
692695
socklen_t fromlen = sizeof(from);
693696

694697
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);
696699

697700
uint8_t *ip = (uint8_t *)&((struct sockaddr_in *)&from)->sin_addr;
698701
mp_uint_t port = lwip_ntohs(((struct sockaddr_in *)&from)->sin_port);
699702
tuple[1] = netutils_format_inet_addr(ip, port, NETUTILS_BIG);
700703

701704
return mp_obj_new_tuple(2, tuple);
702705
}
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);
704707

705708
int _socket_send(socket_obj_t *sock, const char *data, size_t datalen) {
706709
int sentlen = 0;
@@ -789,7 +792,7 @@ static mp_obj_t socket_makefile(size_t n_args, const mp_obj_t *args) {
789792
static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socket_makefile_obj, 1, 3, socket_makefile);
790793

791794
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);
793796
}
794797

795798
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[] = {
10101013
{ MP_ROM_QSTR(MP_QSTR_SO_BINDTODEVICE), MP_ROM_INT(SO_BINDTODEVICE) },
10111014
{ MP_ROM_QSTR(MP_QSTR_IP_ADD_MEMBERSHIP), MP_ROM_INT(IP_ADD_MEMBERSHIP) },
10121015
{ 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) },
10131018
};
10141019

10151020
static MP_DEFINE_CONST_DICT(mp_module_socket_globals, mp_module_socket_globals_table);

0 commit comments

Comments
 (0)