summaryrefslogtreecommitdiff
path: root/shared-bindings/socketpool
diff options
context:
space:
mode:
authorScott Shawcroft <scott@tannewt.org>2020-08-18 17:06:59 -0700
committerScott Shawcroft <scott@tannewt.org>2020-08-19 14:23:28 -0700
commiteb8b42aff1e887125dda56bafd2b52312c1c7e05 (patch)
tree24d71bd4243e32f5fe82e6cfb6e4a1c2514db2d5 /shared-bindings/socketpool
parent9602ee6265ff20f6e075753bbb105578f680d519 (diff)
Add basic error handling
Diffstat (limited to 'shared-bindings/socketpool')
-rw-r--r--shared-bindings/socketpool/Socket.c27
-rw-r--r--shared-bindings/socketpool/Socket.h2
-rw-r--r--shared-bindings/socketpool/SocketPool.c10
-rw-r--r--shared-bindings/socketpool/SocketPool.h2
4 files changed, 29 insertions, 12 deletions
diff --git a/shared-bindings/socketpool/Socket.c b/shared-bindings/socketpool/Socket.c
index 64a051301..ddead9507 100644
--- a/shared-bindings/socketpool/Socket.c
+++ b/shared-bindings/socketpool/Socket.c
@@ -57,7 +57,7 @@
//|
STATIC mp_obj_t socketpool_socket___exit__(size_t n_args, const mp_obj_t *args) {
(void)n_args;
- // common_hal_pulseio_pwmout_deinit(args[0]);
+ common_hal_socketpool_socket_close(args[0]);
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socketpool_socket___exit___obj, 4, 4, socketpool_socket___exit__);
@@ -197,15 +197,18 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(socketpool_socket_connect_obj, socketpool_socke
STATIC mp_obj_t socketpool_socket_send(mp_obj_t self_in, mp_obj_t buf_in) {
socketpool_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
- // if (self->nic == MP_OBJ_NULL) {
- // // not connected
- // mp_raise_OSError(MP_EPIPE);
- // }
+ if (common_hal_socketpool_socket_get_closed(self)) {
+ // Bad file number.
+ mp_raise_OSError(MP_EBADF);
+ }
+ if (!common_hal_socketpool_socket_get_connected(self)) {
+ mp_raise_BrokenPipeError();
+ }
mp_buffer_info_t bufinfo;
mp_get_buffer_raise(buf_in, &bufinfo, MP_BUFFER_READ);
mp_int_t ret = common_hal_socketpool_socket_send(self, bufinfo.buf, bufinfo.len);
if (ret == -1) {
- mp_raise_OSError(0);
+ mp_raise_BrokenPipeError();
}
return mp_obj_new_int_from_uint(ret);
}
@@ -241,10 +244,14 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(socketpool_socket_send_obj, socketpool_socket_s
STATIC mp_obj_t socketpool_socket_recv_into(size_t n_args, const mp_obj_t *args) {
socketpool_socket_obj_t *self = MP_OBJ_TO_PTR(args[0]);
- // if (self->nic == MP_OBJ_NULL) {
- // // not connected
- // mp_raise_OSError(MP_ENOTCONN);
- // }
+ if (common_hal_socketpool_socket_get_closed(self)) {
+ // Bad file number.
+ mp_raise_OSError(MP_EBADF);
+ }
+ if (!common_hal_socketpool_socket_get_connected(self)) {
+ // not connected
+ mp_raise_OSError(MP_ENOTCONN);
+ }
mp_buffer_info_t bufinfo;
mp_get_buffer_raise(args[1], &bufinfo, MP_BUFFER_WRITE);
mp_int_t len = bufinfo.len;
diff --git a/shared-bindings/socketpool/Socket.h b/shared-bindings/socketpool/Socket.h
index a1aeccbe3..4597aed38 100644
--- a/shared-bindings/socketpool/Socket.h
+++ b/shared-bindings/socketpool/Socket.h
@@ -36,5 +36,7 @@ bool common_hal_socketpool_socket_connect(socketpool_socket_obj_t* self, const c
mp_uint_t common_hal_socketpool_socket_send(socketpool_socket_obj_t* self, const uint8_t* buf, mp_uint_t len);
mp_uint_t common_hal_socketpool_socket_recv_into(socketpool_socket_obj_t* self, const uint8_t* buf, mp_uint_t len);
void common_hal_socketpool_socket_close(socketpool_socket_obj_t* self);
+bool common_hal_socketpool_socket_get_closed(socketpool_socket_obj_t* self);
+bool common_hal_socketpool_socket_get_connected(socketpool_socket_obj_t* self);
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_SOCKETPOOL_SOCKET_H
diff --git a/shared-bindings/socketpool/SocketPool.c b/shared-bindings/socketpool/SocketPool.c
index 2be071c78..f8812f61f 100644
--- a/shared-bindings/socketpool/SocketPool.c
+++ b/shared-bindings/socketpool/SocketPool.c
@@ -38,15 +38,21 @@
#include "shared-bindings/socketpool/SocketPool.h"
//| class SocketPool:
+//| """A pool of socket resources available for the given radio. Only one
+//| SocketPool can be created for each radio.
+//|
+//| SocketPool should be used in place of CPython's socket which provides
+//| a pool of sockets provided by the underlying OS."""
//|
STATIC mp_obj_t socketpool_socketpool_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) {
- mp_arg_check_num(n_args, kw_args, 0, 4, false);
+ mp_arg_check_num(n_args, kw_args, 1, 1, false);
socketpool_socketpool_obj_t *s = m_new_obj_with_finaliser(socketpool_socketpool_obj_t);
s->base.type = &socketpool_socketpool_type;
+ mp_obj_t radio = args[1];
- // common_hal_socketpool_socketpool_construct(s, );
+ common_hal_socketpool_socketpool_construct(s, radio);
return MP_OBJ_FROM_PTR(s);
}
diff --git a/shared-bindings/socketpool/SocketPool.h b/shared-bindings/socketpool/SocketPool.h
index 42bd88518..b007aad8f 100644
--- a/shared-bindings/socketpool/SocketPool.h
+++ b/shared-bindings/socketpool/SocketPool.h
@@ -44,6 +44,8 @@ typedef enum {
SOCKETPOOL_AF_INET6
} socketpool_socketpool_addressfamily_t;
+void common_hal_socketpool_socketpool_construct(socketpool_socketpool_obj_t* self, mp_obj_t radio);
+
socketpool_socket_obj_t* common_hal_socketpool_socket(socketpool_socketpool_obj_t* self,
socketpool_socketpool_addressfamily_t family, socketpool_socketpool_sock_t type);