@@ -171,6 +171,16 @@ mp_obj_t ip_to_tuple(byte *ip) {
171171 return mp_obj_new_tuple (4 , _ip_tuple);
172172}
173173
174+ void tuple_to_ip (mp_obj_t tuple_in, byte *ip) {
175+ if (mp_obj_is_exact_type (tuple_in, &mp_type_tuple)) {
176+ mp_obj_tuple_t *tuple = MP_OBJ_TO_PTR2 (tuple_in, mp_obj_tuple_t );
177+ ip[0 ] = mp_obj_get_int (tuple->items [0 ]);
178+ ip[1 ] = mp_obj_get_int (tuple->items [1 ]);
179+ ip[2 ] = mp_obj_get_int (tuple->items [2 ]);
180+ ip[3 ] = mp_obj_get_int (tuple->items [3 ]);
181+ }
182+ }
183+
174184int network_pint_socket_bind (mod_network_socket_obj_t *socket, byte *ip, mp_uint_t port, int *_errno) {
175185 debug_printf (" socket_bind(%d, %d)\n " , socket->fileno , port);
176186
@@ -307,6 +317,14 @@ mp_uint_t network_pint_socket_recvfrom(mod_network_socket_obj_t *socket, byte *b
307317 mp_obj_t result = call_method (nic->socket_recvfrom , 4 , (mp_obj_t )socket->_private , _buf, _ip, _port);
308318 if (result != mp_const_none) {
309319 *_errno = 0 ;
320+ if (mp_obj_is_exact_type (result, &mp_type_tuple)) {
321+ // Expect length, (0, 0, 0, 0), port
322+ mp_obj_tuple_t *tuple = MP_OBJ_TO_PTR2 (result, mp_obj_tuple_t );
323+ tuple_to_ip (tuple->items [1 ], ip);
324+ *port = mp_obj_get_int (tuple->items [2 ]);
325+ return mp_obj_get_int (tuple->items [0 ]);
326+ }
327+ // Just a length
310328 return mp_obj_get_int (result);
311329 }
312330
0 commit comments