Skip to content

Commit 3ba6165

Browse files
committed
unix/modsocket: Implement sockaddr() function to decode raw socket address.
Return tuple of (address_family, net_addr, [port, [extra_data]]). net_addr is still raw network address as bytes object, but suitable for passing to inet_ntop() function. At the very least, sockaddr() will separate address family value from binary socket address (and currently, only AF_INET family is decoded).
1 parent 2ae7ced commit 3ba6165

2 files changed

Lines changed: 26 additions & 1 deletion

File tree

unix/modsocket.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,11 +493,36 @@ STATIC mp_obj_t mod_socket_getaddrinfo(mp_uint_t n_args, const mp_obj_t *args) {
493493
}
494494
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_socket_getaddrinfo_obj, 2, 6, mod_socket_getaddrinfo);
495495

496+
STATIC mp_obj_t mod_socket_sockaddr(mp_obj_t sockaddr_in) {
497+
mp_buffer_info_t bufinfo;
498+
mp_get_buffer_raise(sockaddr_in, &bufinfo, MP_BUFFER_READ);
499+
switch (((struct sockaddr*)bufinfo.buf)->sa_family) {
500+
case AF_INET: {
501+
struct sockaddr_in *sa = (struct sockaddr_in*)bufinfo.buf;
502+
mp_obj_tuple_t *t = mp_obj_new_tuple(3, NULL);
503+
t->items[0] = MP_OBJ_NEW_SMALL_INT(AF_INET);
504+
t->items[1] = mp_obj_new_bytes((byte*)&sa->sin_addr, sizeof(sa->sin_addr));
505+
t->items[2] = MP_OBJ_NEW_SMALL_INT(ntohs(sa->sin_port));
506+
return t;
507+
}
508+
default: {
509+
struct sockaddr *sa = (struct sockaddr*)bufinfo.buf;
510+
mp_obj_tuple_t *t = mp_obj_new_tuple(2, NULL);
511+
t->items[0] = MP_OBJ_NEW_SMALL_INT(sa->sa_family);
512+
t->items[1] = mp_obj_new_bytes((byte*)sa->sa_data, bufinfo.len - offsetof(struct sockaddr, sa_data));
513+
return t;
514+
}
515+
}
516+
return mp_const_none;
517+
}
518+
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_socket_sockaddr_obj, mod_socket_sockaddr);
519+
496520
STATIC const mp_map_elem_t mp_module_socket_globals_table[] = {
497521
{ MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_usocket) },
498522
{ MP_OBJ_NEW_QSTR(MP_QSTR_socket), (mp_obj_t)&usocket_type },
499523
{ MP_OBJ_NEW_QSTR(MP_QSTR_getaddrinfo), (mp_obj_t)&mod_socket_getaddrinfo_obj },
500524
{ MP_OBJ_NEW_QSTR(MP_QSTR_inet_pton), (mp_obj_t)&mod_socket_inet_pton_obj },
525+
{ MP_OBJ_NEW_QSTR(MP_QSTR_sockaddr), (mp_obj_t)&mod_socket_sockaddr_obj },
501526
#if MICROPY_SOCKET_EXTRA
502527
{ MP_OBJ_NEW_QSTR(MP_QSTR_htons), (mp_obj_t)&mod_socket_htons_obj },
503528
{ MP_OBJ_NEW_QSTR(MP_QSTR_gethostbyname), (mp_obj_t)&mod_socket_gethostbyname_obj },

unix/qstrdefsport.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ Q(ticks_us)
7979
Q(ticks_diff)
8080

8181
Q(socket)
82-
Q(sockaddr_in)
82+
Q(sockaddr)
8383
Q(htons)
8484
Q(inet_pton)
8585
Q(gethostbyname)

0 commit comments

Comments
 (0)