Skip to content

Commit 0c1db5e

Browse files
committed
socketpool: add type property to Socket objects
cpython socket objects have a `type` property which gives their type as an integer (e.g., SOCK_STREAM). Add this for compatibility with standard Python. It's needed for ssl, which currently just grabs the value directly from an internal structure (naughty!)
1 parent 7e7918e commit 0c1db5e

File tree

4 files changed

+25
-2
lines changed

4 files changed

+25
-2
lines changed

ports/espressif/common-hal/socketpool/Socket.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,10 @@ void common_hal_socketpool_socket_settimeout(socketpool_socket_obj_t *self, uint
602602
self->timeout_ms = timeout_ms;
603603
}
604604

605+
mp_int_t common_hal_socketpool_socket_get_type(socketpool_socket_obj_t *self) {
606+
return self->type;
607+
}
608+
605609

606610
int common_hal_socketpool_socket_setsockopt(socketpool_socket_obj_t *self, int level, int optname, const void *value, size_t optlen) {
607611
int err = lwip_setsockopt(self->num, level, optname, value, optlen);

ports/raspberrypi/common-hal/socketpool/Socket.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1183,6 +1183,10 @@ void common_hal_socketpool_socket_settimeout(socketpool_socket_obj_t *self, uint
11831183
self->timeout = timeout_ms;
11841184
}
11851185

1186+
mp_int_t common_hal_socketpool_socket_get_type(socketpool_socket_obj_t *self) {
1187+
return self->type;
1188+
}
1189+
11861190
int common_hal_socketpool_socket_setsockopt(socketpool_socket_obj_t *self, int level, int optname, const void *value, size_t optlen) {
11871191
if (level == SOCKETPOOL_IPPROTO_TCP && optname == SOCKETPOOL_TCP_NODELAY) {
11881192
int one = 1;

shared-bindings/socketpool/Socket.c

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
#include "py/mperrno.h"
3434
#include "py/objlist.h"
35+
#include "py/objproperty.h"
3536
#include "py/objtuple.h"
3637
#include "py/runtime.h"
3738
#include "py/stream.h"
@@ -383,7 +384,6 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socketpool_socket_setsockopt_obj, 4,
383384
//| :param ~int value: timeout in seconds. 0 means non-blocking. None means block indefinitely.
384385
//| """
385386
//| ...
386-
//|
387387
STATIC mp_obj_t socketpool_socket_settimeout(mp_obj_t self_in, mp_obj_t timeout_in) {
388388
socketpool_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
389389
mp_uint_t timeout_ms;
@@ -401,11 +401,24 @@ STATIC mp_obj_t socketpool_socket_settimeout(mp_obj_t self_in, mp_obj_t timeout_
401401
}
402402
STATIC MP_DEFINE_CONST_FUN_OBJ_2(socketpool_socket_settimeout_obj, socketpool_socket_settimeout);
403403

404+
//| type: int
405+
//| """Read-only access to the socket type"""
406+
//|
407+
STATIC mp_obj_t socketpool_socket_obj_get_type(mp_obj_t self_in) {
408+
socketpool_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
409+
return MP_OBJ_NEW_SMALL_INT(common_hal_socketpool_socket_get_type(self));
410+
}
411+
MP_DEFINE_CONST_FUN_OBJ_1(socketpool_socket_get_type_obj, socketpool_socket_obj_get_type);
412+
413+
MP_PROPERTY_GETTER(socketpool_socket_type_obj,
414+
(mp_obj_t)&socketpool_socket_get_type_obj);
415+
404416
STATIC const mp_rom_map_elem_t socketpool_socket_locals_dict_table[] = {
405417
{ MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&default___enter___obj) },
406418
{ MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&socketpool_socket___exit___obj) },
407419
{ MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&socketpool_socket_close_obj) },
408420

421+
409422
{ MP_ROM_QSTR(MP_QSTR_accept), MP_ROM_PTR(&socketpool_socket_accept_obj) },
410423
{ MP_ROM_QSTR(MP_QSTR_bind), MP_ROM_PTR(&socketpool_socket_bind_obj) },
411424
{ MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&socketpool_socket_close_obj) },
@@ -419,6 +432,7 @@ STATIC const mp_rom_map_elem_t socketpool_socket_locals_dict_table[] = {
419432
{ MP_ROM_QSTR(MP_QSTR_setblocking), MP_ROM_PTR(&socketpool_socket_setblocking_obj) },
420433
{ MP_ROM_QSTR(MP_QSTR_setsockopt), MP_ROM_PTR(&socketpool_socket_setsockopt_obj) },
421434
{ MP_ROM_QSTR(MP_QSTR_settimeout), MP_ROM_PTR(&socketpool_socket_settimeout_obj) },
435+
{ MP_ROM_QSTR(MP_QSTR_type), MP_ROM_PTR(&socketpool_socket_type_obj) },
422436
};
423437

424438
STATIC MP_DEFINE_CONST_DICT(socketpool_socket_locals_dict, socketpool_socket_locals_dict_table);
@@ -472,7 +486,7 @@ STATIC const mp_stream_p_t socket_stream_p = {
472486
MP_DEFINE_CONST_OBJ_TYPE(
473487
socketpool_socket_type,
474488
MP_QSTR_Socket,
475-
MP_TYPE_FLAG_NONE,
489+
MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS,
476490
locals_dict, &socketpool_socket_locals_dict,
477491
protocol, &socket_stream_p
478492
);

shared-bindings/socketpool/Socket.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ void common_hal_socketpool_socket_connect(socketpool_socket_obj_t *self, const c
3838
bool common_hal_socketpool_socket_get_closed(socketpool_socket_obj_t *self);
3939
bool common_hal_socketpool_socket_get_connected(socketpool_socket_obj_t *self);
4040
mp_uint_t common_hal_socketpool_socket_get_timeout(socketpool_socket_obj_t *self);
41+
mp_int_t common_hal_socketpool_socket_get_type(socketpool_socket_obj_t *self);
4142
bool common_hal_socketpool_socket_listen(socketpool_socket_obj_t *self, int backlog);
4243
mp_uint_t common_hal_socketpool_socket_recvfrom_into(socketpool_socket_obj_t *self,
4344
uint8_t *buf, uint32_t len, uint8_t *ip, uint32_t *port);

0 commit comments

Comments
 (0)