Skip to content

Commit 88582e3

Browse files
committed
zephyr/modusocket: Implement bind() and connect().
1 parent b6c7e4b commit 88582e3

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed

zephyr/modusocket.c

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,24 @@ STATIC const mp_obj_type_t socket_type;
4444

4545
#define RAISE_ERRNO(x) { int _err = x; if (_err < 0) mp_raise_OSError(-_err); }
4646

47+
STATIC void socket_check_closed(socket_obj_t *socket) {
48+
if (socket->ctx == NULL) {
49+
// already closed
50+
mp_raise_OSError(EBADF);
51+
}
52+
}
53+
54+
STATIC void parse_inet_addr(socket_obj_t *socket, mp_obj_t addr_in, struct sockaddr *sockaddr) {
55+
// We employ the fact that port and address offsets are the same for IPv4 & IPv6
56+
struct sockaddr_in *sockaddr_in = (struct sockaddr_in*)sockaddr;
57+
58+
mp_obj_t *addr_items;
59+
mp_obj_get_array_fixed_n(addr_in, 2, &addr_items);
60+
sockaddr_in->sin_family = net_context_get_family(socket->ctx);
61+
RAISE_ERRNO(net_addr_pton(sockaddr_in->sin_family, mp_obj_str_get_str(addr_items[0]), &sockaddr_in->sin_addr));
62+
sockaddr_in->sin_port = htons(mp_obj_get_int(addr_items[1]));
63+
}
64+
4765
// Methods
4866

4967
STATIC void socket_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
@@ -88,6 +106,30 @@ STATIC mp_obj_t socket_make_new(const mp_obj_type_t *type, size_t n_args, size_t
88106
return socket;
89107
}
90108

109+
STATIC mp_obj_t socket_bind(mp_obj_t self_in, mp_obj_t addr_in) {
110+
socket_obj_t *socket = self_in;
111+
socket_check_closed(socket);
112+
113+
struct sockaddr sockaddr;
114+
parse_inet_addr(socket, addr_in, &sockaddr);
115+
116+
RAISE_ERRNO(net_context_bind(socket->ctx, &sockaddr, sizeof(sockaddr)));
117+
return mp_const_none;
118+
}
119+
STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_bind_obj, socket_bind);
120+
121+
STATIC mp_obj_t socket_connect(mp_obj_t self_in, mp_obj_t addr_in) {
122+
socket_obj_t *socket = self_in;
123+
socket_check_closed(socket);
124+
125+
struct sockaddr sockaddr;
126+
parse_inet_addr(socket, addr_in, &sockaddr);
127+
128+
RAISE_ERRNO(net_context_connect(socket->ctx, &sockaddr, sizeof(sockaddr), NULL, K_FOREVER, NULL));
129+
return mp_const_none;
130+
}
131+
STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_connect_obj, socket_connect);
132+
91133
STATIC mp_obj_t socket_close(mp_obj_t self_in) {
92134
socket_obj_t *socket = self_in;
93135
if (socket->ctx != NULL) {
@@ -101,6 +143,8 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(socket_close_obj, socket_close);
101143
STATIC const mp_map_elem_t socket_locals_dict_table[] = {
102144
{ MP_OBJ_NEW_QSTR(MP_QSTR___del__), (mp_obj_t)&socket_close_obj },
103145
{ MP_OBJ_NEW_QSTR(MP_QSTR_close), (mp_obj_t)&socket_close_obj },
146+
{ MP_OBJ_NEW_QSTR(MP_QSTR_bind), (mp_obj_t)&socket_bind_obj },
147+
{ MP_OBJ_NEW_QSTR(MP_QSTR_connect), (mp_obj_t)&socket_connect_obj },
104148
};
105149
STATIC MP_DEFINE_CONST_DICT(socket_locals_dict, socket_locals_dict_table);
106150

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy