Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save jepler/219145b531657e957d59b980b3b437ed to your computer and use it in GitHub Desktop.
Save jepler/219145b531657e957d59b980b3b437ed to your computer and use it in GitHub Desktop.
From d6a09c5ce976b4ada371d5ac14061b1a8a765a92 Mon Sep 17 00:00:00 2001
From: Jeff Epler <[email protected]>
Date: Tue, 20 Feb 2024 10:52:01 -0600
Subject: [PATCH] WIP (not working) implement socket.type
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.
---
ports/espressif/common-hal/socketpool/Socket.c | 4 ++++
.../raspberrypi/common-hal/socketpool/Socket.c | 4 ++++
shared-bindings/socketpool/Socket.c | 18 +++++++++++++++++-
shared-bindings/socketpool/Socket.h | 1 +
4 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/ports/espressif/common-hal/socketpool/Socket.c b/ports/espressif/common-hal/socketpool/Socket.c
index a291bf510b..942abbdb3a 100644
--- a/ports/espressif/common-hal/socketpool/Socket.c
+++ b/ports/espressif/common-hal/socketpool/Socket.c
@@ -602,6 +602,10 @@ void common_hal_socketpool_socket_settimeout(socketpool_socket_obj_t *self, uint
self->timeout_ms = timeout_ms;
}
+mp_int_t common_hal_socketpool_socket_get_type(socketpool_socket_obj_t *self) {
+ return self->type;
+}
+
int common_hal_socketpool_socket_setsockopt(socketpool_socket_obj_t *self, int level, int optname, const void *value, size_t optlen) {
int err = lwip_setsockopt(self->num, level, optname, value, optlen);
diff --git a/ports/raspberrypi/common-hal/socketpool/Socket.c b/ports/raspberrypi/common-hal/socketpool/Socket.c
index e97dfd21a0..2517135f5f 100644
--- a/ports/raspberrypi/common-hal/socketpool/Socket.c
+++ b/ports/raspberrypi/common-hal/socketpool/Socket.c
@@ -1183,6 +1183,10 @@ void common_hal_socketpool_socket_settimeout(socketpool_socket_obj_t *self, uint
self->timeout = timeout_ms;
}
+mp_int_t common_hal_socketpool_socket_get_type(socketpool_socket_obj_t *self) {
+ return self->type;
+}
+
int common_hal_socketpool_socket_setsockopt(socketpool_socket_obj_t *self, int level, int optname, const void *value, size_t optlen) {
if (level == SOCKETPOOL_IPPROTO_TCP && optname == SOCKETPOOL_TCP_NODELAY) {
int one = 1;
diff --git a/shared-bindings/socketpool/Socket.c b/shared-bindings/socketpool/Socket.c
index 669b4d71ed..1b524cd435 100644
--- a/shared-bindings/socketpool/Socket.c
+++ b/shared-bindings/socketpool/Socket.c
@@ -32,6 +32,7 @@
#include "py/mperrno.h"
#include "py/objlist.h"
+#include "py/objproperty.h"
#include "py/objtuple.h"
#include "py/runtime.h"
#include "py/stream.h"
@@ -383,7 +384,6 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socketpool_socket_setsockopt_obj, 4,
//| :param ~int value: timeout in seconds. 0 means non-blocking. None means block indefinitely.
//| """
//| ...
-//|
STATIC mp_obj_t socketpool_socket_settimeout(mp_obj_t self_in, mp_obj_t timeout_in) {
socketpool_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
mp_uint_t timeout_ms;
@@ -401,11 +401,27 @@ STATIC mp_obj_t socketpool_socket_settimeout(mp_obj_t self_in, mp_obj_t timeout_
}
STATIC MP_DEFINE_CONST_FUN_OBJ_2(socketpool_socket_settimeout_obj, socketpool_socket_settimeout);
+//| type: int
+//| """Read-only access to the socket type"""
+//|
+STATIC mp_obj_t socketpool_socket_obj_get_type(mp_obj_t self_in) {
+ socketpool_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ mp_printf(&mp_plat_print, "get type\n");
+ return MP_OBJ_NEW_SMALL_INT(common_hal_socketpool_socket_get_type(self));
+}
+MP_DEFINE_CONST_FUN_OBJ_1(socketpool_socket_get_type_obj, socketpool_socket_obj_get_type);
+
+MP_PROPERTY_GETTER(socketpool_socket_type_obj,
+ (mp_obj_t)&socketpool_socket_get_type_obj);
+
STATIC const mp_rom_map_elem_t socketpool_socket_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&default___enter___obj) },
{ MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&socketpool_socket___exit___obj) },
{ MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&socketpool_socket_close_obj) },
+ { MP_ROM_QSTR(MP_QSTR_type), MP_ROM_PTR(&socketpool_socket_type_obj) },
+ { MP_ROM_QSTR(MP_QSTR_get_type), MP_ROM_PTR(&socketpool_socket_get_type_obj) }, // TODO: delete me
+
{ MP_ROM_QSTR(MP_QSTR_accept), MP_ROM_PTR(&socketpool_socket_accept_obj) },
{ MP_ROM_QSTR(MP_QSTR_bind), MP_ROM_PTR(&socketpool_socket_bind_obj) },
{ MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&socketpool_socket_close_obj) },
diff --git a/shared-bindings/socketpool/Socket.h b/shared-bindings/socketpool/Socket.h
index 14022ea49e..ab54ea4a9c 100644
--- a/shared-bindings/socketpool/Socket.h
+++ b/shared-bindings/socketpool/Socket.h
@@ -38,6 +38,7 @@ void common_hal_socketpool_socket_connect(socketpool_socket_obj_t *self, const c
bool common_hal_socketpool_socket_get_closed(socketpool_socket_obj_t *self);
bool common_hal_socketpool_socket_get_connected(socketpool_socket_obj_t *self);
mp_uint_t common_hal_socketpool_socket_get_timeout(socketpool_socket_obj_t *self);
+mp_int_t common_hal_socketpool_socket_get_type(socketpool_socket_obj_t *self);
bool common_hal_socketpool_socket_listen(socketpool_socket_obj_t *self, int backlog);
mp_uint_t common_hal_socketpool_socket_recvfrom_into(socketpool_socket_obj_t *self,
uint8_t *buf, uint32_t len, uint8_t *ip, uint32_t *port);
--
2.39.2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment