diff options
| author | Scott Shawcroft <scott@tannewt.org> | 2020-08-18 17:06:59 -0700 |
|---|---|---|
| committer | Scott Shawcroft <scott@tannewt.org> | 2020-08-19 14:23:28 -0700 |
| commit | eb8b42aff1e887125dda56bafd2b52312c1c7e05 (patch) | |
| tree | 24d71bd4243e32f5fe82e6cfb6e4a1c2514db2d5 /shared-bindings/socketpool | |
| parent | 9602ee6265ff20f6e075753bbb105578f680d519 (diff) | |
Add basic error handling
Diffstat (limited to 'shared-bindings/socketpool')
| -rw-r--r-- | shared-bindings/socketpool/Socket.c | 27 | ||||
| -rw-r--r-- | shared-bindings/socketpool/Socket.h | 2 | ||||
| -rw-r--r-- | shared-bindings/socketpool/SocketPool.c | 10 | ||||
| -rw-r--r-- | shared-bindings/socketpool/SocketPool.h | 2 |
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); |
