@@ -533,12 +533,18 @@ typedef struct _getaddrinfo_state_t {
533533 mp_obj_t result ;
534534 struct k_sem sem ;
535535 mp_obj_t port ;
536+ int status ;
536537} getaddrinfo_state_t ;
537538
538539void dns_resolve_cb (enum dns_resolve_status status , struct dns_addrinfo * info , void * user_data ) {
539540 getaddrinfo_state_t * state = user_data ;
541+ DEBUG_printf ("dns status: %d\n" , status );
540542
541543 if (info == NULL ) {
544+ if (status == DNS_EAI_ALLDONE ) {
545+ status = 0 ;
546+ }
547+ state -> status = status ;
542548 k_sem_give (& state -> sem );
543549 return ;
544550 }
@@ -569,7 +575,6 @@ STATIC mp_obj_t mod_getaddrinfo(size_t n_args, const mp_obj_t *args) {
569575 state .result = mp_obj_new_list (0 , NULL );
570576 k_sem_init (& state .sem , 0 , UINT_MAX );
571577
572- int status ;
573578 for (int i = 2 ; i -- ;) {
574579 int type = (family != AF_INET6 ? DNS_QUERY_TYPE_A : DNS_QUERY_TYPE_AAAA );
575580 RAISE_ERRNO (dns_get_addr_info (host , type , NULL , dns_resolve_cb , & state , 3000 ));
@@ -580,6 +585,12 @@ STATIC mp_obj_t mod_getaddrinfo(size_t n_args, const mp_obj_t *args) {
580585 family = AF_INET6 ;
581586 }
582587
588+ // Raise error only if there's nothing to return, otherwise
589+ // it may be IPv4 vs IPv6 differences.
590+ if (state .status != 0 && mp_obj_len (state .result ) == 0 ) {
591+ mp_raise_OSError (state .status );
592+ }
593+
583594 return state .result ;
584595}
585596STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (mod_getaddrinfo_obj , 2 , 3 , mod_getaddrinfo );
0 commit comments